Version 0.5.14.0

svn merge -r 23474:23627 https://dart.googlecode.com/svn/branches/bleeding_edge trunk

git-svn-id: http://dart.googlecode.com/svn/trunk@23628 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/pkg/analyzer_experimental/bin/analyzer.dart b/pkg/analyzer_experimental/bin/analyzer.dart
index cf8018f..c9b83c8 100644
--- a/pkg/analyzer_experimental/bin/analyzer.dart
+++ b/pkg/analyzer_experimental/bin/analyzer.dart
@@ -38,6 +38,10 @@
 }
 
 ErrorSeverity _runAnalyzer(CommandLineOptions options) {
+  if (!options.machineFormat) {
+    stdout.writeln("Analyzing ${options.sourceFiles}...");
+  }
+  ErrorSeverity allResult = ErrorSeverity.NONE;
   for (String sourcePath in options.sourceFiles) {
     sourcePath = sourcePath.trim();
     // check that file exists
@@ -50,10 +54,8 @@
       print('$sourcePath is not a Dart file');
       return ErrorSeverity.ERROR;
     }
-    // start analysis
-    ErrorFormatter formatter = new ErrorFormatter(options.machineFormat ? stderr : stdout, options);
-    formatter.startAnalysis();
     // do analyze
+    ErrorFormatter formatter = new ErrorFormatter(options.machineFormat ? stderr : stdout, options);
     AnalyzerImpl analyzer = new AnalyzerImpl(options);
     analyzer.analyze(sourcePath);
     // pring errors
@@ -63,8 +65,9 @@
     if (status == ErrorSeverity.WARNING && options.warningsAreFatal) {
       status = ErrorSeverity.ERROR;
     }
-    return status;
+    allResult = allResult.max(status);
   }
+  return allResult;
 }
 
 typedef ErrorSeverity BatchRunnerHandler(List<String> args);
@@ -101,6 +104,8 @@
         args.addAll(lineArgs);
         args.remove('-b');
         args.remove('--batch');
+        // TODO(scheglov) https://code.google.com/p/dart/issues/detail?id=11061
+        args.remove('-batch');
       }
       // analyze single set of arguments
       try {
diff --git a/pkg/analyzer_experimental/lib/options.dart b/pkg/analyzer_experimental/lib/options.dart
index 9ada7ac4..8c26f43 100644
--- a/pkg/analyzer_experimental/lib/options.dart
+++ b/pkg/analyzer_experimental/lib/options.dart
@@ -110,6 +110,8 @@
           defaultsTo: false, negatable: false);
 
     try {
+      // TODO(scheglov) https://code.google.com/p/dart/issues/detail?id=11061
+      args = args.map((String arg) => arg == '-batch' ? '--batch' : arg).toList();
       var results = parser.parse(args);
       // help requests
       if (results['help']) {
@@ -118,16 +120,16 @@
       }
       // batch mode and input files
       if (results['batch']) {
-        if (results.rest.length != 0) {
+        if (results.rest.isNotEmpty) {
           print('No source files expected in the batch mode.');
           _showUsage(parser);
           exit(15);
         }
-      } if (results['version']) {
+      } else if (results['version']) {
         print('$_BINARY_NAME version ${_getVersion()}');
         exit(0);
       } else {
-        if (results.rest.length == 0) {
+        if (results.rest.isEmpty) {
           _showUsage(parser);
           exit(15);
         }
@@ -153,7 +155,6 @@
       Path path = new Path(new Options().script);
       Path versionPath = path.directoryPath.append('..').append('version');
       File versionFile = new File.fromPath(versionPath);
-      
       return versionFile.readAsStringSync().trim();
     } catch (_) {
       // This happens when the script is not running in the context of an SDK.
diff --git a/pkg/analyzer_experimental/lib/src/analyzer_impl.dart b/pkg/analyzer_experimental/lib/src/analyzer_impl.dart
index 84cfb8d..4e46d61 100644
--- a/pkg/analyzer_experimental/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer_experimental/lib/src/analyzer_impl.dart
@@ -17,10 +17,12 @@
 import 'generated/element.dart';
 import '../options.dart';
 
+
+DartSdk sdk;
+
 /// Analyzes single library [File].
 class AnalyzerImpl {
   final CommandLineOptions options;
-  DartSdk sdk;
 
   ContentCache contentCache = new ContentCache();
   SourceFactory sourceFactory;
@@ -33,7 +35,9 @@
   final List<AnalysisErrorInfo> errorInfos = new List<AnalysisErrorInfo>();
 
   AnalyzerImpl(CommandLineOptions this.options) {
-    sdk = new DirectoryBasedDartSdk(new JavaFile(options.dartSdkPath));
+    if (sdk == null) {
+      sdk = new DirectoryBasedDartSdk(new JavaFile(options.dartSdkPath));
+    }
   }
 
   /**
diff --git a/pkg/analyzer_experimental/lib/src/error_formatter.dart b/pkg/analyzer_experimental/lib/src/error_formatter.dart
index 34d0fb4..fb4b10f 100644
--- a/pkg/analyzer_experimental/lib/src/error_formatter.dart
+++ b/pkg/analyzer_experimental/lib/src/error_formatter.dart
@@ -27,12 +27,6 @@
 
   ErrorFormatter(this.out, this.options);
 
-  void startAnalysis() {
-    if (!options.machineFormat) {
-      out.writeln("Analyzing ${options.sourceFiles}...");
-    }
-  }
-
   void formatErrors(List<AnalysisErrorInfo> errorInfos) {
     var errors = new List<AnalysisError>();
     var errorToLine = new Map<AnalysisError, LineInfo>();
@@ -122,13 +116,14 @@
       out.write('|');
       out.write(length);
       out.write('|');
-      out.writeln(escapePipe(error.message));
+      out.write(escapePipe(error.message));
     } else {
       // [warning] 'foo' is not a... (/Users/.../tmp/foo.dart, line 1, col 2)
       out.write('[${severity.displayName}] ${error.message} ');
       out.write('(${source.fullName}');
       out.write(', line ${location.lineNumber}, col ${location.columnNumber})');
     }
+    out.writeln();
   }
 
   static String escapePipe(String input) {
diff --git a/pkg/analyzer_experimental/lib/src/generated/ast.dart b/pkg/analyzer_experimental/lib/src/generated/ast.dart
index 4b50d80..82647d4 100644
--- a/pkg/analyzer_experimental/lib/src/generated/ast.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/ast.dart
@@ -1,8 +1,6 @@
 // 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.ast;
-
 import 'dart:collection';
 import 'java_core.dart';
 import 'java_engine.dart';
@@ -12,40 +10,38 @@
 import 'engine.dart' show AnalysisEngine;
 import 'utilities_dart.dart';
 import 'element.dart' hide Annotation;
-
-
 /**
  * The abstract class {@code ASTNode} defines the behavior common to all nodes in the AST structure
  * for a Dart program.
  * @coverage dart.engine.ast
  */
 abstract class ASTNode {
-  
+
   /**
    * The parent of the node, or {@code null} if the node is the root of an AST structure.
    */
   ASTNode _parent;
-  
+
   /**
    * A table mapping the names of properties to their values, or {@code null} if this node does not
    * have any properties associated with it.
    */
   Map<String, Object> _propertyMap;
-  
+
   /**
    * A comparator that can be used to sort AST nodes in lexical order. In other words,{@code compare} will return a negative value if the offset of the first node is less than the
    * offset of the second node, zero (0) if the nodes have the same offset, and a positive value if
    * if the offset of the first node is greater than the offset of the second node.
    */
   static Comparator<ASTNode> LEXICAL_ORDER = (ASTNode first, ASTNode second) => second.offset - first.offset;
-  
+
   /**
    * 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(ASTVisitor visitor);
-  
+
   /**
    * @return the {@link ASTNode} of given {@link Class} which is {@link ASTNode} itself, or one of
    * its parents.
@@ -58,13 +54,13 @@
     ;
     return node as ASTNode;
   }
-  
+
   /**
    * Return the first token included in this node's source range.
    * @return the first token included in this node's source range
    */
   Token get beginToken;
-  
+
   /**
    * Return the offset of the character immediately following the last character of this node's
    * source range. This is equivalent to {@code node.getOffset() + node.getLength()}. For a
@@ -73,13 +69,13 @@
    * @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 included in this node's source range
    */
   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
@@ -92,7 +88,7 @@
     }
     return endToken2.offset + endToken2.length - beginToken2.offset;
   }
-  
+
   /**
    * Return the offset from the beginning of the file to the first character in the node's source
    * range.
@@ -106,7 +102,7 @@
     }
     return beginToken.offset;
   }
-  
+
   /**
    * Return this node's parent node, or {@code null} if this node is the root of an AST structure.
    * <p>
@@ -115,7 +111,7 @@
    * @return the parent of this node, or {@code null} if none
    */
   ASTNode get parent => _parent;
-  
+
   /**
    * Return the value of the property with the given name, or {@code null} if this node does not
    * have a property with the given name.
@@ -127,7 +123,7 @@
     }
     return _propertyMap[propertyName];
   }
-  
+
   /**
    * Return the node at the root of this node's AST structure. Note that this method's performance
    * is linear with respect to the depth of the node in the AST structure (O(depth)).
@@ -142,7 +138,7 @@
     }
     return root;
   }
-  
+
   /**
    * Return {@code true} if this node is a synthetic node. A synthetic node is a node that was
    * introduced by the parser in order to recover from an error in the code. Synthetic nodes always
@@ -150,7 +146,7 @@
    * @return {@code true} if this node is a synthetic node
    */
   bool isSynthetic() => false;
-  
+
   /**
    * Set the value of the property with the given name to the given value. If the value is{@code null}, the property will effectively be removed.
    * @param propertyName the name of the property whose value is to be set
@@ -171,7 +167,7 @@
       _propertyMap[propertyName] = propertyValue;
     }
   }
-  
+
   /**
    * Return a textual description of this node in a form approximating valid source. The returned
    * string will not be valid source primarily in the case where the node itself is not well-formed.
@@ -183,14 +179,14 @@
     return writer.toString();
   }
   String toString() => toSource();
-  
+
   /**
    * 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(ASTVisitor<Object> visitor);
-  
+
   /**
    * Make this node the parent of the given child node.
    * @param child the node that will become a child of this node
@@ -203,7 +199,7 @@
     }
     return child;
   }
-  
+
   /**
    * If the given child is not {@code null}, use the given visitor to visit it.
    * @param child the child to be visited
@@ -214,7 +210,7 @@
       child.accept(visitor);
     }
   }
-  
+
   /**
    * Set the parent of this node to the given node.
    * @param newParent the node that is to be made the parent of this node
@@ -225,7 +221,6 @@
   static int _hashCodeGenerator = 0;
   final int hashCode = ++_hashCodeGenerator;
 }
-
 /**
  * The interface {@code ASTVisitor} defines the behavior of objects that can be used to visit an AST
  * structure.
@@ -334,7 +329,6 @@
   R visitWhileStatement(WhileStatement node);
   R visitWithClause(WithClause node);
 }
-
 /**
  * Instances of the class {@code AdjacentStrings} represents two or more string literals that are
  * implicitly concatenated because of being adjacent (separated only by whitespace).
@@ -347,12 +341,12 @@
  * @coverage dart.engine.ast
  */
 class AdjacentStrings extends StringLiteral {
-  
+
   /**
    * The strings that are implicitly concatenated.
    */
   NodeList<StringLiteral> _strings;
-  
+
   /**
    * Initialize a newly created list of adjacent strings.
    * @param strings the strings that are implicitly concatenated
@@ -361,7 +355,7 @@
     this._strings = new NodeList<StringLiteral>(this);
     this._strings.addAll(strings);
   }
-  
+
   /**
    * Initialize a newly created list of adjacent strings.
    * @param strings the strings that are implicitly concatenated
@@ -370,7 +364,7 @@
   accept(ASTVisitor visitor) => visitor.visitAdjacentStrings(this);
   Token get beginToken => _strings.beginToken;
   Token get endToken => _strings.endToken;
-  
+
   /**
    * Return the strings that are implicitly concatenated.
    * @return the strings that are implicitly concatenated
@@ -385,25 +379,24 @@
     }
   }
 }
-
 /**
  * The abstract class {@code AnnotatedNode} defines the behavior of nodes that can be annotated with
  * both a comment and metadata.
  * @coverage dart.engine.ast
  */
 abstract class AnnotatedNode extends ASTNode {
-  
+
   /**
    * The documentation comment associated with this node, or {@code null} if this node does not have
    * a documentation comment associated with it.
    */
   Comment _comment;
-  
+
   /**
    * The annotations associated with this node.
    */
   NodeList<Annotation> _metadata;
-  
+
   /**
    * Initialize a newly created node.
    * @param comment the documentation comment associated with this node
@@ -414,7 +407,7 @@
     this._comment = becomeParentOf(comment);
     this._metadata.addAll(metadata);
   }
-  
+
   /**
    * Initialize a newly created node.
    * @param comment the documentation comment associated with this node
@@ -438,20 +431,20 @@
     }
     return metadataToken;
   }
-  
+
   /**
    * Return the documentation comment associated with this node, or {@code null} if this node does
    * not have a documentation comment associated with it.
    * @return the documentation comment associated with this node
    */
   Comment get documentationComment => _comment;
-  
+
   /**
    * Return the annotations associated with this node.
    * @return the annotations associated with this node
    */
   NodeList<Annotation> get metadata => _metadata;
-  
+
   /**
    * Set the documentation comment associated with this node to the given comment.
    * @param comment the documentation comment to be associated with this node
@@ -459,7 +452,7 @@
   void set documentationComment(Comment comment2) {
     this._comment = becomeParentOf(comment2);
   }
-  
+
   /**
    * Set the metadata associated with this node to the given metadata.
    * @param metadata the metadata to be associated with this node
@@ -478,13 +471,13 @@
       }
     }
   }
-  
+
   /**
    * Return the first token following the comment and metadata.
    * @return the first token following the comment and metadata
    */
   Token get firstTokenAfterCommentAndMetadata;
-  
+
   /**
    * Return {@code true} if the comment is lexically before any annotations.
    * @return {@code true} if the comment is lexically before any annotations
@@ -496,7 +489,7 @@
     Annotation firstAnnotation = _metadata[0];
     return _comment.offset < firstAnnotation.offset;
   }
-  
+
   /**
    * Return an array containing the comment and annotations associated with this node, sorted in
    * lexical order.
@@ -508,11 +501,10 @@
     childList.add(_comment);
     childList.addAll(_metadata);
     List<ASTNode> children = new List.from(childList);
-    children.sort();
+    children.sort(ASTNode.LEXICAL_ORDER);
     return children;
   }
 }
-
 /**
  * Instances of the class {@code Annotation} represent an annotation that can be associated with an
  * AST node.
@@ -525,36 +517,36 @@
  * @coverage dart.engine.ast
  */
 class Annotation extends ASTNode {
-  
+
   /**
    * The at sign that introduced the annotation.
    */
   Token _atSign;
-  
+
   /**
    * The name of the class defining the constructor that is being invoked or the name of the field
    * that is being referenced.
    */
   Identifier _name;
-  
+
   /**
    * The period before the constructor name, or {@code null} if this annotation is not the
    * invocation of a named constructor.
    */
   Token _period;
-  
+
   /**
    * The name of the constructor being invoked, or {@code null} if this annotation is not the
    * invocation of a named constructor.
    */
   SimpleIdentifier _constructorName;
-  
+
   /**
    * The arguments to the constructor being invoked, or {@code null} if this annotation is not the
    * invocation of a constructor.
    */
   ArgumentList _arguments;
-  
+
   /**
    * Initialize a newly created annotation.
    * @param atSign the at sign that introduced the annotation
@@ -574,7 +566,7 @@
     this._constructorName = becomeParentOf(constructorName);
     this._arguments = becomeParentOf(arguments);
   }
-  
+
   /**
    * Initialize a newly created annotation.
    * @param atSign the at sign that introduced the annotation
@@ -589,28 +581,28 @@
    */
   Annotation({Token atSign, Identifier name, Token period, SimpleIdentifier constructorName, ArgumentList arguments}) : this.full(atSign, name, period, constructorName, arguments);
   accept(ASTVisitor visitor) => visitor.visitAnnotation(this);
-  
+
   /**
    * Return the arguments to the constructor being invoked, or {@code null} if this annotation is
    * not the invocation of a constructor.
    * @return the arguments to the constructor being invoked
    */
   ArgumentList get arguments => _arguments;
-  
+
   /**
    * Return the at sign that introduced the annotation.
    * @return the at sign that introduced the annotation
    */
   Token get atSign => _atSign;
   Token get beginToken => _atSign;
-  
+
   /**
    * Return the name of the constructor being invoked, or {@code null} if this annotation is not the
    * invocation of a named constructor.
    * @return the name of the constructor being invoked
    */
   SimpleIdentifier get constructorName => _constructorName;
-  
+
   /**
    * Return the element associated with this annotation, or {@code null} if the AST structure has
    * not been resolved or if this annotation could not be resolved.
@@ -632,21 +624,21 @@
     }
     return _name.endToken;
   }
-  
+
   /**
    * Return the name of the class defining the constructor that is being invoked or the name of the
    * field that is being referenced.
    * @return the name of the constructor being invoked or the name of the field being referenced
    */
   Identifier get name => _name;
-  
+
   /**
    * Return the period before the constructor name, or {@code null} if this annotation is not the
    * invocation of a named constructor.
    * @return the period before the constructor name
    */
   Token get period => _period;
-  
+
   /**
    * Set the arguments to the constructor being invoked to the given arguments.
    * @param arguments the arguments to the constructor being invoked
@@ -654,7 +646,7 @@
   void set arguments(ArgumentList arguments2) {
     this._arguments = becomeParentOf(arguments2);
   }
-  
+
   /**
    * Set the at sign that introduced the annotation to the given token.
    * @param atSign the at sign that introduced the annotation
@@ -662,7 +654,7 @@
   void set atSign(Token atSign2) {
     this._atSign = atSign2;
   }
-  
+
   /**
    * Set the name of the constructor being invoked to the given name.
    * @param constructorName the name of the constructor being invoked
@@ -670,7 +662,7 @@
   void set constructorName(SimpleIdentifier constructorName2) {
     this._constructorName = becomeParentOf(constructorName2);
   }
-  
+
   /**
    * Set the name of the class defining the constructor that is being invoked or the name of the
    * field that is being referenced to the given name.
@@ -679,7 +671,7 @@
   void set name(Identifier name2) {
     this._name = becomeParentOf(name2);
   }
-  
+
   /**
    * Set the period before the constructor name to the given token.
    * @param period the period before the constructor name
@@ -693,7 +685,6 @@
     safelyVisitChild(_arguments, visitor);
   }
 }
-
 /**
  * Instances of the class {@code ArgumentDefinitionTest} represent an argument definition test.
  * <pre>
@@ -702,17 +693,17 @@
  * @coverage dart.engine.ast
  */
 class ArgumentDefinitionTest extends Expression {
-  
+
   /**
    * The token representing the question mark.
    */
   Token _question;
-  
+
   /**
    * The identifier representing the argument being tested.
    */
   SimpleIdentifier _identifier;
-  
+
   /**
    * Initialize a newly created argument definition test.
    * @param question the token representing the question mark
@@ -722,7 +713,7 @@
     this._question = question;
     this._identifier = becomeParentOf(identifier);
   }
-  
+
   /**
    * Initialize a newly created argument definition test.
    * @param question the token representing the question mark
@@ -732,19 +723,19 @@
   accept(ASTVisitor visitor) => visitor.visitArgumentDefinitionTest(this);
   Token get beginToken => _question;
   Token get endToken => _identifier.endToken;
-  
+
   /**
    * Return the identifier representing the argument being tested.
    * @return the identifier representing the argument being tested
    */
   SimpleIdentifier get identifier => _identifier;
-  
+
   /**
    * Return the token representing the question mark.
    * @return the token representing the question mark
    */
   Token get question => _question;
-  
+
   /**
    * Set the identifier representing the argument being tested to the given identifier.
    * @param identifier the identifier representing the argument being tested
@@ -752,7 +743,7 @@
   void set identifier(SimpleIdentifier identifier2) {
     this._identifier = becomeParentOf(identifier2);
   }
-  
+
   /**
    * Set the token representing the question mark to the given token.
    * @param question the token representing the question mark
@@ -764,7 +755,6 @@
     safelyVisitChild(_identifier, visitor);
   }
 }
-
 /**
  * Instances of the class {@code ArgumentList} represent a list of arguments in the invocation of a
  * executable element: a function, method, or constructor.
@@ -777,31 +767,40 @@
  * @coverage dart.engine.ast
  */
 class ArgumentList extends ASTNode {
-  
+
   /**
    * The left parenthesis.
    */
   Token _leftParenthesis;
-  
+
   /**
    * The expressions producing the values of the arguments.
    */
   NodeList<Expression> _arguments;
-  
+
   /**
    * The right parenthesis.
    */
   Token _rightParenthesis;
-  
+
   /**
    * An array containing the elements representing the parameters corresponding to each of the
    * arguments in this list, or {@code null} if the AST has not been resolved or if the function or
-   * method being invoked could not be determined. The array must be the same length as the number
-   * of arguments, but can contain {@code null} entries if a given argument does not correspond to a
-   * formal parameter.
+   * method being invoked could not be determined based on static type information. The array must
+   * be the same length as the number of arguments, but can contain {@code null} entries if a given
+   * argument does not correspond to a formal parameter.
    */
-  List<ParameterElement> _correspondingParameters;
-  
+  List<ParameterElement> _correspondingStaticParameters;
+
+  /**
+   * An array containing the elements representing the parameters corresponding to each of the
+   * arguments in this list, or {@code null} if the AST has not been resolved or if the function or
+   * method being invoked could not be determined based on propagated type information. The array
+   * must be the same length as the number of arguments, but can contain {@code null} entries if a
+   * given argument does not correspond to a formal parameter.
+   */
+  List<ParameterElement> _correspondingPropagatedParameters;
+
   /**
    * Initialize a newly created list of arguments.
    * @param leftParenthesis the left parenthesis
@@ -814,7 +813,7 @@
     this._arguments.addAll(arguments);
     this._rightParenthesis = rightParenthesis;
   }
-  
+
   /**
    * Initialize a newly created list of arguments.
    * @param leftParenthesis the left parenthesis
@@ -823,7 +822,7 @@
    */
   ArgumentList({Token leftParenthesis, List<Expression> arguments, Token rightParenthesis}) : this.full(leftParenthesis, arguments, rightParenthesis);
   accept(ASTVisitor visitor) => visitor.visitArgumentList(this);
-  
+
   /**
    * Return the expressions producing the values of the arguments. Although the language requires
    * that positional arguments appear before named arguments, this class allows them to be
@@ -833,19 +832,19 @@
   NodeList<Expression> get arguments => _arguments;
   Token get beginToken => _leftParenthesis;
   Token get endToken => _rightParenthesis;
-  
+
   /**
    * Return the left parenthesis.
    * @return the left parenthesis
    */
   Token get leftParenthesis => _leftParenthesis;
-  
+
   /**
    * Return the right parenthesis.
    * @return the right parenthesis
    */
   Token get rightParenthesis => _rightParenthesis;
-  
+
   /**
    * Set the parameter elements corresponding to each of the arguments in this list to the given
    * array of parameters. The array of parameters must be the same length as the number of
@@ -857,9 +856,23 @@
     if (parameters.length != _arguments.length) {
       throw new IllegalArgumentException("Expected ${_arguments.length} parameters, not ${parameters.length}");
     }
-    _correspondingParameters = parameters;
+    _correspondingPropagatedParameters = parameters;
   }
-  
+
+  /**
+   * Set the parameter elements corresponding to each of the arguments in this list to the given
+   * array of parameters. The array of parameters must be the same length as the number of
+   * arguments, but can contain {@code null} entries if a given argument does not correspond to a
+   * formal parameter.
+   * @param parameters the parameter elements corresponding to the arguments
+   */
+  void set correspondingStaticParameters(List<ParameterElement> parameters) {
+    if (parameters.length != _arguments.length) {
+      throw new IllegalArgumentException("Expected ${_arguments.length} parameters, not ${parameters.length}");
+    }
+    _correspondingStaticParameters = parameters;
+  }
+
   /**
    * Set the left parenthesis to the given token.
    * @param parenthesis the left parenthesis
@@ -867,7 +880,7 @@
   void set leftParenthesis(Token parenthesis) {
     _leftParenthesis = parenthesis;
   }
-  
+
   /**
    * Set the right parenthesis to the given token.
    * @param parenthesis the right parenthesis
@@ -878,30 +891,53 @@
   void visitChildren(ASTVisitor<Object> visitor) {
     _arguments.accept(visitor);
   }
-  
+
   /**
    * If the given expression is a child of this list, and the AST structure has been resolved, and
-   * the function being invoked is known, and the expression corresponds to one of the parameters of
-   * the function being invoked, then return the parameter element representing the parameter to
-   * which the value of the given expression will be bound. Otherwise, return {@code null}.
+   * the function being invoked is known based on propagated type information, and the expression
+   * corresponds to one of the parameters of the function being invoked, then return the parameter
+   * element representing the parameter to which the value of the given expression will be bound.
+   * Otherwise, return {@code null}.
    * <p>
    * This method is only intended to be used by {@link Expression#getParameterElement()}.
    * @param expression the expression corresponding to the parameter to be returned
    * @return the parameter element representing the parameter to which the value of the expression
    * will be bound
    */
-  ParameterElement getParameterElementFor(Expression expression) {
-    if (_correspondingParameters == null) {
+  ParameterElement getPropagatedParameterElementFor(Expression expression) {
+    if (_correspondingPropagatedParameters == null) {
       return null;
     }
     int index = _arguments.indexOf(expression);
     if (index < 0) {
       return null;
     }
-    return _correspondingParameters[index];
+    return _correspondingPropagatedParameters[index];
+  }
+
+  /**
+   * If the given expression is a child of this list, and the AST structure has been resolved, and
+   * the function being invoked is known based on static type information, and the expression
+   * corresponds to one of the parameters of the function being invoked, then return the parameter
+   * element representing the parameter to which the value of the given expression will be bound.
+   * Otherwise, return {@code null}.
+   * <p>
+   * This method is only intended to be used by {@link Expression#getStaticParameterElement()}.
+   * @param expression the expression corresponding to the parameter to be returned
+   * @return the parameter element representing the parameter to which the value of the expression
+   * will be bound
+   */
+  ParameterElement getStaticParameterElementFor(Expression expression) {
+    if (_correspondingStaticParameters == null) {
+      return null;
+    }
+    int index = _arguments.indexOf(expression);
+    if (index < 0) {
+      return null;
+    }
+    return _correspondingStaticParameters[index];
   }
 }
-
 /**
  * Instances of the class {@code AsExpression} represent an 'as' expression.
  * <pre>
@@ -909,22 +945,22 @@
  * @coverage dart.engine.ast
  */
 class AsExpression extends Expression {
-  
+
   /**
    * The expression used to compute the value being cast.
    */
   Expression _expression;
-  
+
   /**
    * The as operator.
    */
   Token _asOperator;
-  
+
   /**
    * The name of the type being cast to.
    */
   TypeName _type;
-  
+
   /**
    * Initialize a newly created as expression.
    * @param expression the expression used to compute the value being cast
@@ -936,7 +972,7 @@
     this._asOperator = isOperator;
     this._type = becomeParentOf(type);
   }
-  
+
   /**
    * Initialize a newly created as expression.
    * @param expression the expression used to compute the value being cast
@@ -945,7 +981,7 @@
    */
   AsExpression({Expression expression, Token isOperator, TypeName type}) : this.full(expression, isOperator, type);
   accept(ASTVisitor visitor) => visitor.visitAsExpression(this);
-  
+
   /**
    * Return the is operator being applied.
    * @return the is operator being applied
@@ -953,19 +989,19 @@
   Token get asOperator => _asOperator;
   Token get beginToken => _expression.beginToken;
   Token get endToken => _type.endToken;
-  
+
   /**
    * Return the expression used to compute the value being cast.
    * @return the expression used to compute the value being cast
    */
   Expression get expression => _expression;
-  
+
   /**
    * Return the name of the type being cast to.
    * @return the name of the type being cast to
    */
   TypeName get type => _type;
-  
+
   /**
    * Set the is operator being applied to the given operator.
    * @param asOperator the is operator being applied
@@ -973,7 +1009,7 @@
   void set asOperator(Token asOperator2) {
     this._asOperator = asOperator2;
   }
-  
+
   /**
    * Set the expression used to compute the value being cast to the given expression.
    * @param expression the expression used to compute the value being cast
@@ -981,7 +1017,7 @@
   void set expression(Expression expression2) {
     this._expression = becomeParentOf(expression2);
   }
-  
+
   /**
    * Set the name of the type being cast to to the given name.
    * @param name the name of the type being cast to
@@ -994,7 +1030,6 @@
     safelyVisitChild(_type, visitor);
   }
 }
-
 /**
  * Instances of the class {@code AssertStatement} represent an assert statement.
  * <pre>
@@ -1004,32 +1039,32 @@
  * @coverage dart.engine.ast
  */
 class AssertStatement extends Statement {
-  
+
   /**
    * The token representing the 'assert' keyword.
    */
   Token _keyword;
-  
+
   /**
    * The left parenthesis.
    */
   Token _leftParenthesis;
-  
+
   /**
    * The condition that is being asserted to be {@code true}.
    */
   Expression _condition;
-  
+
   /**
    * The right parenthesis.
    */
   Token _rightParenthesis;
-  
+
   /**
    * The semicolon terminating the statement.
    */
   Token _semicolon;
-  
+
   /**
    * Initialize a newly created assert statement.
    * @param keyword the token representing the 'assert' keyword
@@ -1045,7 +1080,7 @@
     this._rightParenthesis = rightParenthesis;
     this._semicolon = semicolon;
   }
-  
+
   /**
    * Initialize a newly created assert statement.
    * @param keyword the token representing the 'assert' keyword
@@ -1057,38 +1092,38 @@
   AssertStatement({Token keyword, Token leftParenthesis, Expression condition, Token rightParenthesis, Token semicolon}) : this.full(keyword, leftParenthesis, condition, rightParenthesis, semicolon);
   accept(ASTVisitor visitor) => visitor.visitAssertStatement(this);
   Token get beginToken => _keyword;
-  
+
   /**
    * Return the condition that is being asserted to be {@code true}.
    * @return the condition that is being asserted to be {@code true}
    */
   Expression get condition => _condition;
   Token get endToken => _semicolon;
-  
+
   /**
    * Return the token representing the 'assert' keyword.
    * @return the token representing the 'assert' keyword
    */
   Token get keyword => _keyword;
-  
+
   /**
    * Return the left parenthesis.
    * @return the left parenthesis
    */
   Token get leftParenthesis => _leftParenthesis;
-  
+
   /**
    * Return the right parenthesis.
    * @return the right parenthesis
    */
   Token get rightParenthesis => _rightParenthesis;
-  
+
   /**
    * Return the semicolon terminating the statement.
    * @return the semicolon terminating the statement
    */
   Token get semicolon => _semicolon;
-  
+
   /**
    * Set the condition that is being asserted to be {@code true} to the given expression.
    * @param the condition that is being asserted to be {@code true}
@@ -1096,7 +1131,7 @@
   void set condition(Expression condition2) {
     this._condition = becomeParentOf(condition2);
   }
-  
+
   /**
    * Set the token representing the 'assert' keyword to the given token.
    * @param keyword the token representing the 'assert' keyword
@@ -1104,7 +1139,7 @@
   void set keyword(Token keyword2) {
     this._keyword = keyword2;
   }
-  
+
   /**
    * Set the left parenthesis to the given token.
    * @param the left parenthesis
@@ -1112,7 +1147,7 @@
   void set leftParenthesis(Token leftParenthesis2) {
     this._leftParenthesis = leftParenthesis2;
   }
-  
+
   /**
    * Set the right parenthesis to the given token.
    * @param rightParenthesis the right parenthesis
@@ -1120,7 +1155,7 @@
   void set rightParenthesis(Token rightParenthesis2) {
     this._rightParenthesis = rightParenthesis2;
   }
-  
+
   /**
    * Set the semicolon terminating the statement to the given token.
    * @param semicolon the semicolon terminating the statement
@@ -1132,7 +1167,6 @@
     safelyVisitChild(_condition, visitor);
   }
 }
-
 /**
  * Instances of the class {@code AssignmentExpression} represent an assignment expression.
  * <pre>
@@ -1140,34 +1174,34 @@
  * @coverage dart.engine.ast
  */
 class AssignmentExpression extends Expression {
-  
+
   /**
    * The expression used to compute the left hand side.
    */
   Expression _leftHandSide;
-  
+
   /**
    * The assignment operator being applied.
    */
   Token _operator;
-  
+
   /**
    * The expression used to compute the right hand side.
    */
   Expression _rightHandSide;
-  
+
   /**
    * The element associated with the operator based on the static type of the left-hand-side, or{@code null} if the AST structure has not been resolved, if the operator is not a compound
    * operator, or if the operator could not be resolved.
    */
   MethodElement _staticElement;
-  
+
   /**
    * The element associated with the operator based on the propagated type of the left-hand-side, or{@code null} if the AST structure has not been resolved, if the operator is not a compound
    * operator, or if the operator could not be resolved.
    */
   MethodElement _propagatedElement;
-  
+
   /**
    * Initialize a newly created assignment expression.
    * @param leftHandSide the expression used to compute the left hand side
@@ -1179,7 +1213,7 @@
     this._operator = operator;
     this._rightHandSide = becomeParentOf(rightHandSide);
   }
-  
+
   /**
    * Initialize a newly created assignment expression.
    * @param leftHandSide the expression used to compute the left hand side
@@ -1189,7 +1223,7 @@
   AssignmentExpression({Expression leftHandSide, Token operator, Expression rightHandSide}) : this.full(leftHandSide, operator, rightHandSide);
   accept(ASTVisitor visitor) => visitor.visitAssignmentExpression(this);
   Token get beginToken => _leftHandSide.beginToken;
-  
+
   /**
    * Return the element associated with the operator based on the propagated type of the
    * left-hand-side, or {@code null} if the AST structure has not been resolved, if the operator is
@@ -1199,25 +1233,25 @@
    */
   MethodElement get element => _propagatedElement;
   Token get endToken => _rightHandSide.endToken;
-  
+
   /**
    * Set the expression used to compute the left hand side to the given expression.
    * @return the expression used to compute the left hand side
    */
   Expression get leftHandSide => _leftHandSide;
-  
+
   /**
    * Return the assignment operator being applied.
    * @return the assignment operator being applied
    */
   Token get operator => _operator;
-  
+
   /**
    * Return the expression used to compute the right hand side.
    * @return the expression used to compute the right hand side
    */
   Expression get rightHandSide => _rightHandSide;
-  
+
   /**
    * Return the element associated with the operator based on the static type of the left-hand-side,
    * or {@code null} if the AST structure has not been resolved, if the operator is not a compound
@@ -1226,7 +1260,7 @@
    * @return the element associated with the operator
    */
   MethodElement get staticElement => _staticElement;
-  
+
   /**
    * Set the element associated with the operator based on the propagated type of the left-hand-side
    * to the given element.
@@ -1235,7 +1269,7 @@
   void set element(MethodElement element2) {
     _propagatedElement = element2;
   }
-  
+
   /**
    * Return the expression used to compute the left hand side.
    * @param expression the expression used to compute the left hand side
@@ -1243,7 +1277,7 @@
   void set leftHandSide(Expression expression) {
     _leftHandSide = becomeParentOf(expression);
   }
-  
+
   /**
    * Set the assignment operator being applied to the given operator.
    * @param operator the assignment operator being applied
@@ -1251,7 +1285,7 @@
   void set operator(Token operator2) {
     this._operator = operator2;
   }
-  
+
   /**
    * Set the expression used to compute the left hand side to the given expression.
    * @param expression the expression used to compute the left hand side
@@ -1259,7 +1293,7 @@
   void set rightHandSide(Expression expression) {
     _rightHandSide = becomeParentOf(expression);
   }
-  
+
   /**
    * Set the element associated with the operator based on the static type of the left-hand-side to
    * the given element.
@@ -1273,7 +1307,6 @@
     safelyVisitChild(_rightHandSide, visitor);
   }
 }
-
 /**
  * Instances of the class {@code BinaryExpression} represent a binary (infix) expression.
  * <pre>
@@ -1281,34 +1314,34 @@
  * @coverage dart.engine.ast
  */
 class BinaryExpression extends Expression {
-  
+
   /**
    * The expression used to compute the left operand.
    */
   Expression _leftOperand;
-  
+
   /**
    * The binary operator being applied.
    */
   Token _operator;
-  
+
   /**
    * The expression used to compute the right operand.
    */
   Expression _rightOperand;
-  
+
   /**
    * The element associated with the operator based on the static type of the left operand, or{@code null} if the AST structure has not been resolved, if the operator is not user definable,
    * or if the operator could not be resolved.
    */
   MethodElement _staticElement;
-  
+
   /**
    * The element associated with the operator based on the propagated type of the left operand, or{@code null} if the AST structure has not been resolved, if the operator is not user definable,
    * or if the operator could not be resolved.
    */
   MethodElement _propagatedElement;
-  
+
   /**
    * Initialize a newly created binary expression.
    * @param leftOperand the expression used to compute the left operand
@@ -1320,7 +1353,7 @@
     this._operator = operator;
     this._rightOperand = becomeParentOf(rightOperand);
   }
-  
+
   /**
    * Initialize a newly created binary expression.
    * @param leftOperand the expression used to compute the left operand
@@ -1330,7 +1363,7 @@
   BinaryExpression({Expression leftOperand, Token operator, Expression rightOperand}) : this.full(leftOperand, operator, rightOperand);
   accept(ASTVisitor visitor) => visitor.visitBinaryExpression(this);
   Token get beginToken => _leftOperand.beginToken;
-  
+
   /**
    * Return the element associated with the operator based on the propagated type of the left
    * operand, or {@code null} if the AST structure has not been resolved, if the operator is not
@@ -1340,25 +1373,25 @@
    */
   MethodElement get element => _propagatedElement;
   Token get endToken => _rightOperand.endToken;
-  
+
   /**
    * Return the expression used to compute the left operand.
    * @return the expression used to compute the left operand
    */
   Expression get leftOperand => _leftOperand;
-  
+
   /**
    * Return the binary operator being applied.
    * @return the binary operator being applied
    */
   Token get operator => _operator;
-  
+
   /**
    * Return the expression used to compute the right operand.
    * @return the expression used to compute the right operand
    */
   Expression get rightOperand => _rightOperand;
-  
+
   /**
    * Return the element associated with the operator based on the static type of the left operand,
    * or {@code null} if the AST structure has not been resolved, if the operator is not user
@@ -1367,7 +1400,7 @@
    * @return the element associated with the operator
    */
   MethodElement get staticElement => _staticElement;
-  
+
   /**
    * Set the element associated with the operator based on the propagated type of the left operand
    * to the given element.
@@ -1376,7 +1409,7 @@
   void set element(MethodElement element2) {
     _propagatedElement = element2;
   }
-  
+
   /**
    * Set the expression used to compute the left operand to the given expression.
    * @param expression the expression used to compute the left operand
@@ -1384,7 +1417,7 @@
   void set leftOperand(Expression expression) {
     _leftOperand = becomeParentOf(expression);
   }
-  
+
   /**
    * Set the binary operator being applied to the given operator.
    * @return the binary operator being applied
@@ -1392,7 +1425,7 @@
   void set operator(Token operator2) {
     this._operator = operator2;
   }
-  
+
   /**
    * Set the expression used to compute the right operand to the given expression.
    * @param expression the expression used to compute the right operand
@@ -1400,7 +1433,7 @@
   void set rightOperand(Expression expression) {
     _rightOperand = becomeParentOf(expression);
   }
-  
+
   /**
    * Set the element associated with the operator based on the static type of the left operand to
    * the given element.
@@ -1413,16 +1446,17 @@
     safelyVisitChild(_leftOperand, visitor);
     safelyVisitChild(_rightOperand, visitor);
   }
-  
+
   /**
-   * Return the parameter element representing the parameter to which the value of the right operand
-   * will be bound. May be {@code null}.
+   * If the AST structure has been resolved, and the function being invoked is known based on
+   * propagated type information, then return the parameter element representing the parameter to
+   * which the value of the right operand will be bound. Otherwise, return {@code null}.
    * <p>
    * This method is only intended to be used by {@link Expression#getParameterElement()}.
    * @return the parameter element representing the parameter to which the value of the right
    * operand will be bound
    */
-  ParameterElement get parameterElementForRightOperand {
+  ParameterElement get propagatedParameterElementForRightOperand {
     if (_propagatedElement == null) {
       return null;
     }
@@ -1432,8 +1466,27 @@
     }
     return parameters2[0];
   }
-}
 
+  /**
+   * If the AST structure has been resolved, and the function being invoked is known based on static
+   * type information, then return the parameter element representing the parameter to which the
+   * value of the right operand will be bound. Otherwise, return {@code null}.
+   * <p>
+   * This method is only intended to be used by {@link Expression#getStaticParameterElement()}.
+   * @return the parameter element representing the parameter to which the value of the right
+   * operand will be bound
+   */
+  ParameterElement get staticParameterElementForRightOperand {
+    if (_staticElement == null) {
+      return null;
+    }
+    List<ParameterElement> parameters2 = _staticElement.parameters;
+    if (parameters2.length < 1) {
+      return null;
+    }
+    return parameters2[0];
+  }
+}
 /**
  * Instances of the class {@code Block} represent a sequence of statements.
  * <pre>
@@ -1443,22 +1496,22 @@
  * @coverage dart.engine.ast
  */
 class Block extends Statement {
-  
+
   /**
    * The left curly bracket.
    */
   Token _leftBracket;
-  
+
   /**
    * The statements contained in the block.
    */
   NodeList<Statement> _statements;
-  
+
   /**
    * The right curly bracket.
    */
   Token _rightBracket;
-  
+
   /**
    * Initialize a newly created block of code.
    * @param leftBracket the left curly bracket
@@ -1471,7 +1524,7 @@
     this._statements.addAll(statements);
     this._rightBracket = rightBracket;
   }
-  
+
   /**
    * Initialize a newly created block of code.
    * @param leftBracket the left curly bracket
@@ -1482,25 +1535,25 @@
   accept(ASTVisitor visitor) => visitor.visitBlock(this);
   Token get beginToken => _leftBracket;
   Token get endToken => _rightBracket;
-  
+
   /**
    * Return the left curly bracket.
    * @return the left curly bracket
    */
   Token get leftBracket => _leftBracket;
-  
+
   /**
    * Return the right curly bracket.
    * @return the right curly bracket
    */
   Token get rightBracket => _rightBracket;
-  
+
   /**
    * Return the statements contained in the block.
    * @return the statements contained in the block
    */
   NodeList<Statement> get statements => _statements;
-  
+
   /**
    * Set the left curly bracket to the given token.
    * @param leftBracket the left curly bracket
@@ -1508,7 +1561,7 @@
   void set leftBracket(Token leftBracket2) {
     this._leftBracket = leftBracket2;
   }
-  
+
   /**
    * Set the right curly bracket to the given token.
    * @param rightBracket the right curly bracket
@@ -1520,7 +1573,6 @@
     _statements.accept(visitor);
   }
 }
-
 /**
  * Instances of the class {@code BlockFunctionBody} represent a function body that consists of a
  * block of statements.
@@ -1529,12 +1581,12 @@
  * @coverage dart.engine.ast
  */
 class BlockFunctionBody extends FunctionBody {
-  
+
   /**
    * The block representing the body of the function.
    */
   Block _block;
-  
+
   /**
    * Initialize a newly created function body consisting of a block of statements.
    * @param block the block representing the body of the function
@@ -1542,7 +1594,7 @@
   BlockFunctionBody.full(Block block) {
     this._block = becomeParentOf(block);
   }
-  
+
   /**
    * Initialize a newly created function body consisting of a block of statements.
    * @param block the block representing the body of the function
@@ -1550,14 +1602,14 @@
   BlockFunctionBody({Block block}) : this.full(block);
   accept(ASTVisitor visitor) => visitor.visitBlockFunctionBody(this);
   Token get beginToken => _block.beginToken;
-  
+
   /**
    * Return the block representing the body of the function.
    * @return the block representing the body of the function
    */
   Block get block => _block;
   Token get endToken => _block.endToken;
-  
+
   /**
    * Set the block representing the body of the function to the given block.
    * @param block the block representing the body of the function
@@ -1569,7 +1621,6 @@
     safelyVisitChild(_block, visitor);
   }
 }
-
 /**
  * Instances of the class {@code BooleanLiteral} represent a boolean literal expression.
  * <pre>
@@ -1579,17 +1630,17 @@
  * @coverage dart.engine.ast
  */
 class BooleanLiteral extends Literal {
-  
+
   /**
    * The token representing the literal.
    */
   Token _literal;
-  
+
   /**
    * The value of the literal.
    */
   bool _value = false;
-  
+
   /**
    * Initialize a newly created boolean literal.
    * @param literal the token representing the literal
@@ -1599,7 +1650,7 @@
     this._literal = literal;
     this._value = value;
   }
-  
+
   /**
    * Initialize a newly created boolean literal.
    * @param literal the token representing the literal
@@ -1609,20 +1660,20 @@
   accept(ASTVisitor visitor) => visitor.visitBooleanLiteral(this);
   Token get beginToken => _literal;
   Token get endToken => _literal;
-  
+
   /**
    * Return the token representing the literal.
    * @return the token representing the literal
    */
   Token get literal => _literal;
-  
+
   /**
    * Return the value of the literal.
    * @return the value of the literal
    */
   bool get value => _value;
   bool isSynthetic() => _literal.isSynthetic();
-  
+
   /**
    * Set the token representing the literal to the given token.
    * @param literal the token representing the literal
@@ -1630,7 +1681,7 @@
   void set literal(Token literal2) {
     this._literal = literal2;
   }
-  
+
   /**
    * Set the value of the literal to the given value.
    * @param value the value of the literal
@@ -1641,7 +1692,6 @@
   void visitChildren(ASTVisitor<Object> visitor) {
   }
 }
-
 /**
  * Instances of the class {@code BreakStatement} represent a break statement.
  * <pre>
@@ -1651,22 +1701,22 @@
  * @coverage dart.engine.ast
  */
 class BreakStatement extends Statement {
-  
+
   /**
    * The token representing the 'break' keyword.
    */
   Token _keyword;
-  
+
   /**
    * The label associated with the statement, or {@code null} if there is no label.
    */
   SimpleIdentifier _label;
-  
+
   /**
    * The semicolon terminating the statement.
    */
   Token _semicolon;
-  
+
   /**
    * Initialize a newly created break statement.
    * @param keyword the token representing the 'break' keyword
@@ -1678,7 +1728,7 @@
     this._label = becomeParentOf(label);
     this._semicolon = semicolon;
   }
-  
+
   /**
    * Initialize a newly created break statement.
    * @param keyword the token representing the 'break' keyword
@@ -1689,25 +1739,25 @@
   accept(ASTVisitor visitor) => visitor.visitBreakStatement(this);
   Token get beginToken => _keyword;
   Token get endToken => _semicolon;
-  
+
   /**
    * Return the token representing the 'break' keyword.
    * @return the token representing the 'break' keyword
    */
   Token get keyword => _keyword;
-  
+
   /**
    * Return the label associated with the statement, or {@code null} if there is no label.
    * @return the label associated with the statement
    */
   SimpleIdentifier get label => _label;
-  
+
   /**
    * Return the semicolon terminating the statement.
    * @return the semicolon terminating the statement
    */
   Token get semicolon => _semicolon;
-  
+
   /**
    * Set the token representing the 'break' keyword to the given token.
    * @param keyword the token representing the 'break' keyword
@@ -1715,7 +1765,7 @@
   void set keyword(Token keyword2) {
     this._keyword = keyword2;
   }
-  
+
   /**
    * Set the label associated with the statement to the given identifier.
    * @param identifier the label associated with the statement
@@ -1723,7 +1773,7 @@
   void set label(SimpleIdentifier identifier) {
     _label = becomeParentOf(identifier);
   }
-  
+
   /**
    * Set the semicolon terminating the statement to the given token.
    * @param semicolon the semicolon terminating the statement
@@ -1735,7 +1785,6 @@
     safelyVisitChild(_label, visitor);
   }
 }
-
 /**
  * Instances of the class {@code CascadeExpression} represent a sequence of cascaded expressions:
  * expressions that share a common target. There are three kinds of expressions that can be used in
@@ -1751,17 +1800,17 @@
  * @coverage dart.engine.ast
  */
 class CascadeExpression extends Expression {
-  
+
   /**
    * The target of the cascade sections.
    */
   Expression _target;
-  
+
   /**
    * The cascade sections sharing the common target.
    */
   NodeList<Expression> _cascadeSections;
-  
+
   /**
    * Initialize a newly created cascade expression.
    * @param target the target of the cascade sections
@@ -1772,7 +1821,7 @@
     this._target = becomeParentOf(target);
     this._cascadeSections.addAll(cascadeSections);
   }
-  
+
   /**
    * Initialize a newly created cascade expression.
    * @param target the target of the cascade sections
@@ -1781,20 +1830,20 @@
   CascadeExpression({Expression target, List<Expression> cascadeSections}) : this.full(target, cascadeSections);
   accept(ASTVisitor visitor) => visitor.visitCascadeExpression(this);
   Token get beginToken => _target.beginToken;
-  
+
   /**
    * Return the cascade sections sharing the common target.
    * @return the cascade sections sharing the common target
    */
   NodeList<Expression> get cascadeSections => _cascadeSections;
   Token get endToken => _cascadeSections.endToken;
-  
+
   /**
    * Return the target of the cascade sections.
    * @return the target of the cascade sections
    */
   Expression get target => _target;
-  
+
   /**
    * Set the target of the cascade sections to the given expression.
    * @param target the target of the cascade sections
@@ -1807,7 +1856,6 @@
     _cascadeSections.accept(visitor);
   }
 }
-
 /**
  * Instances of the class {@code CatchClause} represent a catch clause within a try statement.
  * <pre>
@@ -1818,53 +1866,53 @@
  * @coverage dart.engine.ast
  */
 class CatchClause extends ASTNode {
-  
+
   /**
    * The token representing the 'on' keyword, or {@code null} if there is no 'on' keyword.
    */
   Token _onKeyword;
-  
+
   /**
    * The type of exceptions caught by this catch clause, or {@code null} if this catch clause
    * catches every type of exception.
    */
   TypeName _exceptionType;
-  
+
   /**
    * The token representing the 'catch' keyword, or {@code null} if there is no 'catch' keyword.
    */
   Token _catchKeyword;
-  
+
   /**
    * The left parenthesis.
    */
   Token _leftParenthesis;
-  
+
   /**
    * The parameter whose value will be the exception that was thrown.
    */
   SimpleIdentifier _exceptionParameter;
-  
+
   /**
    * The comma separating the exception parameter from the stack trace parameter.
    */
   Token _comma;
-  
+
   /**
    * The parameter whose value will be the stack trace associated with the exception.
    */
   SimpleIdentifier _stackTraceParameter;
-  
+
   /**
    * The right parenthesis.
    */
   Token _rightParenthesis;
-  
+
   /**
    * The body of the catch block.
    */
   Block _body;
-  
+
   /**
    * Initialize a newly created catch clause.
    * @param onKeyword the token representing the 'on' keyword
@@ -1888,7 +1936,7 @@
     this._rightParenthesis = rightParenthesis;
     this._body = becomeParentOf(body);
   }
-  
+
   /**
    * Initialize a newly created catch clause.
    * @param onKeyword the token representing the 'on' keyword
@@ -1909,64 +1957,64 @@
     }
     return _catchKeyword;
   }
-  
+
   /**
    * Return the body of the catch block.
    * @return the body of the catch block
    */
   Block get body => _body;
-  
+
   /**
    * Return the token representing the 'catch' keyword, or {@code null} if there is no 'catch'
    * keyword.
    * @return the token representing the 'catch' keyword
    */
   Token get catchKeyword => _catchKeyword;
-  
+
   /**
    * Return the comma.
    * @return the comma
    */
   Token get comma => _comma;
   Token get endToken => _body.endToken;
-  
+
   /**
    * Return the parameter whose value will be the exception that was thrown.
    * @return the parameter whose value will be the exception that was thrown
    */
   SimpleIdentifier get exceptionParameter => _exceptionParameter;
-  
+
   /**
    * Return the type of exceptions caught by this catch clause, or {@code null} if this catch clause
    * catches every type of exception.
    * @return the type of exceptions caught by this catch clause
    */
   TypeName get exceptionType => _exceptionType;
-  
+
   /**
    * Return the left parenthesis.
    * @return the left parenthesis
    */
   Token get leftParenthesis => _leftParenthesis;
-  
+
   /**
    * Return the token representing the 'on' keyword, or {@code null} if there is no 'on' keyword.
    * @return the token representing the 'on' keyword
    */
   Token get onKeyword => _onKeyword;
-  
+
   /**
    * Return the right parenthesis.
    * @return the right parenthesis
    */
   Token get rightParenthesis => _rightParenthesis;
-  
+
   /**
    * Return the parameter whose value will be the stack trace associated with the exception.
    * @return the parameter whose value will be the stack trace associated with the exception
    */
   SimpleIdentifier get stackTraceParameter => _stackTraceParameter;
-  
+
   /**
    * Set the body of the catch block to the given block.
    * @param block the body of the catch block
@@ -1974,7 +2022,7 @@
   void set body(Block block) {
     _body = becomeParentOf(block);
   }
-  
+
   /**
    * Set the token representing the 'catch' keyword to the given token.
    * @param catchKeyword the token representing the 'catch' keyword
@@ -1982,7 +2030,7 @@
   void set catchKeyword(Token catchKeyword2) {
     this._catchKeyword = catchKeyword2;
   }
-  
+
   /**
    * Set the comma to the given token.
    * @param comma the comma
@@ -1990,7 +2038,7 @@
   void set comma(Token comma2) {
     this._comma = comma2;
   }
-  
+
   /**
    * Set the parameter whose value will be the exception that was thrown to the given parameter.
    * @param parameter the parameter whose value will be the exception that was thrown
@@ -1998,7 +2046,7 @@
   void set exceptionParameter(SimpleIdentifier parameter) {
     _exceptionParameter = becomeParentOf(parameter);
   }
-  
+
   /**
    * Set the type of exceptions caught by this catch clause to the given type.
    * @param exceptionType the type of exceptions caught by this catch clause
@@ -2006,7 +2054,7 @@
   void set exceptionType(TypeName exceptionType2) {
     this._exceptionType = exceptionType2;
   }
-  
+
   /**
    * Set the left parenthesis to the given token.
    * @param parenthesis the left parenthesis
@@ -2014,7 +2062,7 @@
   void set leftParenthesis(Token parenthesis) {
     _leftParenthesis = parenthesis;
   }
-  
+
   /**
    * Set the token representing the 'on' keyword to the given keyword.
    * @param onKeyword the token representing the 'on' keyword
@@ -2022,7 +2070,7 @@
   void set onKeyword(Token onKeyword2) {
     this._onKeyword = onKeyword2;
   }
-  
+
   /**
    * Set the right parenthesis to the given token.
    * @param parenthesis the right parenthesis
@@ -2030,7 +2078,7 @@
   void set rightParenthesis(Token parenthesis) {
     _rightParenthesis = parenthesis;
   }
-  
+
   /**
    * Set the parameter whose value will be the stack trace associated with the exception to the
    * given parameter.
@@ -2047,7 +2095,6 @@
     safelyVisitChild(_body, visitor);
   }
 }
-
 /**
  * Instances of the class {@code ClassDeclaration} represent the declaration of a class.
  * <pre>
@@ -2059,59 +2106,59 @@
  * @coverage dart.engine.ast
  */
 class ClassDeclaration extends CompilationUnitMember {
-  
+
   /**
    * The 'abstract' keyword, or {@code null} if the keyword was absent.
    */
   Token _abstractKeyword;
-  
+
   /**
    * The token representing the 'class' keyword.
    */
   Token _classKeyword;
-  
+
   /**
    * The name of the class being declared.
    */
   SimpleIdentifier _name;
-  
+
   /**
    * The type parameters for the class, or {@code null} if the class does not have any type
    * parameters.
    */
   TypeParameterList _typeParameters;
-  
+
   /**
    * The extends clause for the class, or {@code null} if the class does not extend any other class.
    */
   ExtendsClause _extendsClause;
-  
+
   /**
    * The with clause for the class, or {@code null} if the class does not have a with clause.
    */
   WithClause _withClause;
-  
+
   /**
    * The implements clause for the class, or {@code null} if the class does not implement any
    * interfaces.
    */
   ImplementsClause _implementsClause;
-  
+
   /**
    * The left curly bracket.
    */
   Token _leftBracket;
-  
+
   /**
    * The members defined by the class.
    */
   NodeList<ClassMember> _members;
-  
+
   /**
    * The right curly bracket.
    */
   Token _rightBracket;
-  
+
   /**
    * Initialize a newly created class declaration.
    * @param comment the documentation comment associated with this class
@@ -2140,7 +2187,7 @@
     this._members.addAll(members);
     this._rightBracket = rightBracket;
   }
-  
+
   /**
    * Initialize a newly created class declaration.
    * @param comment the documentation comment associated with this class
@@ -2158,13 +2205,13 @@
    */
   ClassDeclaration({Comment comment, List<Annotation> metadata, Token abstractKeyword, Token classKeyword, SimpleIdentifier name, TypeParameterList typeParameters, ExtendsClause extendsClause, WithClause withClause, ImplementsClause implementsClause, Token leftBracket, List<ClassMember> members, Token rightBracket}) : this.full(comment, metadata, abstractKeyword, classKeyword, name, typeParameters, extendsClause, withClause, implementsClause, leftBracket, members, rightBracket);
   accept(ASTVisitor visitor) => visitor.visitClassDeclaration(this);
-  
+
   /**
    * Return the 'abstract' keyword, or {@code null} if the keyword was absent.
    * @return the 'abstract' keyword
    */
   Token get abstractKeyword => _abstractKeyword;
-  
+
   /**
    * Return the token representing the 'class' keyword.
    * @return the token representing the 'class' keyword
@@ -2172,58 +2219,58 @@
   Token get classKeyword => _classKeyword;
   ClassElement get element => _name != null ? (_name.element as ClassElement) : null;
   Token get endToken => _rightBracket;
-  
+
   /**
    * Return the extends clause for this class, or {@code null} if the class does not extend any
    * other class.
    * @return the extends clause for this class
    */
   ExtendsClause get extendsClause => _extendsClause;
-  
+
   /**
    * Return the implements clause for the class, or {@code null} if the class does not implement any
    * interfaces.
    * @return the implements clause for the class
    */
   ImplementsClause get implementsClause => _implementsClause;
-  
+
   /**
    * Return the left curly bracket.
    * @return the left curly bracket
    */
   Token get leftBracket => _leftBracket;
-  
+
   /**
    * Return the members defined by the class.
    * @return the members defined by the class
    */
   NodeList<ClassMember> get members => _members;
-  
+
   /**
    * Return the name of the class being declared.
    * @return the name of the class being declared
    */
   SimpleIdentifier get name => _name;
-  
+
   /**
    * Return the right curly bracket.
    * @return the right curly bracket
    */
   Token get rightBracket => _rightBracket;
-  
+
   /**
    * Return the type parameters for the class, or {@code null} if the class does not have any type
    * parameters.
    * @return the type parameters for the class
    */
   TypeParameterList get typeParameters => _typeParameters;
-  
+
   /**
    * Return the with clause for the class, or {@code null} if the class does not have a with clause.
    * @return the with clause for the class
    */
   WithClause get withClause => _withClause;
-  
+
   /**
    * Set the 'abstract' keyword to the given keyword.
    * @param abstractKeyword the 'abstract' keyword
@@ -2231,7 +2278,7 @@
   void set abstractKeyword(Token abstractKeyword2) {
     this._abstractKeyword = abstractKeyword2;
   }
-  
+
   /**
    * Set the token representing the 'class' keyword to the given token.
    * @param classKeyword the token representing the 'class' keyword
@@ -2239,7 +2286,7 @@
   void set classKeyword(Token classKeyword2) {
     this._classKeyword = classKeyword2;
   }
-  
+
   /**
    * Set the extends clause for this class to the given clause.
    * @param extendsClause the extends clause for this class
@@ -2247,7 +2294,7 @@
   void set extendsClause(ExtendsClause extendsClause2) {
     this._extendsClause = becomeParentOf(extendsClause2);
   }
-  
+
   /**
    * Set the implements clause for the class to the given clause.
    * @param implementsClause the implements clause for the class
@@ -2255,7 +2302,7 @@
   void set implementsClause(ImplementsClause implementsClause2) {
     this._implementsClause = becomeParentOf(implementsClause2);
   }
-  
+
   /**
    * Set the left curly bracket to the given token.
    * @param leftBracket the left curly bracket
@@ -2263,7 +2310,7 @@
   void set leftBracket(Token leftBracket2) {
     this._leftBracket = leftBracket2;
   }
-  
+
   /**
    * Set the name of the class being declared to the given identifier.
    * @param identifier the name of the class being declared
@@ -2271,7 +2318,7 @@
   void set name(SimpleIdentifier identifier) {
     _name = becomeParentOf(identifier);
   }
-  
+
   /**
    * Set the right curly bracket to the given token.
    * @param rightBracket the right curly bracket
@@ -2279,7 +2326,7 @@
   void set rightBracket(Token rightBracket2) {
     this._rightBracket = rightBracket2;
   }
-  
+
   /**
    * Set the type parameters for the class to the given list of type parameters.
    * @param typeParameters the type parameters for the class
@@ -2287,7 +2334,7 @@
   void set typeParameters(TypeParameterList typeParameters2) {
     this._typeParameters = typeParameters2;
   }
-  
+
   /**
    * Set the with clause for the class to the given clause.
    * @param withClause the with clause for the class
@@ -2311,14 +2358,13 @@
     return _classKeyword;
   }
 }
-
 /**
  * The abstract class {@code ClassMember} defines the behavior common to nodes that declare a name
  * within the scope of a class.
  * @coverage dart.engine.ast
  */
 abstract class ClassMember extends Declaration {
-  
+
   /**
    * Initialize a newly created member of a class.
    * @param comment the documentation comment associated with this member
@@ -2326,7 +2372,7 @@
    */
   ClassMember.full(Comment comment, List<Annotation> metadata) : super.full(comment, metadata) {
   }
-  
+
   /**
    * Initialize a newly created member of a class.
    * @param comment the documentation comment associated with this member
@@ -2334,7 +2380,6 @@
    */
   ClassMember({Comment comment, List<Annotation> metadata}) : this.full(comment, metadata);
 }
-
 /**
  * Instances of the class {@code ClassTypeAlias} represent a class type alias.
  * <pre>
@@ -2344,44 +2389,44 @@
  * @coverage dart.engine.ast
  */
 class ClassTypeAlias extends TypeAlias {
-  
+
   /**
    * The name of the class being declared.
    */
   SimpleIdentifier _name;
-  
+
   /**
    * The type parameters for the class, or {@code null} if the class does not have any type
    * parameters.
    */
   TypeParameterList _typeParameters;
-  
+
   /**
    * The token for the '=' separating the name from the definition.
    */
   Token _equals;
-  
+
   /**
    * The token for the 'abstract' keyword, or {@code null} if this is not defining an abstract
    * class.
    */
   Token _abstractKeyword;
-  
+
   /**
    * The name of the superclass of the class being declared.
    */
   TypeName _superclass;
-  
+
   /**
    * The with clause for this class.
    */
   WithClause _withClause;
-  
+
   /**
    * The implements clause for this class, or {@code null} if there is no implements clause.
    */
   ImplementsClause _implementsClause;
-  
+
   /**
    * Initialize a newly created class type alias.
    * @param comment the documentation comment associated with this type alias
@@ -2405,7 +2450,7 @@
     this._withClause = becomeParentOf(withClause);
     this._implementsClause = becomeParentOf(implementsClause);
   }
-  
+
   /**
    * Initialize a newly created class type alias.
    * @param comment the documentation comment associated with this type alias
@@ -2422,7 +2467,7 @@
    */
   ClassTypeAlias({Comment comment, List<Annotation> metadata, Token keyword, SimpleIdentifier name, TypeParameterList typeParameters, Token equals, Token abstractKeyword, TypeName superclass, WithClause withClause, ImplementsClause implementsClause, Token semicolon}) : this.full(comment, metadata, keyword, name, typeParameters, equals, abstractKeyword, superclass, withClause, implementsClause, semicolon);
   accept(ASTVisitor visitor) => visitor.visitClassTypeAlias(this);
-  
+
   /**
    * Return the token for the 'abstract' keyword, or {@code null} if this is not defining an
    * abstract class.
@@ -2430,44 +2475,44 @@
    */
   Token get abstractKeyword => _abstractKeyword;
   ClassElement get element => _name != null ? (_name.element as ClassElement) : null;
-  
+
   /**
    * Return the token for the '=' separating the name from the definition.
    * @return the token for the '=' separating the name from the definition
    */
   Token get equals => _equals;
-  
+
   /**
    * Return the implements clause for this class, or {@code null} if there is no implements clause.
    * @return the implements clause for this class
    */
   ImplementsClause get implementsClause => _implementsClause;
-  
+
   /**
    * Return the name of the class being declared.
    * @return the name of the class being declared
    */
   SimpleIdentifier get name => _name;
-  
+
   /**
    * Return the name of the superclass of the class being declared.
    * @return the name of the superclass of the class being declared
    */
   TypeName get superclass => _superclass;
-  
+
   /**
    * Return the type parameters for the class, or {@code null} if the class does not have any type
    * parameters.
    * @return the type parameters for the class
    */
   TypeParameterList get typeParameters => _typeParameters;
-  
+
   /**
    * Return the with clause for this class.
    * @return the with clause for this class
    */
   WithClause get withClause => _withClause;
-  
+
   /**
    * Set the token for the 'abstract' keyword to the given token.
    * @param abstractKeyword the token for the 'abstract' keyword
@@ -2475,7 +2520,7 @@
   void set abstractKeyword(Token abstractKeyword2) {
     this._abstractKeyword = abstractKeyword2;
   }
-  
+
   /**
    * Set the token for the '=' separating the name from the definition to the given token.
    * @param equals the token for the '=' separating the name from the definition
@@ -2483,7 +2528,7 @@
   void set equals(Token equals2) {
     this._equals = equals2;
   }
-  
+
   /**
    * Set the implements clause for this class to the given implements clause.
    * @param implementsClause the implements clause for this class
@@ -2491,7 +2536,7 @@
   void set implementsClause(ImplementsClause implementsClause2) {
     this._implementsClause = becomeParentOf(implementsClause2);
   }
-  
+
   /**
    * Set the name of the class being declared to the given identifier.
    * @param name the name of the class being declared
@@ -2499,7 +2544,7 @@
   void set name(SimpleIdentifier name2) {
     this._name = becomeParentOf(name2);
   }
-  
+
   /**
    * Set the name of the superclass of the class being declared to the given name.
    * @param superclass the name of the superclass of the class being declared
@@ -2507,7 +2552,7 @@
   void set superclass(TypeName superclass2) {
     this._superclass = becomeParentOf(superclass2);
   }
-  
+
   /**
    * Set the type parameters for the class to the given list of parameters.
    * @param typeParameters the type parameters for the class
@@ -2515,7 +2560,7 @@
   void set typeParameters(TypeParameterList typeParameters2) {
     this._typeParameters = becomeParentOf(typeParameters2);
   }
-  
+
   /**
    * Set the with clause for this class to the given with clause.
    * @param withClause the with clause for this class
@@ -2532,7 +2577,6 @@
     safelyVisitChild(_implementsClause, visitor);
   }
 }
-
 /**
  * Instances of the class {@code Combinator} represent the combinator associated with an import
  * directive.
@@ -2541,12 +2585,12 @@
  * @coverage dart.engine.ast
  */
 abstract class Combinator extends ASTNode {
-  
+
   /**
    * The keyword specifying what kind of processing is to be done on the imported names.
    */
   Token _keyword;
-  
+
   /**
    * Initialize a newly created import combinator.
    * @param keyword the keyword specifying what kind of processing is to be done on the imported
@@ -2555,7 +2599,7 @@
   Combinator.full(Token keyword) {
     this._keyword = keyword;
   }
-  
+
   /**
    * Initialize a newly created import combinator.
    * @param keyword the keyword specifying what kind of processing is to be done on the imported
@@ -2563,13 +2607,13 @@
    */
   Combinator({Token keyword}) : this.full(keyword);
   Token get beginToken => _keyword;
-  
+
   /**
    * Return the keyword specifying what kind of processing is to be done on the imported names.
    * @return the keyword specifying what kind of processing is to be done on the imported names
    */
   Token get keyword => _keyword;
-  
+
   /**
    * Set the keyword specifying what kind of processing is to be done on the imported names to the
    * given token.
@@ -2580,7 +2624,6 @@
     this._keyword = keyword2;
   }
 }
-
 /**
  * Instances of the class {@code Comment} represent a comment within the source code.
  * <pre>
@@ -2599,21 +2642,21 @@
  * @coverage dart.engine.ast
  */
 class Comment extends ASTNode {
-  
+
   /**
    * Create a block comment.
    * @param tokens the tokens representing the comment
    * @return the block comment that was created
    */
   static Comment createBlockComment(List<Token> tokens) => new Comment.full(tokens, CommentType.BLOCK, null);
-  
+
   /**
    * Create a documentation comment.
    * @param tokens the tokens representing the comment
    * @return the documentation comment that was created
    */
   static Comment createDocumentationComment(List<Token> tokens) => new Comment.full(tokens, CommentType.DOCUMENTATION, new List<CommentReference>());
-  
+
   /**
    * Create a documentation comment.
    * @param tokens the tokens representing the comment
@@ -2621,30 +2664,30 @@
    * @return the documentation comment that was created
    */
   static Comment createDocumentationComment2(List<Token> tokens, List<CommentReference> references) => new Comment.full(tokens, CommentType.DOCUMENTATION, references);
-  
+
   /**
    * Create an end-of-line comment.
    * @param tokens the tokens representing the comment
    * @return the end-of-line comment that was created
    */
   static Comment createEndOfLineComment(List<Token> tokens) => new Comment.full(tokens, CommentType.END_OF_LINE, null);
-  
+
   /**
    * The tokens representing the comment.
    */
   List<Token> _tokens;
-  
+
   /**
    * The type of the comment.
    */
   CommentType _type;
-  
+
   /**
    * The references embedded within the documentation comment. This list will be empty unless this
    * is a documentation comment that has references embedded within it.
    */
   NodeList<CommentReference> _references;
-  
+
   /**
    * Initialize a newly created comment.
    * @param tokens the tokens representing the comment
@@ -2657,7 +2700,7 @@
     this._type = type;
     this._references.addAll(references);
   }
-  
+
   /**
    * Initialize a newly created comment.
    * @param tokens the tokens representing the comment
@@ -2668,31 +2711,31 @@
   accept(ASTVisitor visitor) => visitor.visitComment(this);
   Token get beginToken => _tokens[0];
   Token get endToken => _tokens[_tokens.length - 1];
-  
+
   /**
    * Return the references embedded within the documentation comment.
    * @return the references embedded within the documentation comment
    */
   NodeList<CommentReference> get references => _references;
-  
+
   /**
    * Return the tokens representing the comment.
    * @return the tokens representing the comment
    */
   List<Token> get tokens => _tokens;
-  
+
   /**
    * Return {@code true} if this is a block comment.
    * @return {@code true} if this is a block comment
    */
   bool isBlock() => identical(_type, CommentType.BLOCK);
-  
+
   /**
    * Return {@code true} if this is a documentation comment.
    * @return {@code true} if this is a documentation comment
    */
   bool isDocumentation() => identical(_type, CommentType.DOCUMENTATION);
-  
+
   /**
    * Return {@code true} if this is an end-of-line comment.
    * @return {@code true} if this is an end-of-line comment
@@ -2702,32 +2745,31 @@
     _references.accept(visitor);
   }
 }
-
 /**
  * The enumeration {@code CommentType} encodes all the different types of comments that are
  * recognized by the parser.
  */
 class CommentType implements Comparable<CommentType> {
-  
+
   /**
    * An end-of-line comment.
    */
   static final CommentType END_OF_LINE = new CommentType('END_OF_LINE', 0);
-  
+
   /**
    * A block comment.
    */
   static final CommentType BLOCK = new CommentType('BLOCK', 1);
-  
+
   /**
    * A documentation comment.
    */
   static final CommentType DOCUMENTATION = new CommentType('DOCUMENTATION', 2);
   static final List<CommentType> values = [END_OF_LINE, BLOCK, DOCUMENTATION];
-  
+
   /// The name of this enum constant, as declared in the enum declaration.
   final String name;
-  
+
   /// The position in the enum declaration.
   final int ordinal;
   CommentType(this.name, this.ordinal) {
@@ -2735,7 +2777,6 @@
   int compareTo(CommentType other) => ordinal - other.ordinal;
   String toString() => name;
 }
-
 /**
  * Instances of the class {@code CommentReference} represent a reference to a Dart element that is
  * found within a documentation comment.
@@ -2746,17 +2787,17 @@
  * @coverage dart.engine.ast
  */
 class CommentReference extends ASTNode {
-  
+
   /**
    * The token representing the 'new' keyword, or {@code null} if there was no 'new' keyword.
    */
   Token _newKeyword;
-  
+
   /**
    * The identifier being referenced.
    */
   Identifier _identifier;
-  
+
   /**
    * Initialize a newly created reference to a Dart element.
    * @param newKeyword the token representing the 'new' keyword
@@ -2766,7 +2807,7 @@
     this._newKeyword = newKeyword;
     this._identifier = becomeParentOf(identifier);
   }
-  
+
   /**
    * Initialize a newly created reference to a Dart element.
    * @param newKeyword the token representing the 'new' keyword
@@ -2776,19 +2817,19 @@
   accept(ASTVisitor visitor) => visitor.visitCommentReference(this);
   Token get beginToken => _identifier.beginToken;
   Token get endToken => _identifier.endToken;
-  
+
   /**
    * Return the identifier being referenced.
    * @return the identifier being referenced
    */
   Identifier get identifier => _identifier;
-  
+
   /**
    * Return the token representing the 'new' keyword, or {@code null} if there was no 'new' keyword.
    * @return the token representing the 'new' keyword
    */
   Token get newKeyword => _newKeyword;
-  
+
   /**
    * Set the identifier being referenced to the given identifier.
    * @param identifier the identifier being referenced
@@ -2796,7 +2837,7 @@
   void set identifier(Identifier identifier2) {
     identifier2 = becomeParentOf(identifier2);
   }
-  
+
   /**
    * Set the token representing the 'new' keyword to the given token.
    * @param newKeyword the token representing the 'new' keyword
@@ -2808,7 +2849,6 @@
     safelyVisitChild(_identifier, visitor);
   }
 }
-
 /**
  * Instances of the class {@code CompilationUnit} represent a compilation unit.
  * <p>
@@ -2823,55 +2863,55 @@
  * @coverage dart.engine.ast
  */
 class CompilationUnit extends ASTNode {
-  
+
   /**
    * The first token in the token stream that was parsed to form this compilation unit.
    */
   Token _beginToken;
-  
+
   /**
    * The script tag at the beginning of the compilation unit, or {@code null} if there is no script
    * tag in this compilation unit.
    */
   ScriptTag _scriptTag;
-  
+
   /**
    * The directives contained in this compilation unit.
    */
   NodeList<Directive> _directives;
-  
+
   /**
    * The declarations contained in this compilation unit.
    */
   NodeList<CompilationUnitMember> _declarations;
-  
+
   /**
    * The last token in the token stream that was parsed to form this compilation unit. This token
    * should always have a type of {@link TokenType.EOF}.
    */
   Token _endToken;
-  
+
   /**
    * The element associated with this compilation unit, or {@code null} if the AST structure has not
    * been resolved.
    */
   CompilationUnitElement _element;
-  
+
   /**
    * The {@link LineInfo} for this {@link CompilationUnit}.
    */
   LineInfo _lineInfo;
-  
+
   /**
    * The parsing errors encountered when the receiver was parsed.
    */
   List<AnalysisError> _parsingErrors = AnalysisError.NO_ERRORS;
-  
+
   /**
    * The resolution errors encountered when the receiver was resolved.
    */
   List<AnalysisError> _resolutionErrors = AnalysisError.NO_ERRORS;
-  
+
   /**
    * Initialize a newly created compilation unit to have the given directives and declarations.
    * @param beginToken the first token in the token stream
@@ -2889,7 +2929,7 @@
     this._declarations.addAll(declarations);
     this._endToken = endToken;
   }
-  
+
   /**
    * Initialize a newly created compilation unit to have the given directives and declarations.
    * @param beginToken the first token in the token stream
@@ -2901,19 +2941,19 @@
   CompilationUnit({Token beginToken, ScriptTag scriptTag, List<Directive> directives, List<CompilationUnitMember> declarations, Token endToken}) : this.full(beginToken, scriptTag, directives, declarations, endToken);
   accept(ASTVisitor visitor) => visitor.visitCompilationUnit(this);
   Token get beginToken => _beginToken;
-  
+
   /**
    * Return the declarations contained in this compilation unit.
    * @return the declarations contained in this compilation unit
    */
   NodeList<CompilationUnitMember> get declarations => _declarations;
-  
+
   /**
    * Return the directives contained in this compilation unit.
    * @return the directives contained in this compilation unit
    */
   NodeList<Directive> get directives => _directives;
-  
+
   /**
    * Return the element associated with this compilation unit, or {@code null} if the AST structure
    * has not been resolved.
@@ -2921,7 +2961,7 @@
    */
   CompilationUnitElement get element => _element;
   Token get endToken => _endToken;
-  
+
   /**
    * Return an array containing all of the errors associated with the receiver. If the receiver has
    * not been resolved, then return {@code null}.
@@ -2949,20 +2989,20 @@
     }
     return endToken2.offset + endToken2.length;
   }
-  
+
   /**
    * Get the {@link LineInfo} object for this compilation unit.
    * @return the associated {@link LineInfo}
    */
   LineInfo get lineInfo => _lineInfo;
   int get offset => 0;
-  
+
   /**
    * Return an array containing all of the parsing errors associated with the receiver.
    * @return an array of errors (not {@code null}, contains no {@code null}s).
    */
   List<AnalysisError> get parsingErrors => _parsingErrors;
-  
+
   /**
    * Return an array containing all of the resolution errors associated with the receiver. If the
    * receiver has not been resolved, then return {@code null}.
@@ -2970,14 +3010,14 @@
    * been resolved
    */
   List<AnalysisError> get resolutionErrors => _resolutionErrors;
-  
+
   /**
    * Return the script tag at the beginning of the compilation unit, or {@code null} if there is no
    * script tag in this compilation unit.
    * @return the script tag at the beginning of the compilation unit
    */
   ScriptTag get scriptTag => _scriptTag;
-  
+
   /**
    * Set the element associated with this compilation unit to the given element.
    * @param element the element associated with this compilation unit
@@ -2985,7 +3025,7 @@
   void set element(CompilationUnitElement element2) {
     this._element = element2;
   }
-  
+
   /**
    * Set the {@link LineInfo} object for this compilation unit.
    * @param errors LineInfo to associate with this compilation unit
@@ -2993,7 +3033,7 @@
   void set lineInfo(LineInfo lineInfo2) {
     this._lineInfo = lineInfo2;
   }
-  
+
   /**
    * Called to cache the parsing errors when the unit is parsed.
    * @param errors an array of parsing errors, if {@code null} is passed, the error array is set to
@@ -3002,7 +3042,7 @@
   void set parsingErrors(List<AnalysisError> errors) {
     _parsingErrors = errors == null ? AnalysisError.NO_ERRORS : errors;
   }
-  
+
   /**
    * Called to cache the resolution errors when the unit is resolved.
    * @param errors an array of resolution errors, if {@code null} is passed, the error array is set
@@ -3011,7 +3051,7 @@
   void set resolutionErrors(List<AnalysisError> errors) {
     _resolutionErrors = errors == null ? AnalysisError.NO_ERRORS : errors;
   }
-  
+
   /**
    * Set the script tag at the beginning of the compilation unit to the given script tag.
    * @param scriptTag the script tag at the beginning of the compilation unit
@@ -3030,7 +3070,7 @@
       }
     }
   }
-  
+
   /**
    * Return {@code true} if all of the directives are lexically before any declarations.
    * @return {@code true} if all of the directives are lexically before any declarations
@@ -3043,7 +3083,7 @@
     CompilationUnitMember firstDeclaration = _declarations[0];
     return lastDirective.offset < firstDeclaration.offset;
   }
-  
+
   /**
    * Return an array containing all of the directives and declarations in this compilation unit,
    * sorted in lexical order.
@@ -3055,11 +3095,10 @@
     childList.addAll(_directives);
     childList.addAll(_declarations);
     List<ASTNode> children = new List.from(childList);
-    children.sort();
+    children.sort(ASTNode.LEXICAL_ORDER);
     return children;
   }
 }
-
 /**
  * Instances of the class {@code CompilationUnitMember} defines the behavior common to nodes that
  * declare a name within the scope of a compilation unit.
@@ -3068,7 +3107,7 @@
  * @coverage dart.engine.ast
  */
 abstract class CompilationUnitMember extends Declaration {
-  
+
   /**
    * Initialize a newly created generic compilation unit member.
    * @param comment the documentation comment associated with this member
@@ -3076,7 +3115,7 @@
    */
   CompilationUnitMember.full(Comment comment, List<Annotation> metadata) : super.full(comment, metadata) {
   }
-  
+
   /**
    * Initialize a newly created generic compilation unit member.
    * @param comment the documentation comment associated with this member
@@ -3084,7 +3123,6 @@
    */
   CompilationUnitMember({Comment comment, List<Annotation> metadata}) : this.full(comment, metadata);
 }
-
 /**
  * Instances of the class {@code ConditionalExpression} represent a conditional expression.
  * <pre>
@@ -3092,32 +3130,32 @@
  * @coverage dart.engine.ast
  */
 class ConditionalExpression extends Expression {
-  
+
   /**
    * The condition used to determine which of the expressions is executed next.
    */
   Expression _condition;
-  
+
   /**
    * The token used to separate the condition from the then expression.
    */
   Token _question;
-  
+
   /**
    * The expression that is executed if the condition evaluates to {@code true}.
    */
   Expression _thenExpression;
-  
+
   /**
    * The token used to separate the then expression from the else expression.
    */
   Token _colon;
-  
+
   /**
    * The expression that is executed if the condition evaluates to {@code false}.
    */
   Expression _elseExpression;
-  
+
   /**
    * Initialize a newly created conditional expression.
    * @param condition the condition used to determine which expression is executed next
@@ -3133,7 +3171,7 @@
     this._colon = colon;
     this._elseExpression = becomeParentOf(elseExpression);
   }
-  
+
   /**
    * Initialize a newly created conditional expression.
    * @param condition the condition used to determine which expression is executed next
@@ -3145,38 +3183,38 @@
   ConditionalExpression({Expression condition, Token question, Expression thenExpression, Token colon, Expression elseExpression}) : this.full(condition, question, thenExpression, colon, elseExpression);
   accept(ASTVisitor visitor) => visitor.visitConditionalExpression(this);
   Token get beginToken => _condition.beginToken;
-  
+
   /**
    * Return the token used to separate the then expression from the else expression.
    * @return the token used to separate the then expression from the else expression
    */
   Token get colon => _colon;
-  
+
   /**
    * Return the condition used to determine which of the expressions is executed next.
    * @return the condition used to determine which expression is executed next
    */
   Expression get condition => _condition;
-  
+
   /**
    * Return the expression that is executed if the condition evaluates to {@code false}.
    * @return the expression that is executed if the condition evaluates to {@code false}
    */
   Expression get elseExpression => _elseExpression;
   Token get endToken => _elseExpression.endToken;
-  
+
   /**
    * Return the token used to separate the condition from the then expression.
    * @return the token used to separate the condition from the then expression
    */
   Token get question => _question;
-  
+
   /**
    * Return the expression that is executed if the condition evaluates to {@code true}.
    * @return the expression that is executed if the condition evaluates to {@code true}
    */
   Expression get thenExpression => _thenExpression;
-  
+
   /**
    * Set the token used to separate the then expression from the else expression to the given token.
    * @param colon the token used to separate the then expression from the else expression
@@ -3184,7 +3222,7 @@
   void set colon(Token colon2) {
     this._colon = colon2;
   }
-  
+
   /**
    * Set the condition used to determine which of the expressions is executed next to the given
    * expression.
@@ -3193,7 +3231,7 @@
   void set condition(Expression expression) {
     _condition = becomeParentOf(expression);
   }
-  
+
   /**
    * Set the expression that is executed if the condition evaluates to {@code false} to the given
    * expression.
@@ -3202,7 +3240,7 @@
   void set elseExpression(Expression expression) {
     _elseExpression = becomeParentOf(expression);
   }
-  
+
   /**
    * Set the token used to separate the condition from the then expression to the given token.
    * @param question the token used to separate the condition from the then expression
@@ -3210,7 +3248,7 @@
   void set question(Token question2) {
     this._question = question2;
   }
-  
+
   /**
    * Set the expression that is executed if the condition evaluates to {@code true} to the given
    * expression.
@@ -3225,7 +3263,6 @@
     safelyVisitChild(_elseExpression, visitor);
   }
 }
-
 /**
  * Instances of the class {@code ConstructorDeclaration} represent a constructor declaration.
  * <pre>
@@ -3244,74 +3281,74 @@
  * @coverage dart.engine.ast
  */
 class ConstructorDeclaration extends ClassMember {
-  
+
   /**
    * The token for the 'external' keyword, or {@code null} if the constructor is not external.
    */
   Token _externalKeyword;
-  
+
   /**
    * The token for the 'const' keyword, or {@code null} if the constructor is not a const
    * constructor.
    */
   Token _constKeyword;
-  
+
   /**
    * The token for the 'factory' keyword, or {@code null} if the constructor is not a factory
    * constructor.
    */
   Token _factoryKeyword;
-  
+
   /**
    * The type of object being created. This can be different than the type in which the constructor
    * is being declared if the constructor is the implementation of a factory constructor.
    */
   Identifier _returnType;
-  
+
   /**
    * The token for the period before the constructor name, or {@code null} if the constructor being
    * declared is unnamed.
    */
   Token _period;
-  
+
   /**
    * The name of the constructor, or {@code null} if the constructor being declared is unnamed.
    */
   SimpleIdentifier _name;
-  
+
   /**
    * The element associated with this constructor, or {@code null} if the AST structure has not been
    * resolved or if this constructor could not be resolved.
    */
   ConstructorElement _element;
-  
+
   /**
    * The parameters associated with the constructor.
    */
   FormalParameterList _parameters;
-  
+
   /**
    * The token for the separator (colon or equals) before the initializers, or {@code null} if there
    * are no initializers.
    */
   Token _separator;
-  
+
   /**
    * The initializers associated with the constructor.
    */
   NodeList<ConstructorInitializer> _initializers;
-  
+
   /**
    * The name of the constructor to which this constructor will be redirected, or {@code null} if
    * this is not a redirecting factory constructor.
    */
   ConstructorName _redirectedConstructor;
-  
+
   /**
    * The body of the constructor, or {@code null} if the constructor does not have a body.
    */
   FunctionBody _body;
-  
+
   /**
    * Initialize a newly created constructor declaration.
    * @param externalKeyword the token for the 'external' keyword
@@ -3343,7 +3380,7 @@
     this._redirectedConstructor = becomeParentOf(redirectedConstructor);
     this._body = becomeParentOf(body);
   }
-  
+
   /**
    * Initialize a newly created constructor declaration.
    * @param externalKeyword the token for the 'external' keyword
@@ -3363,13 +3400,13 @@
    */
   ConstructorDeclaration({Comment comment, List<Annotation> metadata, Token externalKeyword, Token constKeyword, Token factoryKeyword, Identifier returnType, Token period, SimpleIdentifier name, FormalParameterList parameters, Token separator, List<ConstructorInitializer> initializers, ConstructorName redirectedConstructor, FunctionBody body}) : this.full(comment, metadata, externalKeyword, constKeyword, factoryKeyword, returnType, period, name, parameters, separator, initializers, redirectedConstructor, body);
   accept(ASTVisitor visitor) => visitor.visitConstructorDeclaration(this);
-  
+
   /**
    * Return the body of the constructor, or {@code null} if the constructor does not have a body.
    * @return the body of the constructor
    */
   FunctionBody get body => _body;
-  
+
   /**
    * Return the token for the 'const' keyword.
    * @return the token for the 'const' keyword
@@ -3384,52 +3421,52 @@
     }
     return _parameters.endToken;
   }
-  
+
   /**
    * Return the token for the 'external' keyword, or {@code null} if the constructor is not
    * external.
    * @return the token for the 'external' keyword
    */
   Token get externalKeyword => _externalKeyword;
-  
+
   /**
    * Return the token for the 'factory' keyword.
    * @return the token for the 'factory' keyword
    */
   Token get factoryKeyword => _factoryKeyword;
-  
+
   /**
    * Return the initializers associated with the constructor.
    * @return the initializers associated with the constructor
    */
   NodeList<ConstructorInitializer> get initializers => _initializers;
-  
+
   /**
    * Return the name of the constructor, or {@code null} if the constructor being declared is
    * unnamed.
    * @return the name of the constructor
    */
   SimpleIdentifier get name => _name;
-  
+
   /**
    * Return the parameters associated with the constructor.
    * @return the parameters associated with the constructor
    */
   FormalParameterList get parameters => _parameters;
-  
+
   /**
    * Return the token for the period before the constructor name, or {@code null} if the constructor
    * being declared is unnamed.
    * @return the token for the period before the constructor name
    */
   Token get period => _period;
-  
+
   /**
    * Return the name of the constructor to which this constructor will be redirected, or{@code null} if this is not a redirecting factory constructor.
    * @return the name of the constructor to which this constructor will be redirected
    */
   ConstructorName get redirectedConstructor => _redirectedConstructor;
-  
+
   /**
    * Return the type of object being created. This can be different than the type in which the
    * constructor is being declared if the constructor is the implementation of a factory
@@ -3437,13 +3474,13 @@
    * @return the type of object being created
    */
   Identifier get returnType => _returnType;
-  
+
   /**
    * Return the token for the separator (colon or equals) before the initializers, or {@code null}if there are no initializers.
    * @return the token for the separator (colon or equals) before the initializers
    */
   Token get separator => _separator;
-  
+
   /**
    * Set the body of the constructor to the given function body.
    * @param functionBody the body of the constructor
@@ -3451,7 +3488,7 @@
   void set body(FunctionBody functionBody) {
     _body = becomeParentOf(functionBody);
   }
-  
+
   /**
    * Set the token for the 'const' keyword to the given token.
    * @param constKeyword the token for the 'const' keyword
@@ -3459,7 +3496,7 @@
   void set constKeyword(Token constKeyword2) {
     this._constKeyword = constKeyword2;
   }
-  
+
   /**
    * Set the element associated with this constructor to the given element.
    * @param element the element associated with this constructor
@@ -3467,7 +3504,7 @@
   void set element(ConstructorElement element2) {
     this._element = element2;
   }
-  
+
   /**
    * Set the token for the 'external' keyword to the given token.
    * @param externalKeyword the token for the 'external' keyword
@@ -3475,7 +3512,7 @@
   void set externalKeyword(Token externalKeyword2) {
     this._externalKeyword = externalKeyword2;
   }
-  
+
   /**
    * Set the token for the 'factory' keyword to the given token.
    * @param factoryKeyword the token for the 'factory' keyword
@@ -3483,7 +3520,7 @@
   void set factoryKeyword(Token factoryKeyword2) {
     this._factoryKeyword = factoryKeyword2;
   }
-  
+
   /**
    * Set the name of the constructor to the given identifier.
    * @param identifier the name of the constructor
@@ -3491,7 +3528,7 @@
   void set name(SimpleIdentifier identifier) {
     _name = becomeParentOf(identifier);
   }
-  
+
   /**
    * Set the parameters associated with the constructor to the given list of parameters.
    * @param parameters the parameters associated with the constructor
@@ -3499,7 +3536,7 @@
   void set parameters(FormalParameterList parameters2) {
     this._parameters = becomeParentOf(parameters2);
   }
-  
+
   /**
    * Set the token for the period before the constructor name to the given token.
    * @param period the token for the period before the constructor name
@@ -3507,7 +3544,7 @@
   void set period(Token period2) {
     this._period = period2;
   }
-  
+
   /**
    * Set the name of the constructor to which this constructor will be redirected to the given
    * constructor name.
@@ -3517,7 +3554,7 @@
   void set redirectedConstructor(ConstructorName redirectedConstructor2) {
     this._redirectedConstructor = becomeParentOf(redirectedConstructor2);
   }
-  
+
   /**
    * Set the type of object being created to the given type name.
    * @param typeName the type of object being created
@@ -3525,7 +3562,7 @@
   void set returnType(Identifier typeName) {
     _returnType = becomeParentOf(typeName);
   }
-  
+
   /**
    * Set the token for the separator (colon or equals) before the initializers to the given token.
    * @param separator the token for the separator (colon or equals) before the initializers
@@ -3549,7 +3586,7 @@
     }
     return _returnType.beginToken;
   }
-  
+
   /**
    * Return the left-most of the given tokens, or {@code null} if there are no tokens given or if
    * all of the given tokens are {@code null}.
@@ -3567,7 +3604,6 @@
     return leftMost;
   }
 }
-
 /**
  * Instances of the class {@code ConstructorFieldInitializer} represent the initialization of a
  * field within a constructor's initialization list.
@@ -3577,33 +3613,33 @@
  * @coverage dart.engine.ast
  */
 class ConstructorFieldInitializer extends ConstructorInitializer {
-  
+
   /**
    * The token for the 'this' keyword, or {@code null} if there is no 'this' keyword.
    */
   Token _keyword;
-  
+
   /**
    * The token for the period after the 'this' keyword, or {@code null} if there is no 'this'
    * keyword.
    */
   Token _period;
-  
+
   /**
    * The name of the field being initialized.
    */
   SimpleIdentifier _fieldName;
-  
+
   /**
    * The token for the equal sign between the field name and the expression.
    */
   Token _equals;
-  
+
   /**
    * The expression computing the value to which the field will be initialized.
    */
   Expression _expression;
-  
+
   /**
    * Initialize a newly created field initializer to initialize the field with the given name to the
    * value of the given expression.
@@ -3620,7 +3656,7 @@
     this._equals = equals;
     this._expression = becomeParentOf(expression);
   }
-  
+
   /**
    * Initialize a newly created field initializer to initialize the field with the given name to the
    * value of the given expression.
@@ -3639,38 +3675,38 @@
     return _fieldName.beginToken;
   }
   Token get endToken => _expression.endToken;
-  
+
   /**
    * Return the token for the equal sign between the field name and the expression.
    * @return the token for the equal sign between the field name and the expression
    */
   Token get equals => _equals;
-  
+
   /**
    * Return the expression computing the value to which the field will be initialized.
    * @return the expression computing the value to which the field will be initialized
    */
   Expression get expression => _expression;
-  
+
   /**
    * Return the name of the field being initialized.
    * @return the name of the field being initialized
    */
   SimpleIdentifier get fieldName => _fieldName;
-  
+
   /**
    * Return the token for the 'this' keyword, or {@code null} if there is no 'this' keyword.
    * @return the token for the 'this' keyword
    */
   Token get keyword => _keyword;
-  
+
   /**
    * Return the token for the period after the 'this' keyword, or {@code null} if there is no 'this'
    * keyword.
    * @return the token for the period after the 'this' keyword
    */
   Token get period => _period;
-  
+
   /**
    * Set the token for the equal sign between the field name and the expression to the given token.
    * @param equals the token for the equal sign between the field name and the expression
@@ -3678,7 +3714,7 @@
   void set equals(Token equals2) {
     this._equals = equals2;
   }
-  
+
   /**
    * Set the expression computing the value to which the field will be initialized to the given
    * expression.
@@ -3687,7 +3723,7 @@
   void set expression(Expression expression2) {
     this._expression = becomeParentOf(expression2);
   }
-  
+
   /**
    * Set the name of the field being initialized to the given identifier.
    * @param identifier the name of the field being initialized
@@ -3695,7 +3731,7 @@
   void set fieldName(SimpleIdentifier identifier) {
     _fieldName = becomeParentOf(identifier);
   }
-  
+
   /**
    * Set the token for the 'this' keyword to the given token.
    * @param keyword the token for the 'this' keyword
@@ -3703,7 +3739,7 @@
   void set keyword(Token keyword2) {
     this._keyword = keyword2;
   }
-  
+
   /**
    * Set the token for the period after the 'this' keyword to the given token.
    * @param period the token for the period after the 'this' keyword
@@ -3716,7 +3752,6 @@
     safelyVisitChild(_expression, visitor);
   }
 }
-
 /**
  * Instances of the class {@code ConstructorInitializer} defines the behavior of nodes that can
  * occur in the initializer list of a constructor declaration.
@@ -3726,7 +3761,6 @@
  */
 abstract class ConstructorInitializer extends ASTNode {
 }
-
 /**
  * Instances of the class {@code ConstructorName} represent the name of the constructor.
  * <pre>
@@ -3736,36 +3770,36 @@
  * @coverage dart.engine.ast
  */
 class ConstructorName extends ASTNode {
-  
+
   /**
    * The name of the type defining the constructor.
    */
   TypeName _type;
-  
+
   /**
    * The token for the period before the constructor name, or {@code null} if the specified
    * constructor is the unnamed constructor.
    */
   Token _period;
-  
+
   /**
    * The name of the constructor, or {@code null} if the specified constructor is the unnamed
    * constructor.
    */
   SimpleIdentifier _name;
-  
+
   /**
    * The element associated with this constructor name based on static type information, or{@code null} if the AST structure has not been resolved or if this constructor name could not
    * be resolved.
    */
   ConstructorElement _staticElement;
-  
+
   /**
    * The element associated with this constructor name based on propagated type information, or{@code null} if the AST structure has not been resolved or if this constructor name could not
    * be resolved.
    */
   ConstructorElement _propagatedElement;
-  
+
   /**
    * Initialize a newly created constructor name.
    * @param type the name of the type defining the constructor
@@ -3777,7 +3811,7 @@
     this._period = period;
     this._name = becomeParentOf(name);
   }
-  
+
   /**
    * Initialize a newly created constructor name.
    * @param type the name of the type defining the constructor
@@ -3787,7 +3821,7 @@
   ConstructorName({TypeName type, Token period, SimpleIdentifier name}) : this.full(type, period, name);
   accept(ASTVisitor visitor) => visitor.visitConstructorName(this);
   Token get beginToken => _type.beginToken;
-  
+
   /**
    * Return the element associated with this constructor name based on propagated type information,
    * or {@code null} if the AST structure has not been resolved or if this constructor name could
@@ -3801,34 +3835,34 @@
     }
     return _type.endToken;
   }
-  
+
   /**
    * Return the name of the constructor, or {@code null} if the specified constructor is the unnamed
    * constructor.
    * @return the name of the constructor
    */
   SimpleIdentifier get name => _name;
-  
+
   /**
    * Return the token for the period before the constructor name, or {@code null} if the specified
    * constructor is the unnamed constructor.
    * @return the token for the period before the constructor name
    */
   Token get period => _period;
-  
+
   /**
    * Return the element associated with this constructor name based on static type information, or{@code null} if the AST structure has not been resolved or if this constructor name could not
    * be resolved.
    * @return the element associated with this constructor name
    */
   ConstructorElement get staticElement => _staticElement;
-  
+
   /**
    * Return the name of the type defining the constructor.
    * @return the name of the type defining the constructor
    */
   TypeName get type => _type;
-  
+
   /**
    * Set the element associated with this constructor name based on propagated type information to
    * the given element.
@@ -3837,7 +3871,7 @@
   void set element(ConstructorElement element2) {
     _propagatedElement = element2;
   }
-  
+
   /**
    * Set the name of the constructor to the given name.
    * @param name the name of the constructor
@@ -3845,7 +3879,7 @@
   void set name(SimpleIdentifier name2) {
     this._name = becomeParentOf(name2);
   }
-  
+
   /**
    * Return the token for the period before the constructor name to the given token.
    * @param period the token for the period before the constructor name
@@ -3853,7 +3887,7 @@
   void set period(Token period2) {
     this._period = period2;
   }
-  
+
   /**
    * Set the element associated with this constructor name based on static type information to the
    * given element.
@@ -3862,7 +3896,7 @@
   void set staticElement(ConstructorElement element) {
     _staticElement = element;
   }
-  
+
   /**
    * Set the name of the type defining the constructor to the given type name.
    * @param type the name of the type defining the constructor
@@ -3875,7 +3909,6 @@
     safelyVisitChild(_name, visitor);
   }
 }
-
 /**
  * Instances of the class {@code ContinueStatement} represent a continue statement.
  * <pre>
@@ -3885,22 +3918,22 @@
  * @coverage dart.engine.ast
  */
 class ContinueStatement extends Statement {
-  
+
   /**
    * The token representing the 'continue' keyword.
    */
   Token _keyword;
-  
+
   /**
    * The label associated with the statement, or {@code null} if there is no label.
    */
   SimpleIdentifier _label;
-  
+
   /**
    * The semicolon terminating the statement.
    */
   Token _semicolon;
-  
+
   /**
    * Initialize a newly created continue statement.
    * @param keyword the token representing the 'continue' keyword
@@ -3912,7 +3945,7 @@
     this._label = becomeParentOf(label);
     this._semicolon = semicolon;
   }
-  
+
   /**
    * Initialize a newly created continue statement.
    * @param keyword the token representing the 'continue' keyword
@@ -3923,25 +3956,25 @@
   accept(ASTVisitor visitor) => visitor.visitContinueStatement(this);
   Token get beginToken => _keyword;
   Token get endToken => _semicolon;
-  
+
   /**
    * Return the token representing the 'continue' keyword.
    * @return the token representing the 'continue' keyword
    */
   Token get keyword => _keyword;
-  
+
   /**
    * Return the label associated with the statement, or {@code null} if there is no label.
    * @return the label associated with the statement
    */
   SimpleIdentifier get label => _label;
-  
+
   /**
    * Return the semicolon terminating the statement.
    * @return the semicolon terminating the statement
    */
   Token get semicolon => _semicolon;
-  
+
   /**
    * Set the token representing the 'continue' keyword to the given token.
    * @param keyword the token representing the 'continue' keyword
@@ -3949,7 +3982,7 @@
   void set keyword(Token keyword2) {
     this._keyword = keyword2;
   }
-  
+
   /**
    * Set the label associated with the statement to the given label.
    * @param identifier the label associated with the statement
@@ -3957,7 +3990,7 @@
   void set label(SimpleIdentifier identifier) {
     _label = becomeParentOf(identifier);
   }
-  
+
   /**
    * Set the semicolon terminating the statement to the given token.
    * @param semicolon the semicolon terminating the statement
@@ -3969,14 +4002,13 @@
     safelyVisitChild(_label, visitor);
   }
 }
-
 /**
  * The abstract class {@code Declaration} defines the behavior common to nodes that represent the
  * declaration of a name. Each declared name is visible within a name scope.
  * @coverage dart.engine.ast
  */
 abstract class Declaration extends AnnotatedNode {
-  
+
   /**
    * Initialize a newly created declaration.
    * @param comment the documentation comment associated with this declaration
@@ -3984,14 +4016,14 @@
    */
   Declaration.full(Comment comment, List<Annotation> metadata) : super.full(comment, metadata) {
   }
-  
+
   /**
    * Initialize a newly created declaration.
    * @param comment the documentation comment associated with this declaration
    * @param metadata the annotations associated with this declaration
    */
   Declaration({Comment comment, List<Annotation> metadata}) : this.full(comment, metadata);
-  
+
   /**
    * Return the element associated with this declaration, or {@code null} if either this node
    * corresponds to a list of declarations or if the AST structure has not been resolved.
@@ -3999,7 +4031,6 @@
    */
   Element get element;
 }
-
 /**
  * Instances of the class {@code DeclaredIdentifier} represent the declaration of a single
  * identifier.
@@ -4009,24 +4040,24 @@
  * @coverage dart.engine.ast
  */
 class DeclaredIdentifier extends Declaration {
-  
+
   /**
    * The token representing either the 'final', 'const' or 'var' keyword, or {@code null} if no
    * keyword was used.
    */
   Token _keyword;
-  
+
   /**
    * The name of the declared type of the parameter, or {@code null} if the parameter does not have
    * a declared type.
    */
   TypeName _type;
-  
+
   /**
    * The name of the variable being declared.
    */
   SimpleIdentifier _identifier;
-  
+
   /**
    * Initialize a newly created formal parameter.
    * @param comment the documentation comment associated with this parameter
@@ -4040,7 +4071,7 @@
     this._type = becomeParentOf(type);
     this._identifier = becomeParentOf(identifier);
   }
-  
+
   /**
    * Initialize a newly created formal parameter.
    * @param comment the documentation comment associated with this parameter
@@ -4059,32 +4090,32 @@
     return identifier2.element as LocalVariableElement;
   }
   Token get endToken => _identifier.endToken;
-  
+
   /**
    * Return the name of the variable being declared.
    * @return the name of the variable being declared
    */
   SimpleIdentifier get identifier => _identifier;
-  
+
   /**
    * Return the token representing either the 'final', 'const' or 'var' keyword.
    * @return the token representing either the 'final', 'const' or 'var' keyword
    */
   Token get keyword => _keyword;
-  
+
   /**
    * Return the name of the declared type of the parameter, or {@code null} if the parameter does
    * not have a declared type.
    * @return the name of the declared type of the parameter
    */
   TypeName get type => _type;
-  
+
   /**
    * Return {@code true} if this variable was declared with the 'const' modifier.
    * @return {@code true} if this variable was declared with the 'const' modifier
    */
   bool isConst() => (_keyword is KeywordToken) && identical(((_keyword as KeywordToken)).keyword, Keyword.CONST);
-  
+
   /**
    * Return {@code true} if this variable was declared with the 'final' modifier. Variables that are
    * declared with the 'const' modifier will return {@code false} even though they are implicitly
@@ -4092,7 +4123,7 @@
    * @return {@code true} if this variable was declared with the 'final' modifier
    */
   bool isFinal() => (_keyword is KeywordToken) && identical(((_keyword as KeywordToken)).keyword, Keyword.FINAL);
-  
+
   /**
    * Set the token representing either the 'final', 'const' or 'var' keyword to the given token.
    * @param keyword the token representing either the 'final', 'const' or 'var' keyword
@@ -4100,7 +4131,7 @@
   void set keyword(Token keyword2) {
     this._keyword = keyword2;
   }
-  
+
   /**
    * Set the name of the declared type of the parameter to the given type name.
    * @param typeName the name of the declared type of the parameter
@@ -4122,7 +4153,6 @@
     return _identifier.beginToken;
   }
 }
-
 /**
  * Instances of the class {@code DefaultFormalParameter} represent a formal parameter with a default
  * value. There are two kinds of parameters that are both represented by this class: named formal
@@ -4134,29 +4164,29 @@
  * @coverage dart.engine.ast
  */
 class DefaultFormalParameter extends FormalParameter {
-  
+
   /**
    * The formal parameter with which the default value is associated.
    */
   NormalFormalParameter _parameter;
-  
+
   /**
    * The kind of this parameter.
    */
   ParameterKind _kind;
-  
+
   /**
    * The token separating the parameter from the default value, or {@code null} if there is no
    * default value.
    */
   Token _separator;
-  
+
   /**
    * The expression computing the default value for the parameter, or {@code null} if there is no
    * default value.
    */
   Expression _defaultValue;
-  
+
   /**
    * Initialize a newly created default formal parameter.
    * @param parameter the formal parameter with which the default value is associated
@@ -4170,7 +4200,7 @@
     this._separator = separator;
     this._defaultValue = becomeParentOf(defaultValue);
   }
-  
+
   /**
    * Initialize a newly created default formal parameter.
    * @param parameter the formal parameter with which the default value is associated
@@ -4181,7 +4211,7 @@
   DefaultFormalParameter({NormalFormalParameter parameter, ParameterKind kind, Token separator, Expression defaultValue}) : this.full(parameter, kind, separator, defaultValue);
   accept(ASTVisitor visitor) => visitor.visitDefaultFormalParameter(this);
   Token get beginToken => _parameter.beginToken;
-  
+
   /**
    * Return the expression computing the default value for the parameter, or {@code null} if there
    * is no default value.
@@ -4196,26 +4226,26 @@
   }
   SimpleIdentifier get identifier => _parameter.identifier;
   ParameterKind get kind => _kind;
-  
+
   /**
    * Return the formal parameter with which the default value is associated.
    * @return the formal parameter with which the default value is associated
    */
   NormalFormalParameter get parameter => _parameter;
-  
+
   /**
    * Return the token separating the parameter from the default value, or {@code null} if there is
    * no default value.
    * @return the token separating the parameter from the default value
    */
   Token get separator => _separator;
-  
+
   /**
    * Return {@code true} if this parameter was declared with the 'const' modifier.
    * @return {@code true} if this parameter was declared with the 'const' modifier
    */
   bool isConst() => _parameter != null && _parameter.isConst();
-  
+
   /**
    * Return {@code true} if this parameter was declared with the 'final' modifier. Parameters that
    * are declared with the 'const' modifier will return {@code false} even though they are
@@ -4223,7 +4253,7 @@
    * @return {@code true} if this parameter was declared with the 'final' modifier
    */
   bool isFinal() => _parameter != null && _parameter.isFinal();
-  
+
   /**
    * Set the expression computing the default value for the parameter to the given expression.
    * @param expression the expression computing the default value for the parameter
@@ -4231,7 +4261,7 @@
   void set defaultValue(Expression expression) {
     _defaultValue = becomeParentOf(expression);
   }
-  
+
   /**
    * Set the kind of this parameter to the given kind.
    * @param kind the kind of this parameter
@@ -4239,7 +4269,7 @@
   void set kind(ParameterKind kind2) {
     this._kind = kind2;
   }
-  
+
   /**
    * Set the formal parameter with which the default value is associated to the given parameter.
    * @param formalParameter the formal parameter with which the default value is associated
@@ -4247,7 +4277,7 @@
   void set parameter(NormalFormalParameter formalParameter) {
     _parameter = becomeParentOf(formalParameter);
   }
-  
+
   /**
    * Set the token separating the parameter from the default value to the given token.
    * @param separator the token separating the parameter from the default value
@@ -4260,7 +4290,6 @@
     safelyVisitChild(_defaultValue, visitor);
   }
 }
-
 /**
  * The abstract class {@code Directive} defines the behavior common to nodes that represent a
  * directive.
@@ -4269,13 +4298,13 @@
  * @coverage dart.engine.ast
  */
 abstract class Directive extends AnnotatedNode {
-  
+
   /**
    * The element associated with this directive, or {@code null} if the AST structure has not been
    * resolved or if this directive could not be resolved.
    */
   Element _element;
-  
+
   /**
    * Initialize a newly create directive.
    * @param comment the documentation comment associated with this directive
@@ -4283,14 +4312,14 @@
    */
   Directive.full(Comment comment, List<Annotation> metadata) : super.full(comment, metadata) {
   }
-  
+
   /**
    * Initialize a newly create directive.
    * @param comment the documentation comment associated with this directive
    * @param metadata the annotations associated with the directive
    */
   Directive({Comment comment, List<Annotation> metadata}) : this.full(comment, metadata);
-  
+
   /**
    * Return the element associated with this directive, or {@code null} if the AST structure has not
    * been resolved or if this directive could not be resolved. Examples of the latter case include a
@@ -4298,14 +4327,14 @@
    * @return the element associated with this directive
    */
   Element get element => _element;
-  
+
   /**
    * Return the token representing the keyword that introduces this directive ('import', 'export',
    * 'library' or 'part').
    * @return the token representing the keyword that introduces this directive
    */
   Token get keyword;
-  
+
   /**
    * Set the element associated with this directive to the given element.
    * @param element the element associated with this directive
@@ -4314,7 +4343,6 @@
     this._element = element2;
   }
 }
-
 /**
  * Instances of the class {@code DoStatement} represent a do statement.
  * <pre>
@@ -4324,42 +4352,42 @@
  * @coverage dart.engine.ast
  */
 class DoStatement extends Statement {
-  
+
   /**
    * The token representing the 'do' keyword.
    */
   Token _doKeyword;
-  
+
   /**
    * The body of the loop.
    */
   Statement _body;
-  
+
   /**
    * The token representing the 'while' keyword.
    */
   Token _whileKeyword;
-  
+
   /**
    * The left parenthesis.
    */
   Token _leftParenthesis;
-  
+
   /**
    * The condition that determines when the loop will terminate.
    */
   Expression _condition;
-  
+
   /**
    * The right parenthesis.
    */
   Token _rightParenthesis;
-  
+
   /**
    * The semicolon terminating the statement.
    */
   Token _semicolon;
-  
+
   /**
    * Initialize a newly created do loop.
    * @param doKeyword the token representing the 'do' keyword
@@ -4379,7 +4407,7 @@
     this._rightParenthesis = rightParenthesis;
     this._semicolon = semicolon;
   }
-  
+
   /**
    * Initialize a newly created do loop.
    * @param doKeyword the token representing the 'do' keyword
@@ -4393,50 +4421,50 @@
   DoStatement({Token doKeyword, Statement body, Token whileKeyword, Token leftParenthesis, Expression condition, Token rightParenthesis, Token semicolon}) : this.full(doKeyword, body, whileKeyword, leftParenthesis, condition, rightParenthesis, semicolon);
   accept(ASTVisitor visitor) => visitor.visitDoStatement(this);
   Token get beginToken => _doKeyword;
-  
+
   /**
    * Return the body of the loop.
    * @return the body of the loop
    */
   Statement get body => _body;
-  
+
   /**
    * Return the condition that determines when the loop will terminate.
    * @return the condition that determines when the loop will terminate
    */
   Expression get condition => _condition;
-  
+
   /**
    * Return the token representing the 'do' keyword.
    * @return the token representing the 'do' keyword
    */
   Token get doKeyword => _doKeyword;
   Token get endToken => _semicolon;
-  
+
   /**
    * Return the left parenthesis.
    * @return the left parenthesis
    */
   Token get leftParenthesis => _leftParenthesis;
-  
+
   /**
    * Return the right parenthesis.
    * @return the right parenthesis
    */
   Token get rightParenthesis => _rightParenthesis;
-  
+
   /**
    * Return the semicolon terminating the statement.
    * @return the semicolon terminating the statement
    */
   Token get semicolon => _semicolon;
-  
+
   /**
    * Return the token representing the 'while' keyword.
    * @return the token representing the 'while' keyword
    */
   Token get whileKeyword => _whileKeyword;
-  
+
   /**
    * Set the body of the loop to the given statement.
    * @param statement the body of the loop
@@ -4444,7 +4472,7 @@
   void set body(Statement statement) {
     _body = becomeParentOf(statement);
   }
-  
+
   /**
    * Set the condition that determines when the loop will terminate to the given expression.
    * @param expression the condition that determines when the loop will terminate
@@ -4452,7 +4480,7 @@
   void set condition(Expression expression) {
     _condition = becomeParentOf(expression);
   }
-  
+
   /**
    * Set the token representing the 'do' keyword to the given token.
    * @param doKeyword the token representing the 'do' keyword
@@ -4460,7 +4488,7 @@
   void set doKeyword(Token doKeyword2) {
     this._doKeyword = doKeyword2;
   }
-  
+
   /**
    * Set the left parenthesis to the given token.
    * @param parenthesis the left parenthesis
@@ -4468,7 +4496,7 @@
   void set leftParenthesis(Token parenthesis) {
     _leftParenthesis = parenthesis;
   }
-  
+
   /**
    * Set the right parenthesis to the given token.
    * @param parenthesis the right parenthesis
@@ -4476,7 +4504,7 @@
   void set rightParenthesis(Token parenthesis) {
     _rightParenthesis = parenthesis;
   }
-  
+
   /**
    * Set the semicolon terminating the statement to the given token.
    * @param semicolon the semicolon terminating the statement
@@ -4484,7 +4512,7 @@
   void set semicolon(Token semicolon2) {
     this._semicolon = semicolon2;
   }
-  
+
   /**
    * Set the token representing the 'while' keyword to the given token.
    * @param whileKeyword the token representing the 'while' keyword
@@ -4497,7 +4525,6 @@
     safelyVisitChild(_condition, visitor);
   }
 }
-
 /**
  * Instances of the class {@code DoubleLiteral} represent a floating point literal expression.
  * <pre>
@@ -4510,17 +4537,17 @@
  * @coverage dart.engine.ast
  */
 class DoubleLiteral extends Literal {
-  
+
   /**
    * The token representing the literal.
    */
   Token _literal;
-  
+
   /**
    * The value of the literal.
    */
   double _value = 0.0;
-  
+
   /**
    * Initialize a newly created floating point literal.
    * @param literal the token representing the literal
@@ -4530,7 +4557,7 @@
     this._literal = literal;
     this._value = value;
   }
-  
+
   /**
    * Initialize a newly created floating point literal.
    * @param literal the token representing the literal
@@ -4540,19 +4567,19 @@
   accept(ASTVisitor visitor) => visitor.visitDoubleLiteral(this);
   Token get beginToken => _literal;
   Token get endToken => _literal;
-  
+
   /**
    * Return the token representing the literal.
    * @return the token representing the literal
    */
   Token get literal => _literal;
-  
+
   /**
    * Return the value of the literal.
    * @return the value of the literal
    */
   double get value => _value;
-  
+
   /**
    * Set the token representing the literal to the given token.
    * @param literal the token representing the literal
@@ -4560,7 +4587,7 @@
   void set literal(Token literal2) {
     this._literal = literal2;
   }
-  
+
   /**
    * Set the value of the literal to the given value.
    * @param value the value of the literal
@@ -4571,7 +4598,6 @@
   void visitChildren(ASTVisitor<Object> visitor) {
   }
 }
-
 /**
  * Instances of the class {@code EmptyFunctionBody} represent an empty function body, which can only
  * appear in constructors or abstract methods.
@@ -4582,12 +4608,12 @@
  * @coverage dart.engine.ast
  */
 class EmptyFunctionBody extends FunctionBody {
-  
+
   /**
    * The token representing the semicolon that marks the end of the function body.
    */
   Token _semicolon;
-  
+
   /**
    * Initialize a newly created function body.
    * @param semicolon the token representing the semicolon that marks the end of the function body
@@ -4595,7 +4621,7 @@
   EmptyFunctionBody.full(Token semicolon) {
     this._semicolon = semicolon;
   }
-  
+
   /**
    * Initialize a newly created function body.
    * @param semicolon the token representing the semicolon that marks the end of the function body
@@ -4604,13 +4630,13 @@
   accept(ASTVisitor visitor) => visitor.visitEmptyFunctionBody(this);
   Token get beginToken => _semicolon;
   Token get endToken => _semicolon;
-  
+
   /**
    * Return the token representing the semicolon that marks the end of the function body.
    * @return the token representing the semicolon that marks the end of the function body
    */
   Token get semicolon => _semicolon;
-  
+
   /**
    * Set the token representing the semicolon that marks the end of the function body to the given
    * token.
@@ -4622,7 +4648,6 @@
   void visitChildren(ASTVisitor<Object> visitor) {
   }
 }
-
 /**
  * Instances of the class {@code EmptyStatement} represent an empty statement.
  * <pre>
@@ -4632,12 +4657,12 @@
  * @coverage dart.engine.ast
  */
 class EmptyStatement extends Statement {
-  
+
   /**
    * The semicolon terminating the statement.
    */
   Token _semicolon;
-  
+
   /**
    * Initialize a newly created empty statement.
    * @param semicolon the semicolon terminating the statement
@@ -4645,7 +4670,7 @@
   EmptyStatement.full(Token semicolon) {
     this._semicolon = semicolon;
   }
-  
+
   /**
    * Initialize a newly created empty statement.
    * @param semicolon the semicolon terminating the statement
@@ -4654,13 +4679,13 @@
   accept(ASTVisitor visitor) => visitor.visitEmptyStatement(this);
   Token get beginToken => _semicolon;
   Token get endToken => _semicolon;
-  
+
   /**
    * Return the semicolon terminating the statement.
    * @return the semicolon terminating the statement
    */
   Token get semicolon => _semicolon;
-  
+
   /**
    * Set the semicolon terminating the statement to the given token.
    * @param semicolon the semicolon terminating the statement
@@ -4671,7 +4696,6 @@
   void visitChildren(ASTVisitor<Object> visitor) {
   }
 }
-
 /**
  * Ephemeral identifiers are created as needed to mimic the presence of an empty identifier.
  * @coverage dart.engine.ast
@@ -4682,7 +4706,6 @@
   }
   EphemeralIdentifier({ASTNode parent, int location}) : this.full(parent, location);
 }
-
 /**
  * Instances of the class {@code ExportDirective} represent an export directive.
  * <pre>
@@ -4691,7 +4714,7 @@
  * @coverage dart.engine.ast
  */
 class ExportDirective extends NamespaceDirective {
-  
+
   /**
    * Initialize a newly created export directive.
    * @param comment the documentation comment associated with this directive
@@ -4703,7 +4726,7 @@
    */
   ExportDirective.full(Comment comment, List<Annotation> metadata, Token keyword, StringLiteral libraryUri, List<Combinator> combinators, Token semicolon) : super.full(comment, metadata, keyword, libraryUri, combinators, semicolon) {
   }
-  
+
   /**
    * Initialize a newly created export directive.
    * @param comment the documentation comment associated with this directive
@@ -4727,7 +4750,6 @@
     combinators.accept(visitor);
   }
 }
-
 /**
  * Instances of the class {@code Expression} defines the behavior common to nodes that represent an
  * expression.
@@ -4737,66 +4759,100 @@
  * @coverage dart.engine.ast
  */
 abstract class Expression extends ASTNode {
-  
+
   /**
    * The static type of this expression, or {@code null} if the AST structure has not been resolved.
    */
   Type2 _staticType;
-  
+
   /**
    * The propagated type of this expression, or {@code null} if type propagation has not been
    * performed on the AST structure.
    */
   Type2 _propagatedType;
-  
+
   /**
    * If this expression is an argument to an invocation, and the AST structure has been resolved,
-   * and the function being invoked is known, and this expression corresponds to one of the
-   * parameters of the function being invoked, then return the parameter element representing the
-   * parameter to which the value of this expression will be bound. Otherwise, return {@code null}.
+   * and the function being invoked is known based on propagated type information, and this
+   * expression corresponds to one of the parameters of the function being invoked, then return the
+   * parameter element representing the parameter to which the value of this expression will be
+   * bound. Otherwise, return {@code null}.
    * @return the parameter element representing the parameter to which the value of this expression
    * will be bound
    */
   ParameterElement get parameterElement {
     ASTNode parent2 = parent;
     if (parent2 is ArgumentList) {
-      return ((parent2 as ArgumentList)).getParameterElementFor(this);
-    }
-    if (parent2 is IndexExpression) {
+      return ((parent2 as ArgumentList)).getPropagatedParameterElementFor(this);
+    } else if (parent2 is IndexExpression) {
       IndexExpression indexExpression = parent2 as IndexExpression;
       if (identical(indexExpression.index, this)) {
-        return indexExpression.parameterElementForIndex;
+        return indexExpression.propagatedParameterElementForIndex;
       }
-    }
-    if (parent2 is BinaryExpression) {
+    } else if (parent2 is BinaryExpression) {
       BinaryExpression binaryExpression = parent2 as BinaryExpression;
       if (identical(binaryExpression.rightOperand, this)) {
-        return binaryExpression.parameterElementForRightOperand;
+        return binaryExpression.propagatedParameterElementForRightOperand;
       }
+    } else if (parent2 is PrefixExpression) {
+      return ((parent2 as PrefixExpression)).propagatedParameterElementForOperand;
+    } else if (parent2 is PostfixExpression) {
+      return ((parent2 as PostfixExpression)).propagatedParameterElementForOperand;
     }
     return null;
   }
-  
+
   /**
    * Return the propagated type of this expression, or {@code null} if type propagation has not been
    * performed on the AST structure.
    * @return the propagated type of this expression
    */
   Type2 get propagatedType => _propagatedType;
-  
+
+  /**
+   * If this expression is an argument to an invocation, and the AST structure has been resolved,
+   * and the function being invoked is known based on static type information, and this expression
+   * corresponds to one of the parameters of the function being invoked, then return the parameter
+   * element representing the parameter to which the value of this expression will be bound.
+   * Otherwise, return {@code null}.
+   * @return the parameter element representing the parameter to which the value of this expression
+   * will be bound
+   */
+  ParameterElement get staticParameterElement {
+    ASTNode parent2 = parent;
+    if (parent2 is ArgumentList) {
+      return ((parent2 as ArgumentList)).getStaticParameterElementFor(this);
+    } else if (parent2 is IndexExpression) {
+      IndexExpression indexExpression = parent2 as IndexExpression;
+      if (identical(indexExpression.index, this)) {
+        return indexExpression.staticParameterElementForIndex;
+      }
+    } else if (parent2 is BinaryExpression) {
+      BinaryExpression binaryExpression = parent2 as BinaryExpression;
+      if (identical(binaryExpression.rightOperand, this)) {
+        return binaryExpression.staticParameterElementForRightOperand;
+      }
+    } else if (parent2 is PrefixExpression) {
+      return ((parent2 as PrefixExpression)).staticParameterElementForOperand;
+    } else if (parent2 is PostfixExpression) {
+      return ((parent2 as PostfixExpression)).staticParameterElementForOperand;
+    }
+    return null;
+  }
+
   /**
    * Return the static type of this expression, or {@code null} if the AST structure has not been
    * resolved.
    * @return the static type of this expression
    */
   Type2 get staticType => _staticType;
-  
+
   /**
    * Return {@code true} if this expression is syntactically valid for the LHS of an{@link AssignmentExpression assignment expression}.
    * @return {@code true} if this expression matches the {@code assignableExpression} production
    */
   bool isAssignable() => false;
-  
+
   /**
    * Set the propagated type of this expression to the given type.
    * @param propagatedType the propagated type of this expression
@@ -4804,7 +4860,7 @@
   void set propagatedType(Type2 propagatedType2) {
     this._propagatedType = propagatedType2;
   }
-  
+
   /**
    * Set the static type of this expression to the given type.
    * @param staticType the static type of this expression
@@ -4813,7 +4869,6 @@
     this._staticType = staticType2;
   }
 }
-
 /**
  * Instances of the class {@code ExpressionFunctionBody} represent a function body consisting of a
  * single expression.
@@ -4824,22 +4879,22 @@
  * @coverage dart.engine.ast
  */
 class ExpressionFunctionBody extends FunctionBody {
-  
+
   /**
    * The token introducing the expression that represents the body of the function.
    */
   Token _functionDefinition;
-  
+
   /**
    * The expression representing the body of the function.
    */
   Expression _expression;
-  
+
   /**
    * The semicolon terminating the statement.
    */
   Token _semicolon;
-  
+
   /**
    * Initialize a newly created function body consisting of a block of statements.
    * @param functionDefinition the token introducing the expression that represents the body of the
@@ -4852,7 +4907,7 @@
     this._expression = becomeParentOf(expression);
     this._semicolon = semicolon;
   }
-  
+
   /**
    * Initialize a newly created function body consisting of a block of statements.
    * @param functionDefinition the token introducing the expression that represents the body of the
@@ -4869,25 +4924,25 @@
     }
     return _expression.endToken;
   }
-  
+
   /**
    * Return the expression representing the body of the function.
    * @return the expression representing the body of the function
    */
   Expression get expression => _expression;
-  
+
   /**
    * Return the token introducing the expression that represents the body of the function.
    * @return the function definition token
    */
   Token get functionDefinition => _functionDefinition;
-  
+
   /**
    * Return the semicolon terminating the statement.
    * @return the semicolon terminating the statement
    */
   Token get semicolon => _semicolon;
-  
+
   /**
    * Set the expression representing the body of the function to the given expression.
    * @param expression the expression representing the body of the function
@@ -4895,7 +4950,7 @@
   void set expression(Expression expression2) {
     this._expression = becomeParentOf(expression2);
   }
-  
+
   /**
    * Set the token introducing the expression that represents the body of the function to the given
    * token.
@@ -4904,7 +4959,7 @@
   void set functionDefinition(Token functionDefinition2) {
     this._functionDefinition = functionDefinition2;
   }
-  
+
   /**
    * Set the semicolon terminating the statement to the given token.
    * @param semicolon the semicolon terminating the statement
@@ -4916,7 +4971,6 @@
     safelyVisitChild(_expression, visitor);
   }
 }
-
 /**
  * Instances of the class {@code ExpressionStatement} wrap an expression as a statement.
  * <pre>
@@ -4925,18 +4979,18 @@
  * @coverage dart.engine.ast
  */
 class ExpressionStatement extends Statement {
-  
+
   /**
    * The expression that comprises the statement.
    */
   Expression _expression;
-  
+
   /**
    * The semicolon terminating the statement, or {@code null} if the expression is a function
    * expression and isn't followed by a semicolon.
    */
   Token _semicolon;
-  
+
   /**
    * Initialize a newly created expression statement.
    * @param expression the expression that comprises the statement
@@ -4946,7 +5000,7 @@
     this._expression = becomeParentOf(expression);
     this._semicolon = semicolon;
   }
-  
+
   /**
    * Initialize a newly created expression statement.
    * @param expression the expression that comprises the statement
@@ -4961,20 +5015,20 @@
     }
     return _expression.endToken;
   }
-  
+
   /**
    * Return the expression that comprises the statement.
    * @return the expression that comprises the statement
    */
   Expression get expression => _expression;
-  
+
   /**
    * Return the semicolon terminating the statement.
    * @return the semicolon terminating the statement
    */
   Token get semicolon => _semicolon;
   bool isSynthetic() => _expression.isSynthetic() && _semicolon.isSynthetic();
-  
+
   /**
    * Set the expression that comprises the statement to the given expression.
    * @param expression the expression that comprises the statement
@@ -4982,7 +5036,7 @@
   void set expression(Expression expression2) {
     this._expression = becomeParentOf(expression2);
   }
-  
+
   /**
    * Set the semicolon terminating the statement to the given token.
    * @param semicolon the semicolon terminating the statement
@@ -4994,7 +5048,6 @@
     safelyVisitChild(_expression, visitor);
   }
 }
-
 /**
  * Instances of the class {@code ExtendsClause} represent the "extends" clause in a class
  * declaration.
@@ -5004,17 +5057,17 @@
  * @coverage dart.engine.ast
  */
 class ExtendsClause extends ASTNode {
-  
+
   /**
    * The token representing the 'extends' keyword.
    */
   Token _keyword;
-  
+
   /**
    * The name of the class that is being extended.
    */
   TypeName _superclass;
-  
+
   /**
    * Initialize a newly created extends clause.
    * @param keyword the token representing the 'extends' keyword
@@ -5024,7 +5077,7 @@
     this._keyword = keyword;
     this._superclass = becomeParentOf(superclass);
   }
-  
+
   /**
    * Initialize a newly created extends clause.
    * @param keyword the token representing the 'extends' keyword
@@ -5034,19 +5087,19 @@
   accept(ASTVisitor visitor) => visitor.visitExtendsClause(this);
   Token get beginToken => _keyword;
   Token get endToken => _superclass.endToken;
-  
+
   /**
    * Return the token representing the 'extends' keyword.
    * @return the token representing the 'extends' keyword
    */
   Token get keyword => _keyword;
-  
+
   /**
    * Return the name of the class that is being extended.
    * @return the name of the class that is being extended
    */
   TypeName get superclass => _superclass;
-  
+
   /**
    * Set the token representing the 'extends' keyword to the given token.
    * @param keyword the token representing the 'extends' keyword
@@ -5054,7 +5107,7 @@
   void set keyword(Token keyword2) {
     this._keyword = keyword2;
   }
-  
+
   /**
    * Set the name of the class that is being extended to the given name.
    * @param name the name of the class that is being extended
@@ -5066,7 +5119,6 @@
     safelyVisitChild(_superclass, visitor);
   }
 }
-
 /**
  * Instances of the class {@code FieldDeclaration} represent the declaration of one or more fields
  * of the same type.
@@ -5077,22 +5129,22 @@
  * @coverage dart.engine.ast
  */
 class FieldDeclaration extends ClassMember {
-  
+
   /**
    * The token representing the 'static' keyword, or {@code null} if the fields are not static.
    */
   Token _keyword;
-  
+
   /**
    * The fields being declared.
    */
   VariableDeclarationList _fieldList;
-  
+
   /**
    * The semicolon terminating the declaration.
    */
   Token _semicolon;
-  
+
   /**
    * Initialize a newly created field declaration.
    * @param comment the documentation comment associated with this field
@@ -5106,7 +5158,7 @@
     this._fieldList = becomeParentOf(fieldList);
     this._semicolon = semicolon;
   }
-  
+
   /**
    * Initialize a newly created field declaration.
    * @param comment the documentation comment associated with this field
@@ -5119,32 +5171,32 @@
   accept(ASTVisitor visitor) => visitor.visitFieldDeclaration(this);
   Element get element => null;
   Token get endToken => _semicolon;
-  
+
   /**
    * Return the fields being declared.
    * @return the fields being declared
    */
   VariableDeclarationList get fields => _fieldList;
-  
+
   /**
    * Return the token representing the 'static' keyword, or {@code null} if the fields are not
    * static.
    * @return the token representing the 'static' keyword
    */
   Token get keyword => _keyword;
-  
+
   /**
    * Return the semicolon terminating the declaration.
    * @return the semicolon terminating the declaration
    */
   Token get semicolon => _semicolon;
-  
+
   /**
    * Return {@code true} if the fields are static.
    * @return {@code true} if the fields are declared to be static
    */
   bool isStatic() => _keyword != null;
-  
+
   /**
    * Set the fields being declared to the given list of variables.
    * @param fieldList the fields being declared
@@ -5152,7 +5204,7 @@
   void set fields(VariableDeclarationList fieldList) {
     fieldList = becomeParentOf(fieldList);
   }
-  
+
   /**
    * Set the token representing the 'static' keyword to the given token.
    * @param keyword the token representing the 'static' keyword
@@ -5160,7 +5212,7 @@
   void set keyword(Token keyword2) {
     this._keyword = keyword2;
   }
-  
+
   /**
    * Set the semicolon terminating the declaration to the given token.
    * @param semicolon the semicolon terminating the declaration
@@ -5179,7 +5231,6 @@
     return _fieldList.beginToken;
   }
 }
-
 /**
  * Instances of the class {@code FieldFormalParameter} represent a field formal parameter.
  * <pre>
@@ -5188,29 +5239,29 @@
  * @coverage dart.engine.ast
  */
 class FieldFormalParameter extends NormalFormalParameter {
-  
+
   /**
    * The token representing either the 'final', 'const' or 'var' keyword, or {@code null} if no
    * keyword was used.
    */
   Token _keyword;
-  
+
   /**
    * The name of the declared type of the parameter, or {@code null} if the parameter does not have
    * a declared type.
    */
   TypeName _type;
-  
+
   /**
    * The token representing the 'this' keyword.
    */
   Token _thisToken;
-  
+
   /**
    * The token representing the period.
    */
   Token _period;
-  
+
   /**
    * Initialize a newly created formal parameter.
    * @param comment the documentation comment associated with this parameter
@@ -5227,7 +5278,7 @@
     this._thisToken = thisToken;
     this._period = period;
   }
-  
+
   /**
    * Initialize a newly created formal parameter.
    * @param comment the documentation comment associated with this parameter
@@ -5249,25 +5300,25 @@
     return _thisToken;
   }
   Token get endToken => identifier.endToken;
-  
+
   /**
    * Return the token representing either the 'final', 'const' or 'var' keyword.
    * @return the token representing either the 'final', 'const' or 'var' keyword
    */
   Token get keyword => _keyword;
-  
+
   /**
    * Return the token representing the period.
    * @return the token representing the period
    */
   Token get period => _period;
-  
+
   /**
    * Return the token representing the 'this' keyword.
    * @return the token representing the 'this' keyword
    */
   Token get thisToken => _thisToken;
-  
+
   /**
    * Return the name of the declared type of the parameter, or {@code null} if the parameter does
    * not have a declared type.
@@ -5276,7 +5327,7 @@
   TypeName get type => _type;
   bool isConst() => (_keyword is KeywordToken) && identical(((_keyword as KeywordToken)).keyword, Keyword.CONST);
   bool isFinal() => (_keyword is KeywordToken) && identical(((_keyword as KeywordToken)).keyword, Keyword.FINAL);
-  
+
   /**
    * Set the token representing either the 'final', 'const' or 'var' keyword to the given token.
    * @param keyword the token representing either the 'final', 'const' or 'var' keyword
@@ -5284,7 +5335,7 @@
   void set keyword(Token keyword2) {
     this._keyword = keyword2;
   }
-  
+
   /**
    * Set the token representing the period to the given token.
    * @param period the token representing the period
@@ -5292,7 +5343,7 @@
   void set period(Token period2) {
     this._period = period2;
   }
-  
+
   /**
    * Set the token representing the 'this' keyword to the given token.
    * @param thisToken the token representing the 'this' keyword
@@ -5300,7 +5351,7 @@
   void set thisToken(Token thisToken2) {
     this._thisToken = thisToken2;
   }
-  
+
   /**
    * Set the name of the declared type of the parameter to the given type name.
    * @param typeName the name of the declared type of the parameter
@@ -5314,7 +5365,6 @@
     safelyVisitChild(identifier, visitor);
   }
 }
-
 /**
  * Instances of the class {@code ForEachStatement} represent a for-each statement.
  * <pre>
@@ -5323,42 +5373,42 @@
  * @coverage dart.engine.ast
  */
 class ForEachStatement extends Statement {
-  
+
   /**
    * The token representing the 'for' keyword.
    */
   Token _forKeyword;
-  
+
   /**
    * The left parenthesis.
    */
   Token _leftParenthesis;
-  
+
   /**
    * The declaration of the loop variable.
    */
   DeclaredIdentifier _loopVariable;
-  
+
   /**
    * The token representing the 'in' keyword.
    */
   Token _inKeyword;
-  
+
   /**
    * The expression evaluated to produce the iterator.
    */
   Expression _iterator;
-  
+
   /**
    * The right parenthesis.
    */
   Token _rightParenthesis;
-  
+
   /**
    * The body of the loop.
    */
   Statement _body;
-  
+
   /**
    * Initialize a newly created for-each statement.
    * @param forKeyword the token representing the 'for' keyword
@@ -5377,7 +5427,7 @@
     this._rightParenthesis = rightParenthesis;
     this._body = becomeParentOf(body);
   }
-  
+
   /**
    * Initialize a newly created for-each statement.
    * @param forKeyword the token representing the 'for' keyword
@@ -5390,50 +5440,50 @@
   ForEachStatement({Token forKeyword, Token leftParenthesis, DeclaredIdentifier loopVariable, Token inKeyword, Expression iterator, Token rightParenthesis, Statement body}) : this.full(forKeyword, leftParenthesis, loopVariable, inKeyword, iterator, rightParenthesis, body);
   accept(ASTVisitor visitor) => visitor.visitForEachStatement(this);
   Token get beginToken => _forKeyword;
-  
+
   /**
    * Return the body of the loop.
    * @return the body of the loop
    */
   Statement get body => _body;
   Token get endToken => _body.endToken;
-  
+
   /**
    * Return the token representing the 'for' keyword.
    * @return the token representing the 'for' keyword
    */
   Token get forKeyword => _forKeyword;
-  
+
   /**
    * Return the token representing the 'in' keyword.
    * @return the token representing the 'in' keyword
    */
   Token get inKeyword => _inKeyword;
-  
+
   /**
    * Return the expression evaluated to produce the iterator.
    * @return the expression evaluated to produce the iterator
    */
   Expression get iterator => _iterator;
-  
+
   /**
    * Return the left parenthesis.
    * @return the left parenthesis
    */
   Token get leftParenthesis => _leftParenthesis;
-  
+
   /**
    * Return the declaration of the loop variable.
    * @return the declaration of the loop variable
    */
   DeclaredIdentifier get loopVariable => _loopVariable;
-  
+
   /**
    * Return the right parenthesis.
    * @return the right parenthesis
    */
   Token get rightParenthesis => _rightParenthesis;
-  
+
   /**
    * Set the body of the loop to the given block.
    * @param body the body of the loop
@@ -5441,7 +5491,7 @@
   void set body(Statement body2) {
     this._body = becomeParentOf(body2);
   }
-  
+
   /**
    * Set the token representing the 'for' keyword to the given token.
    * @param forKeyword the token representing the 'for' keyword
@@ -5449,7 +5499,7 @@
   void set forKeyword(Token forKeyword2) {
     this._forKeyword = forKeyword2;
   }
-  
+
   /**
    * Set the token representing the 'in' keyword to the given token.
    * @param inKeyword the token representing the 'in' keyword
@@ -5457,7 +5507,7 @@
   void set inKeyword(Token inKeyword2) {
     this._inKeyword = inKeyword2;
   }
-  
+
   /**
    * Set the expression evaluated to produce the iterator to the given expression.
    * @param expression the expression evaluated to produce the iterator
@@ -5465,7 +5515,7 @@
   void set iterator(Expression expression) {
     _iterator = becomeParentOf(expression);
   }
-  
+
   /**
    * Set the left parenthesis to the given token.
    * @param leftParenthesis the left parenthesis
@@ -5473,7 +5523,7 @@
   void set leftParenthesis(Token leftParenthesis2) {
     this._leftParenthesis = leftParenthesis2;
   }
-  
+
   /**
    * Set the declaration of the loop variable to the given variable.
    * @param variable the declaration of the loop variable
@@ -5481,7 +5531,7 @@
   void set loopVariable(DeclaredIdentifier variable) {
     _loopVariable = becomeParentOf(variable);
   }
-  
+
   /**
    * Set the right parenthesis to the given token.
    * @param rightParenthesis the right parenthesis
@@ -5495,7 +5545,6 @@
     safelyVisitChild(_body, visitor);
   }
 }
-
 /**
  * Instances of the class {@code ForStatement} represent a for statement.
  * <pre>
@@ -5507,61 +5556,61 @@
  * @coverage dart.engine.ast
  */
 class ForStatement extends Statement {
-  
+
   /**
    * The token representing the 'for' keyword.
    */
   Token _forKeyword;
-  
+
   /**
    * The left parenthesis.
    */
   Token _leftParenthesis;
-  
+
   /**
    * The declaration of the loop variables, or {@code null} if there are no variables. Note that a
    * for statement cannot have both a variable list and an initialization expression, but can
    * validly have neither.
    */
   VariableDeclarationList _variableList;
-  
+
   /**
    * The initialization expression, or {@code null} if there is no initialization expression. Note
    * that a for statement cannot have both a variable list and an initialization expression, but can
    * validly have neither.
    */
   Expression _initialization;
-  
+
   /**
    * The semicolon separating the initializer and the condition.
    */
   Token _leftSeparator;
-  
+
   /**
    * The condition used to determine when to terminate the loop.
    */
   Expression _condition;
-  
+
   /**
    * The semicolon separating the condition and the updater.
    */
   Token _rightSeparator;
-  
+
   /**
    * The list of expressions run after each execution of the loop body.
    */
   NodeList<Expression> _updaters;
-  
+
   /**
    * The right parenthesis.
    */
   Token _rightParenthesis;
-  
+
   /**
    * The body of the loop.
    */
   Statement _body;
-  
+
   /**
    * Initialize a newly created for statement.
    * @param forKeyword the token representing the 'for' keyword
@@ -5588,7 +5637,7 @@
     this._rightParenthesis = rightParenthesis;
     this._body = becomeParentOf(body);
   }
-  
+
   /**
    * Initialize a newly created for statement.
    * @param forKeyword the token representing the 'for' keyword
@@ -5605,68 +5654,68 @@
   ForStatement({Token forKeyword, Token leftParenthesis, VariableDeclarationList variableList, Expression initialization, Token leftSeparator, Expression condition, Token rightSeparator, List<Expression> updaters, Token rightParenthesis, Statement body}) : this.full(forKeyword, leftParenthesis, variableList, initialization, leftSeparator, condition, rightSeparator, updaters, rightParenthesis, body);
   accept(ASTVisitor visitor) => visitor.visitForStatement(this);
   Token get beginToken => _forKeyword;
-  
+
   /**
    * Return the body of the loop.
    * @return the body of the loop
    */
   Statement get body => _body;
-  
+
   /**
    * Return the condition used to determine when to terminate the loop.
    * @return the condition used to determine when to terminate the loop
    */
   Expression get condition => _condition;
   Token get endToken => _body.endToken;
-  
+
   /**
    * Return the token representing the 'for' keyword.
    * @return the token representing the 'for' keyword
    */
   Token get forKeyword => _forKeyword;
-  
+
   /**
    * Return the initialization expression, or {@code null} if there is no initialization expression.
    * @return the initialization expression
    */
   Expression get initialization => _initialization;
-  
+
   /**
    * Return the left parenthesis.
    * @return the left parenthesis
    */
   Token get leftParenthesis => _leftParenthesis;
-  
+
   /**
    * Return the semicolon separating the initializer and the condition.
    * @return the semicolon separating the initializer and the condition
    */
   Token get leftSeparator => _leftSeparator;
-  
+
   /**
    * Return the right parenthesis.
    * @return the right parenthesis
    */
   Token get rightParenthesis => _rightParenthesis;
-  
+
   /**
    * Return the semicolon separating the condition and the updater.
    * @return the semicolon separating the condition and the updater
    */
   Token get rightSeparator => _rightSeparator;
-  
+
   /**
    * Return the list of expressions run after each execution of the loop body.
    * @return the list of expressions run after each execution of the loop body
    */
   NodeList<Expression> get updaters => _updaters;
-  
+
   /**
    * Return the declaration of the loop variables, or {@code null} if there are no variables.
    * @return the declaration of the loop variables, or {@code null} if there are no variables
    */
   VariableDeclarationList get variables => _variableList;
-  
+
   /**
    * Set the body of the loop to the given statement.
    * @param body the body of the loop
@@ -5674,7 +5723,7 @@
   void set body(Statement body2) {
     this._body = becomeParentOf(body2);
   }
-  
+
   /**
    * Set the condition used to determine when to terminate the loop to the given expression.
    * @param expression the condition used to determine when to terminate the loop
@@ -5682,7 +5731,7 @@
   void set condition(Expression expression) {
     _condition = becomeParentOf(expression);
   }
-  
+
   /**
    * Set the token representing the 'for' keyword to the given token.
    * @param forKeyword the token representing the 'for' keyword
@@ -5690,7 +5739,7 @@
   void set forKeyword(Token forKeyword2) {
     this._forKeyword = forKeyword2;
   }
-  
+
   /**
    * Set the initialization expression to the given expression.
    * @param initialization the initialization expression
@@ -5698,7 +5747,7 @@
   void set initialization(Expression initialization2) {
     this._initialization = becomeParentOf(initialization2);
   }
-  
+
   /**
    * Set the left parenthesis to the given token.
    * @param leftParenthesis the left parenthesis
@@ -5706,7 +5755,7 @@
   void set leftParenthesis(Token leftParenthesis2) {
     this._leftParenthesis = leftParenthesis2;
   }
-  
+
   /**
    * Set the semicolon separating the initializer and the condition to the given token.
    * @param leftSeparator the semicolon separating the initializer and the condition
@@ -5714,7 +5763,7 @@
   void set leftSeparator(Token leftSeparator2) {
     this._leftSeparator = leftSeparator2;
   }
-  
+
   /**
    * Set the right parenthesis to the given token.
    * @param rightParenthesis the right parenthesis
@@ -5722,7 +5771,7 @@
   void set rightParenthesis(Token rightParenthesis2) {
     this._rightParenthesis = rightParenthesis2;
   }
-  
+
   /**
    * Set the semicolon separating the condition and the updater to the given token.
    * @param rightSeparator the semicolon separating the condition and the updater
@@ -5730,7 +5779,7 @@
   void set rightSeparator(Token rightSeparator2) {
     this._rightSeparator = rightSeparator2;
   }
-  
+
   /**
    * Set the declaration of the loop variables to the given parameter.
    * @param variableList the declaration of the loop variables
@@ -5746,7 +5795,6 @@
     safelyVisitChild(_body, visitor);
   }
 }
-
 /**
  * The abstract class {@code FormalParameter} defines the behavior of objects representing a
  * parameter to a function.
@@ -5755,7 +5803,7 @@
  * @coverage dart.engine.ast
  */
 abstract class FormalParameter extends ASTNode {
-  
+
   /**
    * Return the element representing this parameter, or {@code null} if this parameter has not been
    * resolved.
@@ -5768,20 +5816,19 @@
     }
     return identifier2.element as ParameterElement;
   }
-  
+
   /**
    * Return the name of the parameter being declared.
    * @return the name of the parameter being declared
    */
   SimpleIdentifier get identifier;
-  
+
   /**
    * Return the kind of this parameter.
    * @return the kind of this parameter
    */
   ParameterKind get kind;
 }
-
 /**
  * Instances of the class {@code FormalParameterList} represent the formal parameter list of a
  * method declaration, function declaration, or function type alias.
@@ -5807,32 +5854,32 @@
  * @coverage dart.engine.ast
  */
 class FormalParameterList extends ASTNode {
-  
+
   /**
    * The left parenthesis.
    */
   Token _leftParenthesis;
-  
+
   /**
    * The parameters associated with the method.
    */
   NodeList<FormalParameter> _parameters;
-  
+
   /**
    * The left square bracket ('\[') or left curly brace ('{') introducing the optional parameters.
    */
   Token _leftDelimiter;
-  
+
   /**
    * The right square bracket ('\]') or right curly brace ('}') introducing the optional parameters.
    */
   Token _rightDelimiter;
-  
+
   /**
    * The right parenthesis.
    */
   Token _rightParenthesis;
-  
+
   /**
    * Initialize a newly created parameter list.
    * @param leftParenthesis the left parenthesis
@@ -5849,7 +5896,7 @@
     this._rightDelimiter = rightDelimiter;
     this._rightParenthesis = rightParenthesis;
   }
-  
+
   /**
    * Initialize a newly created parameter list.
    * @param leftParenthesis the left parenthesis
@@ -5861,7 +5908,7 @@
   FormalParameterList({Token leftParenthesis, List<FormalParameter> parameters, Token leftDelimiter, Token rightDelimiter, Token rightParenthesis}) : this.full(leftParenthesis, parameters, leftDelimiter, rightDelimiter, rightParenthesis);
   accept(ASTVisitor visitor) => visitor.visitFormalParameterList(this);
   Token get beginToken => _leftParenthesis;
-  
+
   /**
    * Return an array containing the elements representing the parameters in this list. The array
    * will contain {@code null}s if the parameters in this list have not been resolved.
@@ -5876,7 +5923,7 @@
     return types;
   }
   Token get endToken => _rightParenthesis;
-  
+
   /**
    * Return the left square bracket ('\[') or left curly brace ('{') introducing the optional
    * parameters.
@@ -5884,19 +5931,19 @@
    * parameters
    */
   Token get leftDelimiter => _leftDelimiter;
-  
+
   /**
    * Return the left parenthesis.
    * @return the left parenthesis
    */
   Token get leftParenthesis => _leftParenthesis;
-  
+
   /**
    * Return the parameters associated with the method.
    * @return the parameters associated with the method
    */
   NodeList<FormalParameter> get parameters => _parameters;
-  
+
   /**
    * Return the right square bracket ('\]') or right curly brace ('}') introducing the optional
    * parameters.
@@ -5904,13 +5951,13 @@
    * parameters
    */
   Token get rightDelimiter => _rightDelimiter;
-  
+
   /**
    * Return the right parenthesis.
    * @return the right parenthesis
    */
   Token get rightParenthesis => _rightParenthesis;
-  
+
   /**
    * Set the left square bracket ('\[') or left curly brace ('{') introducing the optional parameters
    * to the given token.
@@ -5919,7 +5966,7 @@
   void set leftDelimiter(Token bracket) {
     _leftDelimiter = bracket;
   }
-  
+
   /**
    * Set the left parenthesis to the given token.
    * @param parenthesis the left parenthesis
@@ -5927,7 +5974,7 @@
   void set leftParenthesis(Token parenthesis) {
     _leftParenthesis = parenthesis;
   }
-  
+
   /**
    * Set the right square bracket ('\]') or right curly brace ('}') introducing the optional
    * parameters to the given token.
@@ -5936,7 +5983,7 @@
   void set rightDelimiter(Token bracket) {
     _rightDelimiter = bracket;
   }
-  
+
   /**
    * Set the right parenthesis to the given token.
    * @param parenthesis the right parenthesis
@@ -5948,7 +5995,6 @@
     _parameters.accept(visitor);
   }
 }
-
 /**
  * The abstract class {@code FunctionBody} defines the behavior common to objects representing the
  * body of a function or method.
@@ -5958,7 +6004,6 @@
  */
 abstract class FunctionBody extends ASTNode {
 }
-
 /**
  * Instances of the class {@code FunctionDeclaration} wrap a {@link FunctionExpression function
  * expression} as a top-level declaration.
@@ -5969,34 +6014,34 @@
  * @coverage dart.engine.ast
  */
 class FunctionDeclaration extends CompilationUnitMember {
-  
+
   /**
    * The token representing the 'external' keyword, or {@code null} if this is not an external
    * function.
    */
   Token _externalKeyword;
-  
+
   /**
    * The return type of the function, or {@code null} if no return type was declared.
    */
   TypeName _returnType;
-  
+
   /**
    * The token representing the 'get' or 'set' keyword, or {@code null} if this is a function
    * declaration rather than a property declaration.
    */
   Token _propertyKeyword;
-  
+
   /**
    * The name of the function, or {@code null} if the function is not named.
    */
   SimpleIdentifier _name;
-  
+
   /**
    * The function expression being wrapped.
    */
   FunctionExpression _functionExpression;
-  
+
   /**
    * Initialize a newly created function declaration.
    * @param comment the documentation comment associated with this function
@@ -6014,7 +6059,7 @@
     this._name = becomeParentOf(name);
     this._functionExpression = becomeParentOf(functionExpression);
   }
-  
+
   /**
    * Initialize a newly created function declaration.
    * @param comment the documentation comment associated with this function
@@ -6029,51 +6074,51 @@
   accept(ASTVisitor visitor) => visitor.visitFunctionDeclaration(this);
   ExecutableElement get element => _name != null ? (_name.element as ExecutableElement) : null;
   Token get endToken => _functionExpression.endToken;
-  
+
   /**
    * Return the token representing the 'external' keyword, or {@code null} if this is not an
    * external function.
    * @return the token representing the 'external' keyword
    */
   Token get externalKeyword => _externalKeyword;
-  
+
   /**
    * Return the function expression being wrapped.
    * @return the function expression being wrapped
    */
   FunctionExpression get functionExpression => _functionExpression;
-  
+
   /**
    * Return the name of the function, or {@code null} if the function is not named.
    * @return the name of the function
    */
   SimpleIdentifier get name => _name;
-  
+
   /**
    * Return the token representing the 'get' or 'set' keyword, or {@code null} if this is a function
    * declaration rather than a property declaration.
    * @return the token representing the 'get' or 'set' keyword
    */
   Token get propertyKeyword => _propertyKeyword;
-  
+
   /**
    * Return the return type of the function, or {@code null} if no return type was declared.
    * @return the return type of the function
    */
   TypeName get returnType => _returnType;
-  
+
   /**
    * Return {@code true} if this function declares a getter.
    * @return {@code true} if this function declares a getter
    */
   bool isGetter() => _propertyKeyword != null && identical(((_propertyKeyword as KeywordToken)).keyword, Keyword.GET);
-  
+
   /**
    * Return {@code true} if this function declares a setter.
    * @return {@code true} if this function declares a setter
    */
   bool isSetter() => _propertyKeyword != null && identical(((_propertyKeyword as KeywordToken)).keyword, Keyword.SET);
-  
+
   /**
    * Set the token representing the 'external' keyword to the given token.
    * @param externalKeyword the token representing the 'external' keyword
@@ -6081,7 +6126,7 @@
   void set externalKeyword(Token externalKeyword2) {
     this._externalKeyword = externalKeyword2;
   }
-  
+
   /**
    * Set the function expression being wrapped to the given function expression.
    * @param functionExpression the function expression being wrapped
@@ -6089,7 +6134,7 @@
   void set functionExpression(FunctionExpression functionExpression2) {
     functionExpression2 = becomeParentOf(functionExpression2);
   }
-  
+
   /**
    * Set the name of the function to the given identifier.
    * @param identifier the name of the function
@@ -6097,7 +6142,7 @@
   void set name(SimpleIdentifier identifier) {
     _name = becomeParentOf(identifier);
   }
-  
+
   /**
    * Set the token representing the 'get' or 'set' keyword to the given token.
    * @param propertyKeyword the token representing the 'get' or 'set' keyword
@@ -6105,7 +6150,7 @@
   void set propertyKeyword(Token propertyKeyword2) {
     this._propertyKeyword = propertyKeyword2;
   }
-  
+
   /**
    * Set the return type of the function to the given name.
    * @param name the return type of the function
@@ -6133,18 +6178,17 @@
     return _functionExpression.beginToken;
   }
 }
-
 /**
  * Instances of the class {@code FunctionDeclarationStatement} wrap a {@link FunctionDeclarationfunction declaration} as a statement.
  * @coverage dart.engine.ast
  */
 class FunctionDeclarationStatement extends Statement {
-  
+
   /**
    * The function declaration being wrapped.
    */
   FunctionDeclaration _functionDeclaration;
-  
+
   /**
    * Initialize a newly created function declaration statement.
    * @param functionDeclaration the the function declaration being wrapped
@@ -6152,7 +6196,7 @@
   FunctionDeclarationStatement.full(FunctionDeclaration functionDeclaration) {
     this._functionDeclaration = becomeParentOf(functionDeclaration);
   }
-  
+
   /**
    * Initialize a newly created function declaration statement.
    * @param functionDeclaration the the function declaration being wrapped
@@ -6161,13 +6205,13 @@
   accept(ASTVisitor visitor) => visitor.visitFunctionDeclarationStatement(this);
   Token get beginToken => _functionDeclaration.beginToken;
   Token get endToken => _functionDeclaration.endToken;
-  
+
   /**
    * Return the function declaration being wrapped.
    * @return the function declaration being wrapped
    */
   FunctionDeclaration get functionDeclaration => _functionDeclaration;
-  
+
   /**
    * Set the function declaration being wrapped to the given function declaration.
    * @param functionDeclaration the function declaration being wrapped
@@ -6179,7 +6223,6 @@
     safelyVisitChild(_functionDeclaration, visitor);
   }
 }
-
 /**
  * Instances of the class {@code FunctionExpression} represent a function expression.
  * <pre>
@@ -6187,23 +6230,23 @@
  * @coverage dart.engine.ast
  */
 class FunctionExpression extends Expression {
-  
+
   /**
    * The parameters associated with the function.
    */
   FormalParameterList _parameters;
-  
+
   /**
    * The body of the function, or {@code null} if this is an external function.
    */
   FunctionBody _body;
-  
+
   /**
    * The element associated with the function, or {@code null} if the AST structure has not been
    * resolved.
    */
   ExecutableElement _element;
-  
+
   /**
    * Initialize a newly created function declaration.
    * @param parameters the parameters associated with the function
@@ -6213,7 +6256,7 @@
     this._parameters = becomeParentOf(parameters);
     this._body = becomeParentOf(body);
   }
-  
+
   /**
    * Initialize a newly created function declaration.
    * @param parameters the parameters associated with the function
@@ -6229,13 +6272,13 @@
     }
     throw new IllegalStateException("Non-external functions must have a body");
   }
-  
+
   /**
    * Return the body of the function, or {@code null} if this is an external function.
    * @return the body of the function
    */
   FunctionBody get body => _body;
-  
+
   /**
    * Return the element associated with this function, or {@code null} if the AST structure has not
    * been resolved.
@@ -6250,13 +6293,13 @@
     }
     throw new IllegalStateException("Non-external functions must have a body");
   }
-  
+
   /**
    * Return the parameters associated with the function.
    * @return the parameters associated with the function
    */
   FormalParameterList get parameters => _parameters;
-  
+
   /**
    * Set the body of the function to the given function body.
    * @param functionBody the body of the function
@@ -6264,7 +6307,7 @@
   void set body(FunctionBody functionBody) {
     _body = becomeParentOf(functionBody);
   }
-  
+
   /**
    * Set the element associated with this function to the given element.
    * @param element the element associated with this function
@@ -6272,7 +6315,7 @@
   void set element(ExecutableElement element2) {
     this._element = element2;
   }
-  
+
   /**
    * Set the parameters associated with the function to the given list of parameters.
    * @param parameters the parameters associated with the function
@@ -6285,7 +6328,6 @@
     safelyVisitChild(_body, visitor);
   }
 }
-
 /**
  * Instances of the class {@code FunctionExpressionInvocation} represent the invocation of a
  * function resulting from evaluating an expression. Invocations of methods and other forms of
@@ -6296,27 +6338,27 @@
  * @coverage dart.engine.ast
  */
 class FunctionExpressionInvocation extends Expression {
-  
+
   /**
    * The expression producing the function being invoked.
    */
   Expression _function;
-  
+
   /**
    * The list of arguments to the function.
    */
   ArgumentList _argumentList;
-  
+
   /**
    * The element associated with the function being invoked based on static type information, or{@code null} if the AST structure has not been resolved or the function could not be resolved.
    */
   ExecutableElement _staticElement;
-  
+
   /**
    * The element associated with the function being invoked based on propagated type information, or{@code null} if the AST structure has not been resolved or the function could not be resolved.
    */
   ExecutableElement _propagatedElement;
-  
+
   /**
    * Initialize a newly created function expression invocation.
    * @param function the expression producing the function being invoked
@@ -6326,7 +6368,7 @@
     this._function = becomeParentOf(function);
     this._argumentList = becomeParentOf(argumentList);
   }
-  
+
   /**
    * Initialize a newly created function expression invocation.
    * @param function the expression producing the function being invoked
@@ -6334,14 +6376,14 @@
    */
   FunctionExpressionInvocation({Expression function, ArgumentList argumentList}) : this.full(function, argumentList);
   accept(ASTVisitor visitor) => visitor.visitFunctionExpressionInvocation(this);
-  
+
   /**
    * Return the list of arguments to the method.
    * @return the list of arguments to the method
    */
   ArgumentList get argumentList => _argumentList;
   Token get beginToken => _function.beginToken;
-  
+
   /**
    * Return the element associated with the function being invoked based on propagated type
    * information, or {@code null} if the AST structure has not been resolved or the function could
@@ -6351,13 +6393,13 @@
    */
   ExecutableElement get element => _propagatedElement;
   Token get endToken => _argumentList.endToken;
-  
+
   /**
    * Return the expression producing the function being invoked.
    * @return the expression producing the function being invoked
    */
   Expression get function => _function;
-  
+
   /**
    * Return the element associated with the function being invoked based on static type information,
    * or {@code null} if the AST structure has not been resolved or the function could not be
@@ -6366,7 +6408,7 @@
    * @return the element associated with the function
    */
   ExecutableElement get staticElement => _staticElement;
-  
+
   /**
    * Set the list of arguments to the method to the given list.
    * @param argumentList the list of arguments to the method
@@ -6374,7 +6416,7 @@
   void set argumentList(ArgumentList argumentList2) {
     this._argumentList = becomeParentOf(argumentList2);
   }
-  
+
   /**
    * Set the element associated with the function being invoked based on propagated type information
    * to the given element.
@@ -6383,7 +6425,7 @@
   void set element(ExecutableElement element2) {
     _propagatedElement = element2;
   }
-  
+
   /**
    * Set the expression producing the function being invoked to the given expression.
    * @param function the expression producing the function being invoked
@@ -6391,7 +6433,7 @@
   void set function(Expression function2) {
     function2 = becomeParentOf(function2);
   }
-  
+
   /**
    * Set the element associated with the function being invoked based on static type information to
    * the given element.
@@ -6405,7 +6447,6 @@
     safelyVisitChild(_argumentList, visitor);
   }
 }
-
 /**
  * Instances of the class {@code FunctionTypeAlias} represent a function type alias.
  * <pre>
@@ -6415,29 +6456,29 @@
  * @coverage dart.engine.ast
  */
 class FunctionTypeAlias extends TypeAlias {
-  
+
   /**
    * The name of the return type of the function type being defined, or {@code null} if no return
    * type was given.
    */
   TypeName _returnType;
-  
+
   /**
    * The name of the function type being declared.
    */
   SimpleIdentifier _name;
-  
+
   /**
    * The type parameters for the function type, or {@code null} if the function type does not have
    * any type parameters.
    */
   TypeParameterList _typeParameters;
-  
+
   /**
    * The parameters associated with the function type.
    */
   FormalParameterList _parameters;
-  
+
   /**
    * Initialize a newly created function type alias.
    * @param comment the documentation comment associated with this type alias
@@ -6455,7 +6496,7 @@
     this._typeParameters = becomeParentOf(typeParameters);
     this._parameters = becomeParentOf(parameters);
   }
-  
+
   /**
    * Initialize a newly created function type alias.
    * @param comment the documentation comment associated with this type alias
@@ -6470,33 +6511,33 @@
   FunctionTypeAlias({Comment comment, List<Annotation> metadata, Token keyword, TypeName returnType, SimpleIdentifier name, TypeParameterList typeParameters, FormalParameterList parameters, Token semicolon}) : this.full(comment, metadata, keyword, returnType, name, typeParameters, parameters, semicolon);
   accept(ASTVisitor visitor) => visitor.visitFunctionTypeAlias(this);
   FunctionTypeAliasElement get element => _name != null ? (_name.element as FunctionTypeAliasElement) : null;
-  
+
   /**
    * Return the name of the function type being declared.
    * @return the name of the function type being declared
    */
   SimpleIdentifier get name => _name;
-  
+
   /**
    * Return the parameters associated with the function type.
    * @return the parameters associated with the function type
    */
   FormalParameterList get parameters => _parameters;
-  
+
   /**
    * Return the name of the return type of the function type being defined, or {@code null} if no
    * return type was given.
    * @return the name of the return type of the function type being defined
    */
   TypeName get returnType => _returnType;
-  
+
   /**
    * Return the type parameters for the function type, or {@code null} if the function type does not
    * have any type parameters.
    * @return the type parameters for the function type
    */
   TypeParameterList get typeParameters => _typeParameters;
-  
+
   /**
    * Set the name of the function type being declared to the given identifier.
    * @param name the name of the function type being declared
@@ -6504,7 +6545,7 @@
   void set name(SimpleIdentifier name2) {
     this._name = becomeParentOf(name2);
   }
-  
+
   /**
    * Set the parameters associated with the function type to the given list of parameters.
    * @param parameters the parameters associated with the function type
@@ -6512,7 +6553,7 @@
   void set parameters(FormalParameterList parameters2) {
     this._parameters = becomeParentOf(parameters2);
   }
-  
+
   /**
    * Set the name of the return type of the function type being defined to the given type name.
    * @param typeName the name of the return type of the function type being defined
@@ -6520,7 +6561,7 @@
   void set returnType(TypeName typeName) {
     _returnType = becomeParentOf(typeName);
   }
-  
+
   /**
    * Set the type parameters for the function type to the given list of parameters.
    * @param typeParameters the type parameters for the function type
@@ -6536,7 +6577,6 @@
     safelyVisitChild(_parameters, visitor);
   }
 }
-
 /**
  * Instances of the class {@code FunctionTypedFormalParameter} represent a function-typed formal
  * parameter.
@@ -6545,17 +6585,17 @@
  * @coverage dart.engine.ast
  */
 class FunctionTypedFormalParameter extends NormalFormalParameter {
-  
+
   /**
    * The return type of the function, or {@code null} if the function does not have a return type.
    */
   TypeName _returnType;
-  
+
   /**
    * The parameters of the function-typed parameter.
    */
   FormalParameterList _parameters;
-  
+
   /**
    * Initialize a newly created formal parameter.
    * @param comment the documentation comment associated with this parameter
@@ -6569,7 +6609,7 @@
     this._returnType = becomeParentOf(returnType);
     this._parameters = becomeParentOf(parameters);
   }
-  
+
   /**
    * Initialize a newly created formal parameter.
    * @param comment the documentation comment associated with this parameter
@@ -6588,13 +6628,13 @@
     return identifier.beginToken;
   }
   Token get endToken => _parameters.endToken;
-  
+
   /**
    * Return the parameters of the function-typed parameter.
    * @return the parameters of the function-typed parameter
    */
   FormalParameterList get parameters => _parameters;
-  
+
   /**
    * Return the return type of the function, or {@code null} if the function does not have a return
    * type.
@@ -6603,7 +6643,7 @@
   TypeName get returnType => _returnType;
   bool isConst() => false;
   bool isFinal() => false;
-  
+
   /**
    * Set the parameters of the function-typed parameter to the given parameters.
    * @param parameters the parameters of the function-typed parameter
@@ -6611,7 +6651,7 @@
   void set parameters(FormalParameterList parameters2) {
     this._parameters = becomeParentOf(parameters2);
   }
-  
+
   /**
    * Set the return type of the function to the given type.
    * @param returnType the return type of the function
@@ -6626,7 +6666,6 @@
     safelyVisitChild(_parameters, visitor);
   }
 }
-
 /**
  * Instances of the class {@code HideCombinator} represent a combinator that restricts the names
  * being imported to those that are not in a given list.
@@ -6637,12 +6676,12 @@
  * @coverage dart.engine.ast
  */
 class HideCombinator extends Combinator {
-  
+
   /**
    * The list of names from the library that are hidden by this combinator.
    */
   NodeList<SimpleIdentifier> _hiddenNames;
-  
+
   /**
    * Initialize a newly created import show combinator.
    * @param keyword the comma introducing the combinator
@@ -6652,7 +6691,7 @@
     this._hiddenNames = new NodeList<SimpleIdentifier>(this);
     this._hiddenNames.addAll(hiddenNames);
   }
-  
+
   /**
    * Initialize a newly created import show combinator.
    * @param keyword the comma introducing the combinator
@@ -6661,7 +6700,7 @@
   HideCombinator({Token keyword, List<SimpleIdentifier> hiddenNames}) : this.full(keyword, hiddenNames);
   accept(ASTVisitor visitor) => visitor.visitHideCombinator(this);
   Token get endToken => _hiddenNames.endToken;
-  
+
   /**
    * Return the list of names from the library that are hidden by this combinator.
    * @return the list of names from the library that are hidden by this combinator
@@ -6671,7 +6710,6 @@
     _hiddenNames.accept(visitor);
   }
 }
-
 /**
  * The abstract class {@code Identifier} defines the behavior common to nodes that represent an
  * identifier.
@@ -6680,7 +6718,7 @@
  * @coverage dart.engine.ast
  */
 abstract class Identifier extends Expression {
-  
+
   /**
    * Return {@code true} if the given name is visible only within the library in which it is
    * declared.
@@ -6688,7 +6726,7 @@
    * @return {@code true} if the given name is private
    */
   static bool isPrivateName(String name) => name.startsWith("_");
-  
+
   /**
    * Return the element associated with this identifier based on propagated type information, or{@code null} if the AST structure has not been resolved or if this identifier could not be
    * resolved. One example of the latter case is an identifier that is not defined within the scope
@@ -6696,13 +6734,13 @@
    * @return the element associated with this identifier
    */
   Element get element;
-  
+
   /**
    * Return the lexical representation of the identifier.
    * @return the lexical representation of the identifier
    */
   String get name;
-  
+
   /**
    * Return the element associated with this identifier based on static type information, or{@code null} if the AST structure has not been resolved or if this identifier could not be
    * resolved. One example of the latter case is an identifier that is not defined within the scope
@@ -6712,7 +6750,6 @@
   Element get staticElement;
   bool isAssignable() => true;
 }
-
 /**
  * Instances of the class {@code IfStatement} represent an if statement.
  * <pre>
@@ -6722,43 +6759,43 @@
  * @coverage dart.engine.ast
  */
 class IfStatement extends Statement {
-  
+
   /**
    * The token representing the 'if' keyword.
    */
   Token _ifKeyword;
-  
+
   /**
    * The left parenthesis.
    */
   Token _leftParenthesis;
-  
+
   /**
    * The condition used to determine which of the statements is executed next.
    */
   Expression _condition;
-  
+
   /**
    * The right parenthesis.
    */
   Token _rightParenthesis;
-  
+
   /**
    * The statement that is executed if the condition evaluates to {@code true}.
    */
   Statement _thenStatement;
-  
+
   /**
    * The token representing the 'else' keyword.
    */
   Token _elseKeyword;
-  
+
   /**
    * The statement that is executed if the condition evaluates to {@code false}, or {@code null} if
    * there is no else statement.
    */
   Statement _elseStatement;
-  
+
   /**
    * Initialize a newly created if statement.
    * @param ifKeyword the token representing the 'if' keyword
@@ -6778,7 +6815,7 @@
     this._elseKeyword = elseKeyword;
     this._elseStatement = becomeParentOf(elseStatement);
   }
-  
+
   /**
    * Initialize a newly created if statement.
    * @param ifKeyword the token representing the 'if' keyword
@@ -6792,19 +6829,19 @@
   IfStatement({Token ifKeyword, Token leftParenthesis, Expression condition, Token rightParenthesis, Statement thenStatement, Token elseKeyword, Statement elseStatement}) : this.full(ifKeyword, leftParenthesis, condition, rightParenthesis, thenStatement, elseKeyword, elseStatement);
   accept(ASTVisitor visitor) => visitor.visitIfStatement(this);
   Token get beginToken => _ifKeyword;
-  
+
   /**
    * Return the condition used to determine which of the statements is executed next.
    * @return the condition used to determine which statement is executed next
    */
   Expression get condition => _condition;
-  
+
   /**
    * Return the token representing the 'else' keyword.
    * @return the token representing the 'else' keyword
    */
   Token get elseKeyword => _elseKeyword;
-  
+
   /**
    * Return the statement that is executed if the condition evaluates to {@code false}, or{@code null} if there is no else statement.
    * @return the statement that is executed if the condition evaluates to {@code false}
@@ -6816,31 +6853,31 @@
     }
     return _thenStatement.endToken;
   }
-  
+
   /**
    * Return the token representing the 'if' keyword.
    * @return the token representing the 'if' keyword
    */
   Token get ifKeyword => _ifKeyword;
-  
+
   /**
    * Return the left parenthesis.
    * @return the left parenthesis
    */
   Token get leftParenthesis => _leftParenthesis;
-  
+
   /**
    * Return the right parenthesis.
    * @return the right parenthesis
    */
   Token get rightParenthesis => _rightParenthesis;
-  
+
   /**
    * Return the statement that is executed if the condition evaluates to {@code true}.
    * @return the statement that is executed if the condition evaluates to {@code true}
    */
   Statement get thenStatement => _thenStatement;
-  
+
   /**
    * Set the condition used to determine which of the statements is executed next to the given
    * expression.
@@ -6849,7 +6886,7 @@
   void set condition(Expression expression) {
     _condition = becomeParentOf(expression);
   }
-  
+
   /**
    * Set the token representing the 'else' keyword to the given token.
    * @param elseKeyword the token representing the 'else' keyword
@@ -6857,7 +6894,7 @@
   void set elseKeyword(Token elseKeyword2) {
     this._elseKeyword = elseKeyword2;
   }
-  
+
   /**
    * Set the statement that is executed if the condition evaluates to {@code false} to the given
    * statement.
@@ -6866,7 +6903,7 @@
   void set elseStatement(Statement statement) {
     _elseStatement = becomeParentOf(statement);
   }
-  
+
   /**
    * Set the token representing the 'if' keyword to the given token.
    * @param ifKeyword the token representing the 'if' keyword
@@ -6874,7 +6911,7 @@
   void set ifKeyword(Token ifKeyword2) {
     this._ifKeyword = ifKeyword2;
   }
-  
+
   /**
    * Set the left parenthesis to the given token.
    * @param leftParenthesis the left parenthesis
@@ -6882,7 +6919,7 @@
   void set leftParenthesis(Token leftParenthesis2) {
     this._leftParenthesis = leftParenthesis2;
   }
-  
+
   /**
    * Set the right parenthesis to the given token.
    * @param rightParenthesis the right parenthesis
@@ -6890,7 +6927,7 @@
   void set rightParenthesis(Token rightParenthesis2) {
     this._rightParenthesis = rightParenthesis2;
   }
-  
+
   /**
    * Set the statement that is executed if the condition evaluates to {@code true} to the given
    * statement.
@@ -6905,7 +6942,6 @@
     safelyVisitChild(_elseStatement, visitor);
   }
 }
-
 /**
  * Instances of the class {@code ImplementsClause} represent the "implements" clause in an class
  * declaration.
@@ -6916,17 +6952,17 @@
  * @coverage dart.engine.ast
  */
 class ImplementsClause extends ASTNode {
-  
+
   /**
    * The token representing the 'implements' keyword.
    */
   Token _keyword;
-  
+
   /**
    * The interfaces that are being implemented.
    */
   NodeList<TypeName> _interfaces;
-  
+
   /**
    * Initialize a newly created extends clause.
    * @param keyword the token representing the 'implements' keyword
@@ -6937,7 +6973,7 @@
     this._keyword = keyword;
     this._interfaces.addAll(interfaces);
   }
-  
+
   /**
    * Initialize a newly created extends clause.
    * @param keyword the token representing the 'implements' keyword
@@ -6947,19 +6983,19 @@
   accept(ASTVisitor visitor) => visitor.visitImplementsClause(this);
   Token get beginToken => _keyword;
   Token get endToken => _interfaces.endToken;
-  
+
   /**
    * Return the list of the interfaces that are being implemented.
    * @return the list of the interfaces that are being implemented
    */
   NodeList<TypeName> get interfaces => _interfaces;
-  
+
   /**
    * Return the token representing the 'implements' keyword.
    * @return the token representing the 'implements' keyword
    */
   Token get keyword => _keyword;
-  
+
   /**
    * Set the token representing the 'implements' keyword to the given token.
    * @param keyword the token representing the 'implements' keyword
@@ -6971,7 +7007,6 @@
     _interfaces.accept(visitor);
   }
 }
-
 /**
  * Instances of the class {@code ImportDirective} represent an import directive.
  * <pre>
@@ -6980,18 +7015,18 @@
  * @coverage dart.engine.ast
  */
 class ImportDirective extends NamespaceDirective {
-  
+
   /**
    * The token representing the 'as' token, or {@code null} if the imported names are not prefixed.
    */
   Token _asToken;
-  
+
   /**
    * The prefix to be used with the imported names, or {@code null} if the imported names are not
    * prefixed.
    */
   SimpleIdentifier _prefix;
-  
+
   /**
    * Initialize a newly created import directive.
    * @param comment the documentation comment associated with this directive
@@ -7007,7 +7042,7 @@
     this._asToken = asToken;
     this._prefix = becomeParentOf(prefix);
   }
-  
+
   /**
    * Initialize a newly created import directive.
    * @param comment the documentation comment associated with this directive
@@ -7021,14 +7056,14 @@
    */
   ImportDirective({Comment comment, List<Annotation> metadata, Token keyword, StringLiteral libraryUri, Token asToken, SimpleIdentifier prefix, List<Combinator> combinators, Token semicolon}) : this.full(comment, metadata, keyword, libraryUri, asToken, prefix, combinators, semicolon);
   accept(ASTVisitor visitor) => visitor.visitImportDirective(this);
-  
+
   /**
    * Return the token representing the 'as' token, or {@code null} if the imported names are not
    * prefixed.
    * @return the token representing the 'as' token
    */
   Token get asToken => _asToken;
-  
+
   /**
    * Return the prefix to be used with the imported names, or {@code null} if the imported names are
    * not prefixed.
@@ -7042,7 +7077,7 @@
     }
     return null;
   }
-  
+
   /**
    * Set the token representing the 'as' token to the given token.
    * @param asToken the token representing the 'as' token
@@ -7050,7 +7085,7 @@
   void set asToken(Token asToken2) {
     this._asToken = asToken2;
   }
-  
+
   /**
    * Set the prefix to be used with the imported names to the given identifier.
    * @param prefix the prefix to be used with the imported names
@@ -7064,7 +7099,6 @@
     combinators.accept(visitor);
   }
 }
-
 /**
  * Instances of the class {@code IndexExpression} represent an index expression.
  * <pre>
@@ -7073,46 +7107,46 @@
  * @coverage dart.engine.ast
  */
 class IndexExpression extends Expression {
-  
+
   /**
    * The expression used to compute the object being indexed, or {@code null} if this index
    * expression is part of a cascade expression.
    */
   Expression _target;
-  
+
   /**
    * The period ("..") before a cascaded index expression, or {@code null} if this index expression
    * is not part of a cascade expression.
    */
   Token _period;
-  
+
   /**
    * The left square bracket.
    */
   Token _leftBracket;
-  
+
   /**
    * The expression used to compute the index.
    */
   Expression _index;
-  
+
   /**
    * The right square bracket.
    */
   Token _rightBracket;
-  
+
   /**
    * The element associated with the operator based on the static type of the target, or{@code null} if the AST structure has not been resolved or if the operator could not be
    * resolved.
    */
   MethodElement _staticElement;
-  
+
   /**
    * The element associated with the operator based on the propagated type of the target, or{@code null} if the AST structure has not been resolved or if the operator could not be
    * resolved.
    */
   MethodElement _propagatedElement;
-  
+
   /**
    * Initialize a newly created index expression.
    * @param target the expression used to compute the object being indexed
@@ -7123,7 +7157,7 @@
   IndexExpression.forTarget_full(Expression target2, Token leftBracket2, Expression index2, Token rightBracket2) {
     _jtd_constructor_58_impl(target2, leftBracket2, index2, rightBracket2);
   }
-  
+
   /**
    * Initialize a newly created index expression.
    * @param target the expression used to compute the object being indexed
@@ -7138,7 +7172,7 @@
     this._index = becomeParentOf(index2);
     this._rightBracket = rightBracket2;
   }
-  
+
   /**
    * Initialize a newly created index expression.
    * @param period the period ("..") before a cascaded index expression
@@ -7149,7 +7183,7 @@
   IndexExpression.forCascade_full(Token period2, Token leftBracket2, Expression index2, Token rightBracket2) {
     _jtd_constructor_59_impl(period2, leftBracket2, index2, rightBracket2);
   }
-  
+
   /**
    * Initialize a newly created index expression.
    * @param period the period ("..") before a cascaded index expression
@@ -7165,7 +7199,7 @@
     this._rightBracket = rightBracket2;
   }
   accept(ASTVisitor visitor) => visitor.visitIndexExpression(this);
-  
+
   /**
    * Return the expression used to compute the object being indexed, or {@code null} if this index
    * expression is part of a cascade expression.
@@ -7179,7 +7213,7 @@
     }
     return _period;
   }
-  
+
   /**
    * Return the element associated with the operator based on the propagated type of the target, or{@code null} if the AST structure has not been resolved or if the operator could not be
    * resolved. One example of the latter case is an operator that is not defined for the type of the
@@ -7188,26 +7222,26 @@
    */
   MethodElement get element => _propagatedElement;
   Token get endToken => _rightBracket;
-  
+
   /**
    * Return the expression used to compute the index.
    * @return the expression used to compute the index
    */
   Expression get index => _index;
-  
+
   /**
    * Return the left square bracket.
    * @return the left square bracket
    */
   Token get leftBracket => _leftBracket;
-  
+
   /**
    * Return the period ("..") before a cascaded index expression, or {@code null} if this index
    * expression is not part of a cascade expression.
    * @return the period ("..") before a cascaded index expression
    */
   Token get period => _period;
-  
+
   /**
    * Return the expression used to compute the object being indexed. If this index expression is not
    * part of a cascade expression, then this is the same as {@link #getArray()}. If this index
@@ -7229,13 +7263,13 @@
     }
     return _target;
   }
-  
+
   /**
    * Return the right square bracket.
    * @return the right square bracket
    */
   Token get rightBracket => _rightBracket;
-  
+
   /**
    * Return the element associated with the operator based on the static type of the target, or{@code null} if the AST structure has not been resolved or if the operator could not be
    * resolved. One example of the latter case is an operator that is not defined for the type of the
@@ -7243,7 +7277,7 @@
    * @return the element associated with the operator
    */
   MethodElement get staticElement => _staticElement;
-  
+
   /**
    * Return {@code true} if this expression is computing a right-hand value.
    * <p>
@@ -7261,7 +7295,7 @@
     }
     return true;
   }
-  
+
   /**
    * Return {@code true} if this expression is computing a left-hand value.
    * <p>
@@ -7282,14 +7316,14 @@
     return false;
   }
   bool isAssignable() => true;
-  
+
   /**
    * Return {@code true} if this expression is cascaded. If it is, then the target of this
    * expression is not stored locally but is stored in the nearest ancestor that is a{@link CascadeExpression}.
    * @return {@code true} if this expression is cascaded
    */
   bool isCascaded() => _period != null;
-  
+
   /**
    * Set the expression used to compute the object being indexed to the given expression.
    * @param expression the expression used to compute the object being indexed
@@ -7297,7 +7331,7 @@
   void set array(Expression expression) {
     _target = becomeParentOf(expression);
   }
-  
+
   /**
    * Set the element associated with the operator based on the propagated type of the target to the
    * given element.
@@ -7306,7 +7340,7 @@
   void set element(MethodElement element2) {
     _propagatedElement = element2;
   }
-  
+
   /**
    * Set the expression used to compute the index to the given expression.
    * @param expression the expression used to compute the index
@@ -7314,7 +7348,7 @@
   void set index(Expression expression) {
     _index = becomeParentOf(expression);
   }
-  
+
   /**
    * Set the left square bracket to the given token.
    * @param bracket the left square bracket
@@ -7322,7 +7356,7 @@
   void set leftBracket(Token bracket) {
     _leftBracket = bracket;
   }
-  
+
   /**
    * Set the period ("..") before a cascaded index expression to the given token.
    * @param period the period ("..") before a cascaded index expression
@@ -7330,7 +7364,7 @@
   void set period(Token period2) {
     this._period = period2;
   }
-  
+
   /**
    * Set the right square bracket to the given token.
    * @param bracket the right square bracket
@@ -7338,7 +7372,7 @@
   void set rightBracket(Token bracket) {
     _rightBracket = bracket;
   }
-  
+
   /**
    * Set the element associated with the operator based on the static type of the target to the
    * given element.
@@ -7351,16 +7385,17 @@
     safelyVisitChild(_target, visitor);
     safelyVisitChild(_index, visitor);
   }
-  
+
   /**
-   * Return the parameter element representing the parameter to which the value of the index
-   * expression will be bound. May be {@code null}.
+   * If the AST structure has been resolved, and the function being invoked is known based on
+   * propagated type information, then return the parameter element representing the parameter to
+   * which the value of the index expression will be bound. Otherwise, return {@code null}.
    * <p>
    * This method is only intended to be used by {@link Expression#getParameterElement()}.
    * @return the parameter element representing the parameter to which the value of the index
    * expression will be bound
    */
-  ParameterElement get parameterElementForIndex {
+  ParameterElement get propagatedParameterElementForIndex {
     if (_propagatedElement == null) {
       return null;
     }
@@ -7370,8 +7405,27 @@
     }
     return parameters2[0];
   }
-}
 
+  /**
+   * If the AST structure has been resolved, and the function being invoked is known based on static
+   * type information, then return the parameter element representing the parameter to which the
+   * value of the index expression will be bound. Otherwise, return {@code null}.
+   * <p>
+   * This method is only intended to be used by {@link Expression#getStaticParameterElement()}.
+   * @return the parameter element representing the parameter to which the value of the index
+   * expression will be bound
+   */
+  ParameterElement get staticParameterElementForIndex {
+    if (_staticElement == null) {
+      return null;
+    }
+    List<ParameterElement> parameters2 = _staticElement.parameters;
+    if (parameters2.length < 1) {
+      return null;
+    }
+    return parameters2[0];
+  }
+}
 /**
  * Instances of the class {@code InstanceCreationExpression} represent an instance creation
  * expression.
@@ -7381,33 +7435,33 @@
  * @coverage dart.engine.ast
  */
 class InstanceCreationExpression extends Expression {
-  
+
   /**
    * The keyword used to indicate how an object should be created.
    */
   Token _keyword;
-  
+
   /**
    * The name of the constructor to be invoked.
    */
   ConstructorName _constructorName;
-  
+
   /**
    * The list of arguments to the constructor.
    */
   ArgumentList _argumentList;
-  
+
   /**
    * The element associated with the constructor based on static type information, or {@code null}if the AST structure has not been resolved or if the constructor could not be resolved.
    */
   ConstructorElement _staticElement;
-  
+
   /**
    * The element associated with the constructor based on propagated type information, or{@code null} if the AST structure has not been resolved or if the constructor could not be
    * resolved.
    */
   ConstructorElement _propagatedElement;
-  
+
   /**
    * Initialize a newly created instance creation expression.
    * @param keyword the keyword used to indicate how an object should be created
@@ -7419,7 +7473,7 @@
     this._constructorName = becomeParentOf(constructorName);
     this._argumentList = becomeParentOf(argumentList);
   }
-  
+
   /**
    * Initialize a newly created instance creation expression.
    * @param keyword the keyword used to indicate how an object should be created
@@ -7428,20 +7482,20 @@
    */
   InstanceCreationExpression({Token keyword, ConstructorName constructorName, ArgumentList argumentList}) : this.full(keyword, constructorName, argumentList);
   accept(ASTVisitor visitor) => visitor.visitInstanceCreationExpression(this);
-  
+
   /**
    * Return the list of arguments to the constructor.
    * @return the list of arguments to the constructor
    */
   ArgumentList get argumentList => _argumentList;
   Token get beginToken => _keyword;
-  
+
   /**
    * Return the name of the constructor to be invoked.
    * @return the name of the constructor to be invoked
    */
   ConstructorName get constructorName => _constructorName;
-  
+
   /**
    * Return the element associated with the constructor based on propagated type information, or{@code null} if the AST structure has not been resolved or if the constructor could not be
    * resolved.
@@ -7449,26 +7503,26 @@
    */
   ConstructorElement get element => _propagatedElement;
   Token get endToken => _argumentList.endToken;
-  
+
   /**
    * Return the keyword used to indicate how an object should be created.
    * @return the keyword used to indicate how an object should be created
    */
   Token get keyword => _keyword;
-  
+
   /**
    * Return the element associated with the constructor based on static type information, or{@code null} if the AST structure has not been resolved or if the constructor could not be
    * resolved.
    * @return the element associated with the constructor
    */
   ConstructorElement get staticElement => _staticElement;
-  
+
   /**
    * Return {@code true} if this creation expression is used to invoke a constant constructor.
    * @return {@code true} if this creation expression is used to invoke a constant constructor
    */
   bool isConst() => _keyword is KeywordToken && identical(((_keyword as KeywordToken)).keyword, Keyword.CONST);
-  
+
   /**
    * Set the list of arguments to the constructor to the given list.
    * @param argumentList the list of arguments to the constructor
@@ -7476,7 +7530,7 @@
   void set argumentList(ArgumentList argumentList2) {
     this._argumentList = becomeParentOf(argumentList2);
   }
-  
+
   /**
    * Set the name of the constructor to be invoked to the given name.
    * @param constructorName the name of the constructor to be invoked
@@ -7484,7 +7538,7 @@
   void set constructorName(ConstructorName constructorName2) {
     this._constructorName = constructorName2;
   }
-  
+
   /**
    * Set the element associated with the constructor based on propagated type information to the
    * given element.
@@ -7493,7 +7547,7 @@
   void set element(ConstructorElement element2) {
     this._propagatedElement = element2;
   }
-  
+
   /**
    * Set the keyword used to indicate how an object should be created to the given keyword.
    * @param keyword the keyword used to indicate how an object should be created
@@ -7501,7 +7555,7 @@
   void set keyword(Token keyword2) {
     this._keyword = keyword2;
   }
-  
+
   /**
    * Set the element associated with the constructor based on static type information to the given
    * element.
@@ -7515,7 +7569,6 @@
     safelyVisitChild(_argumentList, visitor);
   }
 }
-
 /**
  * Instances of the class {@code IntegerLiteral} represent an integer literal expression.
  * <pre>
@@ -7531,17 +7584,17 @@
  * @coverage dart.engine.ast
  */
 class IntegerLiteral extends Literal {
-  
+
   /**
    * The token representing the literal.
    */
   Token _literal;
-  
+
   /**
    * The value of the literal.
    */
   int _value = 0;
-  
+
   /**
    * Initialize a newly created integer literal.
    * @param literal the token representing the literal
@@ -7551,7 +7604,7 @@
     this._literal = literal;
     this._value = value;
   }
-  
+
   /**
    * Initialize a newly created integer literal.
    * @param literal the token representing the literal
@@ -7561,19 +7614,19 @@
   accept(ASTVisitor visitor) => visitor.visitIntegerLiteral(this);
   Token get beginToken => _literal;
   Token get endToken => _literal;
-  
+
   /**
    * Return the token representing the literal.
    * @return the token representing the literal
    */
   Token get literal => _literal;
-  
+
   /**
    * Return the value of the literal.
    * @return the value of the literal
    */
   int get value => _value;
-  
+
   /**
    * Set the token representing the literal to the given token.
    * @param literal the token representing the literal
@@ -7581,7 +7634,7 @@
   void set literal(Token literal2) {
     this._literal = literal2;
   }
-  
+
   /**
    * Set the value of the literal to the given value.
    * @param value the value of the literal
@@ -7592,7 +7645,6 @@
   void visitChildren(ASTVisitor<Object> visitor) {
   }
 }
-
 /**
  * The abstract class {@code InterpolationElement} defines the behavior common to elements within a{@link StringInterpolation string interpolation}.
  * <pre>
@@ -7601,7 +7653,6 @@
  */
 abstract class InterpolationElement extends ASTNode {
 }
-
 /**
  * Instances of the class {@code InterpolationExpression} represent an expression embedded in a
  * string interpolation.
@@ -7612,23 +7663,23 @@
  * @coverage dart.engine.ast
  */
 class InterpolationExpression extends InterpolationElement {
-  
+
   /**
    * The token used to introduce the interpolation expression; either '$' if the expression is a
    * simple identifier or '${' if the expression is a full expression.
    */
   Token _leftBracket;
-  
+
   /**
    * The expression to be evaluated for the value to be converted into a string.
    */
   Expression _expression;
-  
+
   /**
    * The right curly bracket, or {@code null} if the expression is an identifier without brackets.
    */
   Token _rightBracket;
-  
+
   /**
    * Initialize a newly created interpolation expression.
    * @param leftBracket the left curly bracket
@@ -7640,7 +7691,7 @@
     this._expression = becomeParentOf(expression);
     this._rightBracket = rightBracket;
   }
-  
+
   /**
    * Initialize a newly created interpolation expression.
    * @param leftBracket the left curly bracket
@@ -7656,25 +7707,25 @@
     }
     return _expression.endToken;
   }
-  
+
   /**
    * Return the expression to be evaluated for the value to be converted into a string.
    * @return the expression to be evaluated for the value to be converted into a string
    */
   Expression get expression => _expression;
-  
+
   /**
    * Return the left curly bracket.
    * @return the left curly bracket
    */
   Token get leftBracket => _leftBracket;
-  
+
   /**
    * Return the right curly bracket.
    * @return the right curly bracket
    */
   Token get rightBracket => _rightBracket;
-  
+
   /**
    * Set the expression to be evaluated for the value to be converted into a string to the given
    * expression.
@@ -7683,7 +7734,7 @@
   void set expression(Expression expression2) {
     this._expression = becomeParentOf(expression2);
   }
-  
+
   /**
    * Set the left curly bracket to the given token.
    * @param leftBracket the left curly bracket
@@ -7691,7 +7742,7 @@
   void set leftBracket(Token leftBracket2) {
     this._leftBracket = leftBracket2;
   }
-  
+
   /**
    * Set the right curly bracket to the given token.
    * @param rightBracket the right curly bracket
@@ -7703,7 +7754,6 @@
     safelyVisitChild(_expression, visitor);
   }
 }
-
 /**
  * Instances of the class {@code InterpolationString} represent a non-empty substring of an
  * interpolated string.
@@ -7714,17 +7764,17 @@
  * @coverage dart.engine.ast
  */
 class InterpolationString extends InterpolationElement {
-  
+
   /**
    * The characters that will be added to the string.
    */
   Token _contents;
-  
+
   /**
    * The value of the literal.
    */
   String _value;
-  
+
   /**
    * Initialize a newly created string of characters that are part of a string interpolation.
    * @param the characters that will be added to the string
@@ -7734,7 +7784,7 @@
     this._contents = contents;
     this._value = value;
   }
-  
+
   /**
    * Initialize a newly created string of characters that are part of a string interpolation.
    * @param the characters that will be added to the string
@@ -7743,20 +7793,20 @@
   InterpolationString({Token contents, String value}) : this.full(contents, value);
   accept(ASTVisitor visitor) => visitor.visitInterpolationString(this);
   Token get beginToken => _contents;
-  
+
   /**
    * Return the characters that will be added to the string.
    * @return the characters that will be added to the string
    */
   Token get contents => _contents;
   Token get endToken => _contents;
-  
+
   /**
    * Return the value of the literal.
    * @return the value of the literal
    */
   String get value => _value;
-  
+
   /**
    * Set the characters that will be added to the string to those in the given string.
    * @param string the characters that will be added to the string
@@ -7764,7 +7814,7 @@
   void set contents(Token string) {
     _contents = string;
   }
-  
+
   /**
    * Set the value of the literal to the given string.
    * @param string the value of the literal
@@ -7775,7 +7825,6 @@
   void visitChildren(ASTVisitor<Object> visitor) {
   }
 }
-
 /**
  * Instances of the class {@code IsExpression} represent an is expression.
  * <pre>
@@ -7783,27 +7832,27 @@
  * @coverage dart.engine.ast
  */
 class IsExpression extends Expression {
-  
+
   /**
    * The expression used to compute the value whose type is being tested.
    */
   Expression _expression;
-  
+
   /**
    * The is operator.
    */
   Token _isOperator;
-  
+
   /**
    * The not operator, or {@code null} if the sense of the test is not negated.
    */
   Token _notOperator;
-  
+
   /**
    * The name of the type being tested for.
    */
   TypeName _type;
-  
+
   /**
    * Initialize a newly created is expression.
    * @param expression the expression used to compute the value whose type is being tested
@@ -7817,7 +7866,7 @@
     this._notOperator = notOperator;
     this._type = becomeParentOf(type);
   }
-  
+
   /**
    * Initialize a newly created is expression.
    * @param expression the expression used to compute the value whose type is being tested
@@ -7829,31 +7878,31 @@
   accept(ASTVisitor visitor) => visitor.visitIsExpression(this);
   Token get beginToken => _expression.beginToken;
   Token get endToken => _type.endToken;
-  
+
   /**
    * Return the expression used to compute the value whose type is being tested.
    * @return the expression used to compute the value whose type is being tested
    */
   Expression get expression => _expression;
-  
+
   /**
    * Return the is operator being applied.
    * @return the is operator being applied
    */
   Token get isOperator => _isOperator;
-  
+
   /**
    * Return the not operator being applied.
    * @return the not operator being applied
    */
   Token get notOperator => _notOperator;
-  
+
   /**
    * Return the name of the type being tested for.
    * @return the name of the type being tested for
    */
   TypeName get type => _type;
-  
+
   /**
    * Set the expression used to compute the value whose type is being tested to the given
    * expression.
@@ -7862,7 +7911,7 @@
   void set expression(Expression expression2) {
     this._expression = becomeParentOf(expression2);
   }
-  
+
   /**
    * Set the is operator being applied to the given operator.
    * @param isOperator the is operator being applied
@@ -7870,7 +7919,7 @@
   void set isOperator(Token isOperator2) {
     this._isOperator = isOperator2;
   }
-  
+
   /**
    * Set the not operator being applied to the given operator.
    * @param notOperator the is operator being applied
@@ -7878,7 +7927,7 @@
   void set notOperator(Token notOperator2) {
     this._notOperator = notOperator2;
   }
-  
+
   /**
    * Set the name of the type being tested for to the given name.
    * @param name the name of the type being tested for
@@ -7891,7 +7940,6 @@
     safelyVisitChild(_type, visitor);
   }
 }
-
 /**
  * Instances of the class {@code Label} represent a label.
  * <pre>
@@ -7900,17 +7948,17 @@
  * @coverage dart.engine.ast
  */
 class Label extends ASTNode {
-  
+
   /**
    * The label being associated with the statement.
    */
   SimpleIdentifier _label;
-  
+
   /**
    * The colon that separates the label from the statement.
    */
   Token _colon;
-  
+
   /**
    * Initialize a newly created label.
    * @param label the label being applied
@@ -7920,7 +7968,7 @@
     this._label = becomeParentOf(label);
     this._colon = colon;
   }
-  
+
   /**
    * Initialize a newly created label.
    * @param label the label being applied
@@ -7929,20 +7977,20 @@
   Label({SimpleIdentifier label, Token colon}) : this.full(label, colon);
   accept(ASTVisitor visitor) => visitor.visitLabel(this);
   Token get beginToken => _label.beginToken;
-  
+
   /**
    * Return the colon that separates the label from the statement.
    * @return the colon that separates the label from the statement
    */
   Token get colon => _colon;
   Token get endToken => _colon;
-  
+
   /**
    * Return the label being associated with the statement.
    * @return the label being associated with the statement
    */
   SimpleIdentifier get label => _label;
-  
+
   /**
    * Set the colon that separates the label from the statement to the given token.
    * @param colon the colon that separates the label from the statement
@@ -7950,7 +7998,7 @@
   void set colon(Token colon2) {
     this._colon = colon2;
   }
-  
+
   /**
    * Set the label being associated with the statement to the given label.
    * @param label the label being associated with the statement
@@ -7962,7 +8010,6 @@
     safelyVisitChild(_label, visitor);
   }
 }
-
 /**
  * Instances of the class {@code LabeledStatement} represent a statement that has a label associated
  * with them.
@@ -7971,17 +8018,17 @@
  * @coverage dart.engine.ast
  */
 class LabeledStatement extends Statement {
-  
+
   /**
    * The labels being associated with the statement.
    */
   NodeList<Label> _labels;
-  
+
   /**
    * The statement with which the labels are being associated.
    */
   Statement _statement;
-  
+
   /**
    * Initialize a newly created labeled statement.
    * @param labels the labels being associated with the statement
@@ -7992,7 +8039,7 @@
     this._labels.addAll(labels);
     this._statement = becomeParentOf(statement);
   }
-  
+
   /**
    * Initialize a newly created labeled statement.
    * @param labels the labels being associated with the statement
@@ -8007,19 +8054,19 @@
     return _statement.beginToken;
   }
   Token get endToken => _statement.endToken;
-  
+
   /**
    * Return the labels being associated with the statement.
    * @return the labels being associated with the statement
    */
   NodeList<Label> get labels => _labels;
-  
+
   /**
    * Return the statement with which the labels are being associated.
    * @return the statement with which the labels are being associated
    */
   Statement get statement => _statement;
-  
+
   /**
    * Set the statement with which the labels are being associated to the given statement.
    * @param statement the statement with which the labels are being associated
@@ -8032,7 +8079,6 @@
     safelyVisitChild(_statement, visitor);
   }
 }
-
 /**
  * Instances of the class {@code LibraryDirective} represent a library directive.
  * <pre>
@@ -8041,22 +8087,22 @@
  * @coverage dart.engine.ast
  */
 class LibraryDirective extends Directive {
-  
+
   /**
    * The token representing the 'library' token.
    */
   Token _libraryToken;
-  
+
   /**
    * The name of the library being defined.
    */
   LibraryIdentifier _name;
-  
+
   /**
    * The semicolon terminating the directive.
    */
   Token _semicolon;
-  
+
   /**
    * Initialize a newly created library directive.
    * @param comment the documentation comment associated with this directive
@@ -8070,7 +8116,7 @@
     this._name = becomeParentOf(name);
     this._semicolon = semicolon;
   }
-  
+
   /**
    * Initialize a newly created library directive.
    * @param comment the documentation comment associated with this directive
@@ -8083,25 +8129,25 @@
   accept(ASTVisitor visitor) => visitor.visitLibraryDirective(this);
   Token get endToken => _semicolon;
   Token get keyword => _libraryToken;
-  
+
   /**
    * Return the token representing the 'library' token.
    * @return the token representing the 'library' token
    */
   Token get libraryToken => _libraryToken;
-  
+
   /**
    * Return the name of the library being defined.
    * @return the name of the library being defined
    */
   LibraryIdentifier get name => _name;
-  
+
   /**
    * Return the semicolon terminating the directive.
    * @return the semicolon terminating the directive
    */
   Token get semicolon => _semicolon;
-  
+
   /**
    * Set the token representing the 'library' token to the given token.
    * @param libraryToken the token representing the 'library' token
@@ -8109,7 +8155,7 @@
   void set libraryToken(Token libraryToken2) {
     this._libraryToken = libraryToken2;
   }
-  
+
   /**
    * Set the name of the library being defined to the given name.
    * @param name the name of the library being defined
@@ -8117,7 +8163,7 @@
   void set name(LibraryIdentifier name2) {
     this._name = becomeParentOf(name2);
   }
-  
+
   /**
    * Set the semicolon terminating the directive to the given token.
    * @param semicolon the semicolon terminating the directive
@@ -8131,7 +8177,6 @@
   }
   Token get firstTokenAfterCommentAndMetadata => _libraryToken;
 }
-
 /**
  * Instances of the class {@code LibraryIdentifier} represent the identifier for a library.
  * <pre>
@@ -8140,12 +8185,12 @@
  * @coverage dart.engine.ast
  */
 class LibraryIdentifier extends Identifier {
-  
+
   /**
    * The components of the identifier.
    */
   NodeList<SimpleIdentifier> _components;
-  
+
   /**
    * Initialize a newly created prefixed identifier.
    * @param components the components of the identifier
@@ -8154,7 +8199,7 @@
     this._components = new NodeList<SimpleIdentifier>(this);
     this._components.addAll(components);
   }
-  
+
   /**
    * Initialize a newly created prefixed identifier.
    * @param components the components of the identifier
@@ -8162,7 +8207,7 @@
   LibraryIdentifier({List<SimpleIdentifier> components}) : this.full(components);
   accept(ASTVisitor visitor) => visitor.visitLibraryIdentifier(this);
   Token get beginToken => _components.beginToken;
-  
+
   /**
    * Return the components of the identifier.
    * @return the components of the identifier
@@ -8188,7 +8233,6 @@
     _components.accept(visitor);
   }
 }
-
 /**
  * Instances of the class {@code ListLiteral} represent a list literal.
  * <pre>
@@ -8198,22 +8242,22 @@
  * @coverage dart.engine.ast
  */
 class ListLiteral extends TypedLiteral {
-  
+
   /**
    * The left square bracket.
    */
   Token _leftBracket;
-  
+
   /**
    * The expressions used to compute the elements of the list.
    */
   NodeList<Expression> _elements;
-  
+
   /**
    * The right square bracket.
    */
   Token _rightBracket;
-  
+
   /**
    * Initialize a newly created list literal.
    * @param modifier the const modifier associated with this literal
@@ -8229,7 +8273,7 @@
     this._elements.addAll(elements);
     this._rightBracket = rightBracket;
   }
-  
+
   /**
    * Initialize a newly created list literal.
    * @param modifier the const modifier associated with this literal
@@ -8252,26 +8296,26 @@
     }
     return _leftBracket;
   }
-  
+
   /**
    * Return the expressions used to compute the elements of the list.
    * @return the expressions used to compute the elements of the list
    */
   NodeList<Expression> get elements => _elements;
   Token get endToken => _rightBracket;
-  
+
   /**
    * Return the left square bracket.
    * @return the left square bracket
    */
   Token get leftBracket => _leftBracket;
-  
+
   /**
    * Return the right square bracket.
    * @return the right square bracket
    */
   Token get rightBracket => _rightBracket;
-  
+
   /**
    * Set the left square bracket to the given token.
    * @param bracket the left square bracket
@@ -8279,7 +8323,7 @@
   void set leftBracket(Token bracket) {
     _leftBracket = bracket;
   }
-  
+
   /**
    * Set the right square bracket to the given token.
    * @param bracket the right square bracket
@@ -8292,7 +8336,6 @@
     _elements.accept(visitor);
   }
 }
-
 /**
  * The abstract class {@code Literal} defines the behavior common to nodes that represent a literal
  * expression.
@@ -8302,7 +8345,6 @@
  */
 abstract class Literal extends Expression {
 }
-
 /**
  * Instances of the class {@code MapLiteral} represent a literal map.
  * <pre>
@@ -8312,22 +8354,22 @@
  * @coverage dart.engine.ast
  */
 class MapLiteral extends TypedLiteral {
-  
+
   /**
    * The left curly bracket.
    */
   Token _leftBracket;
-  
+
   /**
    * The entries in the map.
    */
   NodeList<MapLiteralEntry> _entries;
-  
+
   /**
    * The right curly bracket.
    */
   Token _rightBracket;
-  
+
   /**
    * Initialize a newly created map literal.
    * @param modifier the const modifier associated with this literal
@@ -8343,7 +8385,7 @@
     this._entries.addAll(entries);
     this._rightBracket = rightBracket;
   }
-  
+
   /**
    * Initialize a newly created map literal.
    * @param modifier the const modifier associated with this literal
@@ -8367,25 +8409,25 @@
     return _leftBracket;
   }
   Token get endToken => _rightBracket;
-  
+
   /**
    * Return the entries in the map.
    * @return the entries in the map
    */
   NodeList<MapLiteralEntry> get entries => _entries;
-  
+
   /**
    * Return the left curly bracket.
    * @return the left curly bracket
    */
   Token get leftBracket => _leftBracket;
-  
+
   /**
    * Return the right curly bracket.
    * @return the right curly bracket
    */
   Token get rightBracket => _rightBracket;
-  
+
   /**
    * Set the left curly bracket to the given token.
    * @param bracket the left curly bracket
@@ -8393,7 +8435,7 @@
   void set leftBracket(Token bracket) {
     _leftBracket = bracket;
   }
-  
+
   /**
    * Set the right curly bracket to the given token.
    * @param bracket the right curly bracket
@@ -8406,7 +8448,6 @@
     _entries.accept(visitor);
   }
 }
-
 /**
  * Instances of the class {@code MapLiteralEntry} represent a single key/value pair in a map
  * literal.
@@ -8415,22 +8456,22 @@
  * @coverage dart.engine.ast
  */
 class MapLiteralEntry extends ASTNode {
-  
+
   /**
    * The expression computing the key with which the value will be associated.
    */
   Expression _key;
-  
+
   /**
    * The colon that separates the key from the value.
    */
   Token _separator;
-  
+
   /**
    * The expression computing the value that will be associated with the key.
    */
   Expression _value;
-  
+
   /**
    * Initialize a newly created map literal entry.
    * @param key the expression computing the key with which the value will be associated
@@ -8442,7 +8483,7 @@
     this._separator = separator;
     this._value = becomeParentOf(value);
   }
-  
+
   /**
    * Initialize a newly created map literal entry.
    * @param key the expression computing the key with which the value will be associated
@@ -8453,25 +8494,25 @@
   accept(ASTVisitor visitor) => visitor.visitMapLiteralEntry(this);
   Token get beginToken => _key.beginToken;
   Token get endToken => _value.endToken;
-  
+
   /**
    * Return the expression computing the key with which the value will be associated.
    * @return the expression computing the key with which the value will be associated
    */
   Expression get key => _key;
-  
+
   /**
    * Return the colon that separates the key from the value.
    * @return the colon that separates the key from the value
    */
   Token get separator => _separator;
-  
+
   /**
    * Return the expression computing the value that will be associated with the key.
    * @return the expression computing the value that will be associated with the key
    */
   Expression get value => _value;
-  
+
   /**
    * Set the expression computing the key with which the value will be associated to the given
    * string.
@@ -8480,7 +8521,7 @@
   void set key(Expression string) {
     _key = becomeParentOf(string);
   }
-  
+
   /**
    * Set the colon that separates the key from the value to the given token.
    * @param separator the colon that separates the key from the value
@@ -8488,7 +8529,7 @@
   void set separator(Token separator2) {
     this._separator = separator2;
   }
-  
+
   /**
    * Set the expression computing the value that will be associated with the key to the given
    * expression.
@@ -8502,7 +8543,6 @@
     safelyVisitChild(_value, visitor);
   }
 }
-
 /**
  * Instances of the class {@code MethodDeclaration} represent a method declaration.
  * <pre>
@@ -8512,50 +8552,50 @@
  * @coverage dart.engine.ast
  */
 class MethodDeclaration extends ClassMember {
-  
+
   /**
    * The token for the 'external' keyword, or {@code null} if the constructor is not external.
    */
   Token _externalKeyword;
-  
+
   /**
    * The token representing the 'abstract' or 'static' keyword, or {@code null} if neither modifier
    * was specified.
    */
   Token _modifierKeyword;
-  
+
   /**
    * The return type of the method, or {@code null} if no return type was declared.
    */
   TypeName _returnType;
-  
+
   /**
    * The token representing the 'get' or 'set' keyword, or {@code null} if this is a method
    * declaration rather than a property declaration.
    */
   Token _propertyKeyword;
-  
+
   /**
    * The token representing the 'operator' keyword, or {@code null} if this method does not declare
    * an operator.
    */
   Token _operatorKeyword;
-  
+
   /**
    * The name of the method.
    */
   SimpleIdentifier _name;
-  
+
   /**
    * The parameters associated with the method, or {@code null} if this method declares a getter.
    */
   FormalParameterList _parameters;
-  
+
   /**
    * The body of the method.
    */
   FunctionBody _body;
-  
+
   /**
    * Initialize a newly created method declaration.
    * @param externalKeyword the token for the 'external' keyword
@@ -8580,7 +8620,7 @@
     this._parameters = becomeParentOf(parameters);
     this._body = becomeParentOf(body);
   }
-  
+
   /**
    * Initialize a newly created method declaration.
    * @param externalKeyword the token for the 'external' keyword
@@ -8597,13 +8637,13 @@
    */
   MethodDeclaration({Comment comment, List<Annotation> metadata, Token externalKeyword, Token modifierKeyword, TypeName returnType, Token propertyKeyword, Token operatorKeyword, SimpleIdentifier name, FormalParameterList parameters, FunctionBody body}) : this.full(comment, metadata, externalKeyword, modifierKeyword, returnType, propertyKeyword, operatorKeyword, name, parameters, body);
   accept(ASTVisitor visitor) => visitor.visitMethodDeclaration(this);
-  
+
   /**
    * Return the body of the method.
    * @return the body of the method
    */
   FunctionBody get body => _body;
-  
+
   /**
    * Return the element associated with this method, or {@code null} if the AST structure has not
    * been resolved. The element can either be a {@link MethodElement}, if this represents the
@@ -8613,84 +8653,84 @@
    */
   ExecutableElement get element => _name != null ? (_name.element as ExecutableElement) : null;
   Token get endToken => _body.endToken;
-  
+
   /**
    * Return the token for the 'external' keyword, or {@code null} if the constructor is not
    * external.
    * @return the token for the 'external' keyword
    */
   Token get externalKeyword => _externalKeyword;
-  
+
   /**
    * Return the token representing the 'abstract' or 'static' keyword, or {@code null} if neither
    * modifier was specified.
    * @return the token representing the 'abstract' or 'static' keyword
    */
   Token get modifierKeyword => _modifierKeyword;
-  
+
   /**
    * Return the name of the method.
    * @return the name of the method
    */
   SimpleIdentifier get name => _name;
-  
+
   /**
    * Return the token representing the 'operator' keyword, or {@code null} if this method does not
    * declare an operator.
    * @return the token representing the 'operator' keyword
    */
   Token get operatorKeyword => _operatorKeyword;
-  
+
   /**
    * Return the parameters associated with the method, or {@code null} if this method declares a
    * getter.
    * @return the parameters associated with the method
    */
   FormalParameterList get parameters => _parameters;
-  
+
   /**
    * Return the token representing the 'get' or 'set' keyword, or {@code null} if this is a method
    * declaration rather than a property declaration.
    * @return the token representing the 'get' or 'set' keyword
    */
   Token get propertyKeyword => _propertyKeyword;
-  
+
   /**
    * Return the return type of the method, or {@code null} if no return type was declared.
    * @return the return type of the method
    */
   TypeName get returnType => _returnType;
-  
+
   /**
    * Return {@code true} if this method is declared to be an abstract method.
    * @return {@code true} if this method is declared to be an abstract method
    */
   bool isAbstract() => _externalKeyword == null && (_body is EmptyFunctionBody);
-  
+
   /**
    * Return {@code true} if this method declares a getter.
    * @return {@code true} if this method declares a getter
    */
   bool isGetter() => _propertyKeyword != null && identical(((_propertyKeyword as KeywordToken)).keyword, Keyword.GET);
-  
+
   /**
    * Return {@code true} if this method declares an operator.
    * @return {@code true} if this method declares an operator
    */
   bool isOperator() => _operatorKeyword != null;
-  
+
   /**
    * Return {@code true} if this method declares a setter.
    * @return {@code true} if this method declares a setter
    */
   bool isSetter() => _propertyKeyword != null && identical(((_propertyKeyword as KeywordToken)).keyword, Keyword.SET);
-  
+
   /**
    * Return {@code true} if this method is declared to be a static method.
    * @return {@code true} if this method is declared to be a static method
    */
   bool isStatic() => _modifierKeyword != null && identical(((_modifierKeyword as KeywordToken)).keyword, Keyword.STATIC);
-  
+
   /**
    * Set the body of the method to the given function body.
    * @param functionBody the body of the method
@@ -8698,7 +8738,7 @@
   void set body(FunctionBody functionBody) {
     _body = becomeParentOf(functionBody);
   }
-  
+
   /**
    * Set the token for the 'external' keyword to the given token.
    * @param externalKeyword the token for the 'external' keyword
@@ -8706,7 +8746,7 @@
   void set externalKeyword(Token externalKeyword2) {
     this._externalKeyword = externalKeyword2;
   }
-  
+
   /**
    * Set the token representing the 'abstract' or 'static' keyword to the given token.
    * @param modifierKeyword the token representing the 'abstract' or 'static' keyword
@@ -8714,7 +8754,7 @@
   void set modifierKeyword(Token modifierKeyword2) {
     this._modifierKeyword = modifierKeyword2;
   }
-  
+
   /**
    * Set the name of the method to the given identifier.
    * @param identifier the name of the method
@@ -8722,7 +8762,7 @@
   void set name(SimpleIdentifier identifier) {
     _name = becomeParentOf(identifier);
   }
-  
+
   /**
    * Set the token representing the 'operator' keyword to the given token.
    * @param operatorKeyword the token representing the 'operator' keyword
@@ -8730,7 +8770,7 @@
   void set operatorKeyword(Token operatorKeyword2) {
     this._operatorKeyword = operatorKeyword2;
   }
-  
+
   /**
    * Set the parameters associated with the method to the given list of parameters.
    * @param parameters the parameters associated with the method
@@ -8738,7 +8778,7 @@
   void set parameters(FormalParameterList parameters2) {
     this._parameters = becomeParentOf(parameters2);
   }
-  
+
   /**
    * Set the token representing the 'get' or 'set' keyword to the given token.
    * @param propertyKeyword the token representing the 'get' or 'set' keyword
@@ -8746,7 +8786,7 @@
   void set propertyKeyword(Token propertyKeyword2) {
     this._propertyKeyword = propertyKeyword2;
   }
-  
+
   /**
    * Set the return type of the method to the given type name.
    * @param typeName the return type of the method
@@ -8774,7 +8814,6 @@
     return _name.beginToken;
   }
 }
-
 /**
  * Instances of the class {@code MethodInvocation} represent the invocation of either a function or
  * a method. Invocations of functions resulting from evaluating an expression are represented by{@link FunctionExpressionInvocation function expression invocation} nodes. Invocations of getters
@@ -8785,29 +8824,29 @@
  * @coverage dart.engine.ast
  */
 class MethodInvocation extends Expression {
-  
+
   /**
    * The expression producing the object on which the method is defined, or {@code null} if there is
    * no target (that is, the target is implicitly {@code this}).
    */
   Expression _target;
-  
+
   /**
    * The period that separates the target from the method name, or {@code null} if there is no
    * target.
    */
   Token _period;
-  
+
   /**
    * The name of the method being invoked.
    */
   SimpleIdentifier _methodName;
-  
+
   /**
    * The list of arguments to the method.
    */
   ArgumentList _argumentList;
-  
+
   /**
    * Initialize a newly created method invocation.
    * @param target the expression producing the object on which the method is defined
@@ -8821,7 +8860,7 @@
     this._methodName = becomeParentOf(methodName);
     this._argumentList = becomeParentOf(argumentList);
   }
-  
+
   /**
    * Initialize a newly created method invocation.
    * @param target the expression producing the object on which the method is defined
@@ -8831,7 +8870,7 @@
    */
   MethodInvocation({Expression target, Token period, SimpleIdentifier methodName, ArgumentList argumentList}) : this.full(target, period, methodName, argumentList);
   accept(ASTVisitor visitor) => visitor.visitMethodInvocation(this);
-  
+
   /**
    * Return the list of arguments to the method.
    * @return the list of arguments to the method
@@ -8846,20 +8885,20 @@
     return _methodName.beginToken;
   }
   Token get endToken => _argumentList.endToken;
-  
+
   /**
    * Return the name of the method being invoked.
    * @return the name of the method being invoked
    */
   SimpleIdentifier get methodName => _methodName;
-  
+
   /**
    * Return the period that separates the target from the method name, or {@code null} if there is
    * no target.
    * @return the period that separates the target from the method name
    */
   Token get period => _period;
-  
+
   /**
    * Return the expression used to compute the receiver of the invocation. If this invocation is not
    * part of a cascade expression, then this is the same as {@link #getTarget()}. If this invocation
@@ -8881,7 +8920,7 @@
     }
     return _target;
   }
-  
+
   /**
    * Return the expression producing the object on which the method is defined, or {@code null} if
    * there is no target (that is, the target is implicitly {@code this}) or if this method
@@ -8890,14 +8929,14 @@
    * @see #getRealTarget()
    */
   Expression get target => _target;
-  
+
   /**
    * Return {@code true} if this expression is cascaded. If it is, then the target of this
    * expression is not stored locally but is stored in the nearest ancestor that is a{@link CascadeExpression}.
    * @return {@code true} if this expression is cascaded
    */
   bool isCascaded() => _period != null && identical(_period.type, TokenType.PERIOD_PERIOD);
-  
+
   /**
    * Set the list of arguments to the method to the given list.
    * @param argumentList the list of arguments to the method
@@ -8905,7 +8944,7 @@
   void set argumentList(ArgumentList argumentList2) {
     this._argumentList = becomeParentOf(argumentList2);
   }
-  
+
   /**
    * Set the name of the method being invoked to the given identifier.
    * @param identifier the name of the method being invoked
@@ -8913,7 +8952,7 @@
   void set methodName(SimpleIdentifier identifier) {
     _methodName = becomeParentOf(identifier);
   }
-  
+
   /**
    * Set the period that separates the target from the method name to the given token.
    * @param period the period that separates the target from the method name
@@ -8921,7 +8960,7 @@
   void set period(Token period2) {
     this._period = period2;
   }
-  
+
   /**
    * Set the expression producing the object on which the method is defined to the given expression.
    * @param expression the expression producing the object on which the method is defined
@@ -8935,7 +8974,6 @@
     safelyVisitChild(_argumentList, visitor);
   }
 }
-
 /**
  * Instances of the class {@code NamedExpression} represent an expression that has a name associated
  * with it. They are used in method invocations when there are named parameters.
@@ -8944,17 +8982,17 @@
  * @coverage dart.engine.ast
  */
 class NamedExpression extends Expression {
-  
+
   /**
    * The name associated with the expression.
    */
   Label _name;
-  
+
   /**
    * The expression with which the name is associated.
    */
   Expression _expression;
-  
+
   /**
    * Initialize a newly created named expression.
    * @param name the name associated with the expression
@@ -8964,7 +9002,7 @@
     this._name = becomeParentOf(name);
     this._expression = becomeParentOf(expression);
   }
-  
+
   /**
    * Initialize a newly created named expression.
    * @param name the name associated with the expression
@@ -8973,7 +9011,7 @@
   NamedExpression({Label name, Expression expression}) : this.full(name, expression);
   accept(ASTVisitor visitor) => visitor.visitNamedExpression(this);
   Token get beginToken => _name.beginToken;
-  
+
   /**
    * Return the element representing the parameter being named by this expression, or {@code null}if the AST structure has not been resolved or if there is no parameter with the same name as
    * this expression.
@@ -8987,19 +9025,19 @@
     return null;
   }
   Token get endToken => _expression.endToken;
-  
+
   /**
    * Return the expression with which the name is associated.
    * @return the expression with which the name is associated
    */
   Expression get expression => _expression;
-  
+
   /**
    * Return the name associated with the expression.
    * @return the name associated with the expression
    */
   Label get name => _name;
-  
+
   /**
    * Set the expression with which the name is associated to the given expression.
    * @param expression the expression with which the name is associated
@@ -9007,7 +9045,7 @@
   void set expression(Expression expression2) {
     this._expression = becomeParentOf(expression2);
   }
-  
+
   /**
    * Set the name associated with the expression to the given identifier.
    * @param identifier the name associated with the expression
@@ -9020,7 +9058,6 @@
     safelyVisitChild(_expression, visitor);
   }
 }
-
 /**
  * The abstract class {@code NamespaceDirective} defines the behavior common to nodes that represent
  * a directive that impacts the namespace of a library.
@@ -9029,22 +9066,22 @@
  * @coverage dart.engine.ast
  */
 abstract class NamespaceDirective extends UriBasedDirective {
-  
+
   /**
    * The token representing the 'import' or 'export' keyword.
    */
   Token _keyword;
-  
+
   /**
    * The combinators used to control which names are imported or exported.
    */
   NodeList<Combinator> _combinators;
-  
+
   /**
    * The semicolon terminating the directive.
    */
   Token _semicolon;
-  
+
   /**
    * Initialize a newly created namespace directive.
    * @param comment the documentation comment associated with this directive
@@ -9060,7 +9097,7 @@
     this._combinators.addAll(combinators);
     this._semicolon = semicolon;
   }
-  
+
   /**
    * Initialize a newly created namespace directive.
    * @param comment the documentation comment associated with this directive
@@ -9071,7 +9108,7 @@
    * @param semicolon the semicolon terminating the directive
    */
   NamespaceDirective({Comment comment, List<Annotation> metadata, Token keyword, StringLiteral libraryUri, List<Combinator> combinators, Token semicolon}) : this.full(comment, metadata, keyword, libraryUri, combinators, semicolon);
-  
+
   /**
    * Return the combinators used to control how names are imported or exported.
    * @return the combinators used to control how names are imported or exported
@@ -9079,14 +9116,14 @@
   NodeList<Combinator> get combinators => _combinators;
   Token get endToken => _semicolon;
   Token get keyword => _keyword;
-  
+
   /**
    * Return the semicolon terminating the directive.
    * @return the semicolon terminating the directive
    */
   Token get semicolon => _semicolon;
   LibraryElement get uriElement;
-  
+
   /**
    * Set the token representing the 'import' or 'export' keyword to the given token.
    * @param exportToken the token representing the 'import' or 'export' keyword
@@ -9094,7 +9131,7 @@
   void set keyword(Token exportToken) {
     this._keyword = exportToken;
   }
-  
+
   /**
    * Set the semicolon terminating the directive to the given token.
    * @param semicolon the semicolon terminating the directive
@@ -9104,7 +9141,6 @@
   }
   Token get firstTokenAfterCommentAndMetadata => _keyword;
 }
-
 /**
  * Instances of the class {@code NativeFunctionBody} represent a function body that consists of a
  * native keyword followed by a string literal.
@@ -9115,22 +9151,22 @@
  * @coverage dart.engine.ast
  */
 class NativeFunctionBody extends FunctionBody {
-  
+
   /**
    * The token representing 'native' that marks the start of the function body.
    */
   Token _nativeToken;
-  
+
   /**
    * The string literal, after the 'native' token.
    */
   StringLiteral _stringLiteral;
-  
+
   /**
    * The token representing the semicolon that marks the end of the function body.
    */
   Token _semicolon;
-  
+
   /**
    * Initialize a newly created function body consisting of the 'native' token, a string literal,
    * and a semicolon.
@@ -9143,7 +9179,7 @@
     this._stringLiteral = becomeParentOf(stringLiteral);
     this._semicolon = semicolon;
   }
-  
+
   /**
    * Initialize a newly created function body consisting of the 'native' token, a string literal,
    * and a semicolon.
@@ -9155,19 +9191,19 @@
   accept(ASTVisitor visitor) => visitor.visitNativeFunctionBody(this);
   Token get beginToken => _nativeToken;
   Token get endToken => _semicolon;
-  
+
   /**
    * Return the simple identifier representing the 'native' token.
    * @return the simple identifier representing the 'native' token
    */
   Token get nativeToken => _nativeToken;
-  
+
   /**
    * Return the token representing the semicolon that marks the end of the function body.
    * @return the token representing the semicolon that marks the end of the function body
    */
   Token get semicolon => _semicolon;
-  
+
   /**
    * Return the string literal representing the string after the 'native' token.
    * @return the string literal representing the string after the 'native' token
@@ -9177,7 +9213,6 @@
     safelyVisitChild(_stringLiteral, visitor);
   }
 }
-
 /**
  * The abstract class {@code NormalFormalParameter} defines the behavior common to formal parameters
  * that are required (are not optional).
@@ -9186,23 +9221,23 @@
  * @coverage dart.engine.ast
  */
 abstract class NormalFormalParameter extends FormalParameter {
-  
+
   /**
    * The documentation comment associated with this parameter, or {@code null} if this parameter
    * does not have a documentation comment associated with it.
    */
   Comment _comment;
-  
+
   /**
    * The annotations associated with this parameter.
    */
   NodeList<Annotation> _metadata;
-  
+
   /**
    * The name of the parameter being declared.
    */
   SimpleIdentifier _identifier;
-  
+
   /**
    * Initialize a newly created formal parameter.
    * @param comment the documentation comment associated with this parameter
@@ -9215,7 +9250,7 @@
     this._metadata.addAll(metadata);
     this._identifier = becomeParentOf(identifier);
   }
-  
+
   /**
    * Initialize a newly created formal parameter.
    * @param comment the documentation comment associated with this parameter
@@ -9223,7 +9258,7 @@
    * @param identifier the name of the parameter being declared
    */
   NormalFormalParameter({Comment comment, List<Annotation> metadata, SimpleIdentifier identifier}) : this.full(comment, metadata, identifier);
-  
+
   /**
    * Return the documentation comment associated with this parameter, or {@code null} if this
    * parameter does not have a documentation comment associated with it.
@@ -9238,19 +9273,19 @@
     }
     return ParameterKind.REQUIRED;
   }
-  
+
   /**
    * Return the annotations associated with this parameter.
    * @return the annotations associated with this parameter
    */
   NodeList<Annotation> get metadata => _metadata;
-  
+
   /**
    * Return {@code true} if this parameter was declared with the 'const' modifier.
    * @return {@code true} if this parameter was declared with the 'const' modifier
    */
   bool isConst();
-  
+
   /**
    * Return {@code true} if this parameter was declared with the 'final' modifier. Parameters that
    * are declared with the 'const' modifier will return {@code false} even though they are
@@ -9258,7 +9293,7 @@
    * @return {@code true} if this parameter was declared with the 'final' modifier
    */
   bool isFinal();
-  
+
   /**
    * Set the documentation comment associated with this parameter to the given comment
    * @param comment the documentation comment to be associated with this parameter
@@ -9266,7 +9301,7 @@
   void set documentationComment(Comment comment2) {
     this._comment = becomeParentOf(comment2);
   }
-  
+
   /**
    * Set the name of the parameter being declared to the given identifier.
    * @param identifier the name of the parameter being declared
@@ -9284,7 +9319,7 @@
       }
     }
   }
-  
+
   /**
    * Return {@code true} if the comment is lexically before any annotations.
    * @return {@code true} if the comment is lexically before any annotations
@@ -9296,7 +9331,7 @@
     Annotation firstAnnotation = _metadata[0];
     return _comment.offset < firstAnnotation.offset;
   }
-  
+
   /**
    * Return an array containing the comment and annotations associated with this parameter, sorted
    * in lexical order.
@@ -9308,11 +9343,10 @@
     childList.add(_comment);
     childList.addAll(_metadata);
     List<ASTNode> children = new List.from(childList);
-    children.sort();
+    children.sort(ASTNode.LEXICAL_ORDER);
     return children;
   }
 }
-
 /**
  * Instances of the class {@code NullLiteral} represent a null literal expression.
  * <pre>
@@ -9322,12 +9356,12 @@
  * @coverage dart.engine.ast
  */
 class NullLiteral extends Literal {
-  
+
   /**
    * The token representing the literal.
    */
   Token _literal;
-  
+
   /**
    * Initialize a newly created null literal.
    * @param token the token representing the literal
@@ -9335,7 +9369,7 @@
   NullLiteral.full(Token token) {
     this._literal = token;
   }
-  
+
   /**
    * Initialize a newly created null literal.
    * @param token the token representing the literal
@@ -9344,13 +9378,13 @@
   accept(ASTVisitor visitor) => visitor.visitNullLiteral(this);
   Token get beginToken => _literal;
   Token get endToken => _literal;
-  
+
   /**
    * Return the token representing the literal.
    * @return the token representing the literal
    */
   Token get literal => _literal;
-  
+
   /**
    * Set the token representing the literal to the given token.
    * @param literal the token representing the literal
@@ -9361,7 +9395,6 @@
   void visitChildren(ASTVisitor<Object> visitor) {
   }
 }
-
 /**
  * Instances of the class {@code ParenthesizedExpression} represent a parenthesized expression.
  * <pre>
@@ -9371,22 +9404,22 @@
  * @coverage dart.engine.ast
  */
 class ParenthesizedExpression extends Expression {
-  
+
   /**
    * The left parenthesis.
    */
   Token _leftParenthesis;
-  
+
   /**
    * The expression within the parentheses.
    */
   Expression _expression;
-  
+
   /**
    * The right parenthesis.
    */
   Token _rightParenthesis;
-  
+
   /**
    * Initialize a newly created parenthesized expression.
    * @param leftParenthesis the left parenthesis
@@ -9398,7 +9431,7 @@
     this._expression = becomeParentOf(expression);
     this._rightParenthesis = rightParenthesis;
   }
-  
+
   /**
    * Initialize a newly created parenthesized expression.
    * @param leftParenthesis the left parenthesis
@@ -9409,25 +9442,25 @@
   accept(ASTVisitor visitor) => visitor.visitParenthesizedExpression(this);
   Token get beginToken => _leftParenthesis;
   Token get endToken => _rightParenthesis;
-  
+
   /**
    * Return the expression within the parentheses.
    * @return the expression within the parentheses
    */
   Expression get expression => _expression;
-  
+
   /**
    * Return the left parenthesis.
    * @return the left parenthesis
    */
   Token get leftParenthesis => _leftParenthesis;
-  
+
   /**
    * Return the right parenthesis.
    * @return the right parenthesis
    */
   Token get rightParenthesis => _rightParenthesis;
-  
+
   /**
    * Set the expression within the parentheses to the given expression.
    * @param expression the expression within the parentheses
@@ -9435,7 +9468,7 @@
   void set expression(Expression expression2) {
     this._expression = becomeParentOf(expression2);
   }
-  
+
   /**
    * Set the left parenthesis to the given token.
    * @param parenthesis the left parenthesis
@@ -9443,7 +9476,7 @@
   void set leftParenthesis(Token parenthesis) {
     _leftParenthesis = parenthesis;
   }
-  
+
   /**
    * Set the right parenthesis to the given token.
    * @param parenthesis the right parenthesis
@@ -9455,7 +9488,6 @@
     safelyVisitChild(_expression, visitor);
   }
 }
-
 /**
  * Instances of the class {@code PartDirective} represent a part directive.
  * <pre>
@@ -9464,17 +9496,17 @@
  * @coverage dart.engine.ast
  */
 class PartDirective extends UriBasedDirective {
-  
+
   /**
    * The token representing the 'part' token.
    */
   Token _partToken;
-  
+
   /**
    * The semicolon terminating the directive.
    */
   Token _semicolon;
-  
+
   /**
    * Initialize a newly created part directive.
    * @param comment the documentation comment associated with this directive
@@ -9487,7 +9519,7 @@
     this._partToken = partToken;
     this._semicolon = semicolon;
   }
-  
+
   /**
    * Initialize a newly created part directive.
    * @param comment the documentation comment associated with this directive
@@ -9500,20 +9532,20 @@
   accept(ASTVisitor visitor) => visitor.visitPartDirective(this);
   Token get endToken => _semicolon;
   Token get keyword => _partToken;
-  
+
   /**
    * Return the token representing the 'part' token.
    * @return the token representing the 'part' token
    */
   Token get partToken => _partToken;
-  
+
   /**
    * Return the semicolon terminating the directive.
    * @return the semicolon terminating the directive
    */
   Token get semicolon => _semicolon;
   CompilationUnitElement get uriElement => element as CompilationUnitElement;
-  
+
   /**
    * Set the token representing the 'part' token to the given token.
    * @param partToken the token representing the 'part' token
@@ -9521,7 +9553,7 @@
   void set partToken(Token partToken2) {
     this._partToken = partToken2;
   }
-  
+
   /**
    * Set the semicolon terminating the directive to the given token.
    * @param semicolon the semicolon terminating the directive
@@ -9531,7 +9563,6 @@
   }
   Token get firstTokenAfterCommentAndMetadata => _partToken;
 }
-
 /**
  * Instances of the class {@code PartOfDirective} represent a part-of directive.
  * <pre>
@@ -9540,27 +9571,27 @@
  * @coverage dart.engine.ast
  */
 class PartOfDirective extends Directive {
-  
+
   /**
    * The token representing the 'part' token.
    */
   Token _partToken;
-  
+
   /**
    * The token representing the 'of' token.
    */
   Token _ofToken;
-  
+
   /**
    * The name of the library that the containing compilation unit is part of.
    */
   LibraryIdentifier _libraryName;
-  
+
   /**
    * The semicolon terminating the directive.
    */
   Token _semicolon;
-  
+
   /**
    * Initialize a newly created part-of directive.
    * @param comment the documentation comment associated with this directive
@@ -9576,7 +9607,7 @@
     this._libraryName = becomeParentOf(libraryName);
     this._semicolon = semicolon;
   }
-  
+
   /**
    * Initialize a newly created part-of directive.
    * @param comment the documentation comment associated with this directive
@@ -9590,31 +9621,31 @@
   accept(ASTVisitor visitor) => visitor.visitPartOfDirective(this);
   Token get endToken => _semicolon;
   Token get keyword => _partToken;
-  
+
   /**
    * Return the name of the library that the containing compilation unit is part of.
    * @return the name of the library that the containing compilation unit is part of
    */
   LibraryIdentifier get libraryName => _libraryName;
-  
+
   /**
    * Return the token representing the 'of' token.
    * @return the token representing the 'of' token
    */
   Token get ofToken => _ofToken;
-  
+
   /**
    * Return the token representing the 'part' token.
    * @return the token representing the 'part' token
    */
   Token get partToken => _partToken;
-  
+
   /**
    * Return the semicolon terminating the directive.
    * @return the semicolon terminating the directive
    */
   Token get semicolon => _semicolon;
-  
+
   /**
    * Set the name of the library that the containing compilation unit is part of to the given name.
    * @param libraryName the name of the library that the containing compilation unit is part of
@@ -9622,7 +9653,7 @@
   void set libraryName(LibraryIdentifier libraryName2) {
     this._libraryName = becomeParentOf(libraryName2);
   }
-  
+
   /**
    * Set the token representing the 'of' token to the given token.
    * @param ofToken the token representing the 'of' token
@@ -9630,7 +9661,7 @@
   void set ofToken(Token ofToken2) {
     this._ofToken = ofToken2;
   }
-  
+
   /**
    * Set the token representing the 'part' token to the given token.
    * @param partToken the token representing the 'part' token
@@ -9638,7 +9669,7 @@
   void set partToken(Token partToken2) {
     this._partToken = partToken2;
   }
-  
+
   /**
    * Set the semicolon terminating the directive to the given token.
    * @param semicolon the semicolon terminating the directive
@@ -9652,7 +9683,6 @@
   }
   Token get firstTokenAfterCommentAndMetadata => _partToken;
 }
-
 /**
  * Instances of the class {@code PostfixExpression} represent a postfix unary expression.
  * <pre>
@@ -9660,29 +9690,29 @@
  * @coverage dart.engine.ast
  */
 class PostfixExpression extends Expression {
-  
+
   /**
    * The expression computing the operand for the operator.
    */
   Expression _operand;
-  
+
   /**
    * The postfix operator being applied to the operand.
    */
   Token _operator;
-  
+
   /**
    * The element associated with this the operator based on the propagated type of the operand, or{@code null} if the AST structure has not been resolved, if the operator is not user definable,
    * or if the operator could not be resolved.
    */
   MethodElement _propagatedElement;
-  
+
   /**
    * The element associated with the operator based on the static type of the operand, or{@code null} if the AST structure has not been resolved, if the operator is not user definable,
    * or if the operator could not be resolved.
    */
   MethodElement _staticElement;
-  
+
   /**
    * Initialize a newly created postfix expression.
    * @param operand the expression computing the operand for the operator
@@ -9692,7 +9722,7 @@
     this._operand = becomeParentOf(operand);
     this._operator = operator;
   }
-  
+
   /**
    * Initialize a newly created postfix expression.
    * @param operand the expression computing the operand for the operator
@@ -9701,7 +9731,7 @@
   PostfixExpression({Expression operand, Token operator}) : this.full(operand, operator);
   accept(ASTVisitor visitor) => visitor.visitPostfixExpression(this);
   Token get beginToken => _operand.beginToken;
-  
+
   /**
    * Return the element associated with the operator based on the propagated type of the operand, or{@code null} if the AST structure has not been resolved, if the operator is not user definable,
    * or if the operator could not be resolved. One example of the latter case is an operator that is
@@ -9710,19 +9740,19 @@
    */
   MethodElement get element => _propagatedElement;
   Token get endToken => _operator;
-  
+
   /**
    * Return the expression computing the operand for the operator.
    * @return the expression computing the operand for the operator
    */
   Expression get operand => _operand;
-  
+
   /**
    * Return the postfix operator being applied to the operand.
    * @return the postfix operator being applied to the operand
    */
   Token get operator => _operator;
-  
+
   /**
    * Return the element associated with the operator based on the static type of the operand, or{@code null} if the AST structure has not been resolved, if the operator is not user definable,
    * or if the operator could not be resolved. One example of the latter case is an operator that is
@@ -9730,7 +9760,7 @@
    * @return the element associated with the operator
    */
   MethodElement get staticElement => _staticElement;
-  
+
   /**
    * Set the element associated with the operator based on the propagated type of the operand to the
    * given element.
@@ -9739,7 +9769,7 @@
   void set element(MethodElement element2) {
     _propagatedElement = element2;
   }
-  
+
   /**
    * Set the expression computing the operand for the operator to the given expression.
    * @param expression the expression computing the operand for the operator
@@ -9747,7 +9777,7 @@
   void set operand(Expression expression) {
     _operand = becomeParentOf(expression);
   }
-  
+
   /**
    * Set the postfix operator being applied to the operand to the given operator.
    * @param operator the postfix operator being applied to the operand
@@ -9755,7 +9785,7 @@
   void set operator(Token operator2) {
     this._operator = operator2;
   }
-  
+
   /**
    * Set the element associated with the operator based on the static type of the operand to the
    * given element.
@@ -9767,8 +9797,47 @@
   void visitChildren(ASTVisitor<Object> visitor) {
     safelyVisitChild(_operand, visitor);
   }
-}
 
+  /**
+   * If the AST structure has been resolved, and the function being invoked is known based on
+   * propagated type information, then return the parameter element representing the parameter to
+   * which the value of the operand will be bound. Otherwise, return {@code null}.
+   * <p>
+   * This method is only intended to be used by {@link Expression#getParameterElement()}.
+   * @return the parameter element representing the parameter to which the value of the right
+   * operand will be bound
+   */
+  ParameterElement get propagatedParameterElementForOperand {
+    if (_propagatedElement == null) {
+      return null;
+    }
+    List<ParameterElement> parameters2 = _propagatedElement.parameters;
+    if (parameters2.length < 1) {
+      return null;
+    }
+    return parameters2[0];
+  }
+
+  /**
+   * If the AST structure has been resolved, and the function being invoked is known based on static
+   * type information, then return the parameter element representing the parameter to which the
+   * value of the operand will be bound. Otherwise, return {@code null}.
+   * <p>
+   * This method is only intended to be used by {@link Expression#getStaticParameterElement()}.
+   * @return the parameter element representing the parameter to which the value of the right
+   * operand will be bound
+   */
+  ParameterElement get staticParameterElementForOperand {
+    if (_staticElement == null) {
+      return null;
+    }
+    List<ParameterElement> parameters2 = _staticElement.parameters;
+    if (parameters2.length < 1) {
+      return null;
+    }
+    return parameters2[0];
+  }
+}
 /**
  * Instances of the class {@code PrefixExpression} represent a prefix unary expression.
  * <pre>
@@ -9776,29 +9845,29 @@
  * @coverage dart.engine.ast
  */
 class PrefixExpression extends Expression {
-  
+
   /**
    * The prefix operator being applied to the operand.
    */
   Token _operator;
-  
+
   /**
    * The expression computing the operand for the operator.
    */
   Expression _operand;
-  
+
   /**
    * The element associated with the operator based on the static type of the operand, or{@code null} if the AST structure has not been resolved, if the operator is not user definable,
    * or if the operator could not be resolved.
    */
   MethodElement _staticElement;
-  
+
   /**
    * The element associated with the operator based on the propagated type of the operand, or{@code null} if the AST structure has not been resolved, if the operator is not user definable,
    * or if the operator could not be resolved.
    */
   MethodElement _propagatedElement;
-  
+
   /**
    * Initialize a newly created prefix expression.
    * @param operator the prefix operator being applied to the operand
@@ -9808,7 +9877,7 @@
     this._operator = operator;
     this._operand = becomeParentOf(operand);
   }
-  
+
   /**
    * Initialize a newly created prefix expression.
    * @param operator the prefix operator being applied to the operand
@@ -9817,7 +9886,7 @@
   PrefixExpression({Token operator, Expression operand}) : this.full(operator, operand);
   accept(ASTVisitor visitor) => visitor.visitPrefixExpression(this);
   Token get beginToken => _operator;
-  
+
   /**
    * Return the element associated with the operator based on the propagated type of the operand, or{@code null} if the AST structure has not been resolved, if the operator is not user definable,
    * or if the operator could not be resolved. One example of the latter case is an operator that is
@@ -9826,19 +9895,19 @@
    */
   MethodElement get element => _propagatedElement;
   Token get endToken => _operand.endToken;
-  
+
   /**
    * Return the expression computing the operand for the operator.
    * @return the expression computing the operand for the operator
    */
   Expression get operand => _operand;
-  
+
   /**
    * Return the prefix operator being applied to the operand.
    * @return the prefix operator being applied to the operand
    */
   Token get operator => _operator;
-  
+
   /**
    * Return the element associated with the operator based on the static type of the operand, or{@code null} if the AST structure has not been resolved, if the operator is not user definable,
    * or if the operator could not be resolved. One example of the latter case is an operator that is
@@ -9846,7 +9915,7 @@
    * @return the element associated with the operator
    */
   MethodElement get staticElement => _staticElement;
-  
+
   /**
    * Set the element associated with the operator based on the propagated type of the operand to the
    * given element.
@@ -9855,7 +9924,7 @@
   void set element(MethodElement element2) {
     _propagatedElement = element2;
   }
-  
+
   /**
    * Set the expression computing the operand for the operator to the given expression.
    * @param expression the expression computing the operand for the operator
@@ -9863,7 +9932,7 @@
   void set operand(Expression expression) {
     _operand = becomeParentOf(expression);
   }
-  
+
   /**
    * Set the prefix operator being applied to the operand to the given operator.
    * @param operator the prefix operator being applied to the operand
@@ -9871,7 +9940,7 @@
   void set operator(Token operator2) {
     this._operator = operator2;
   }
-  
+
   /**
    * Set the element associated with the operator based on the static type of the operand to the
    * given element.
@@ -9883,8 +9952,47 @@
   void visitChildren(ASTVisitor<Object> visitor) {
     safelyVisitChild(_operand, visitor);
   }
-}
 
+  /**
+   * If the AST structure has been resolved, and the function being invoked is known based on
+   * propagated type information, then return the parameter element representing the parameter to
+   * which the value of the operand will be bound. Otherwise, return {@code null}.
+   * <p>
+   * This method is only intended to be used by {@link Expression#getParameterElement()}.
+   * @return the parameter element representing the parameter to which the value of the right
+   * operand will be bound
+   */
+  ParameterElement get propagatedParameterElementForOperand {
+    if (_propagatedElement == null) {
+      return null;
+    }
+    List<ParameterElement> parameters2 = _propagatedElement.parameters;
+    if (parameters2.length < 1) {
+      return null;
+    }
+    return parameters2[0];
+  }
+
+  /**
+   * If the AST structure has been resolved, and the function being invoked is known based on static
+   * type information, then return the parameter element representing the parameter to which the
+   * value of the operand will be bound. Otherwise, return {@code null}.
+   * <p>
+   * This method is only intended to be used by {@link Expression#getStaticParameterElement()}.
+   * @return the parameter element representing the parameter to which the value of the right
+   * operand will be bound
+   */
+  ParameterElement get staticParameterElementForOperand {
+    if (_staticElement == null) {
+      return null;
+    }
+    List<ParameterElement> parameters2 = _staticElement.parameters;
+    if (parameters2.length < 1) {
+      return null;
+    }
+    return parameters2[0];
+  }
+}
 /**
  * Instances of the class {@code PrefixedIdentifier} represent either an identifier that is prefixed
  * or an access to an object property where the target of the property access is a simple
@@ -9894,22 +10002,22 @@
  * @coverage dart.engine.ast
  */
 class PrefixedIdentifier extends Identifier {
-  
+
   /**
    * The prefix associated with the library in which the identifier is defined.
    */
   SimpleIdentifier _prefix;
-  
+
   /**
    * The period used to separate the prefix from the identifier.
    */
   Token _period;
-  
+
   /**
    * The identifier being prefixed.
    */
   SimpleIdentifier _identifier;
-  
+
   /**
    * Initialize a newly created prefixed identifier.
    * @param prefix the identifier being prefixed
@@ -9921,7 +10029,7 @@
     this._period = period;
     this._identifier = becomeParentOf(identifier);
   }
-  
+
   /**
    * Initialize a newly created prefixed identifier.
    * @param prefix the identifier being prefixed
@@ -9938,20 +10046,20 @@
     return _identifier.element;
   }
   Token get endToken => _identifier.endToken;
-  
+
   /**
    * Return the identifier being prefixed.
    * @return the identifier being prefixed
    */
   SimpleIdentifier get identifier => _identifier;
   String get name => "${_prefix.name}.${_identifier.name}";
-  
+
   /**
    * Return the period used to separate the prefix from the identifier.
    * @return the period used to separate the prefix from the identifier
    */
   Token get period => _period;
-  
+
   /**
    * Return the prefix associated with the library in which the identifier is defined.
    * @return the prefix associated with the library in which the identifier is defined
@@ -9963,7 +10071,7 @@
     }
     return _identifier.staticElement;
   }
-  
+
   /**
    * Set the identifier being prefixed to the given identifier.
    * @param identifier the identifier being prefixed
@@ -9971,7 +10079,7 @@
   void set identifier(SimpleIdentifier identifier2) {
     this._identifier = becomeParentOf(identifier2);
   }
-  
+
   /**
    * Set the period used to separate the prefix from the identifier to the given token.
    * @param period the period used to separate the prefix from the identifier
@@ -9979,7 +10087,7 @@
   void set period(Token period2) {
     this._period = period2;
   }
-  
+
   /**
    * Set the prefix associated with the library in which the identifier is defined to the given
    * identifier.
@@ -9993,7 +10101,6 @@
     safelyVisitChild(_identifier, visitor);
   }
 }
-
 /**
  * Instances of the class {@code PropertyAccess} represent the access of a property of an object.
  * <p>
@@ -10004,22 +10111,22 @@
  * @coverage dart.engine.ast
  */
 class PropertyAccess extends Expression {
-  
+
   /**
    * The expression computing the object defining the property being accessed.
    */
   Expression _target;
-  
+
   /**
    * The property access operator.
    */
   Token _operator;
-  
+
   /**
    * The name of the property being accessed.
    */
   SimpleIdentifier _propertyName;
-  
+
   /**
    * Initialize a newly created property access expression.
    * @param target the expression computing the object defining the property being accessed
@@ -10031,7 +10138,7 @@
     this._operator = operator;
     this._propertyName = becomeParentOf(propertyName);
   }
-  
+
   /**
    * Initialize a newly created property access expression.
    * @param target the expression computing the object defining the property being accessed
@@ -10047,19 +10154,19 @@
     return _operator;
   }
   Token get endToken => _propertyName.endToken;
-  
+
   /**
    * Return the property access operator.
    * @return the property access operator
    */
   Token get operator => _operator;
-  
+
   /**
    * Return the name of the property being accessed.
    * @return the name of the property being accessed
    */
   SimpleIdentifier get propertyName => _propertyName;
-  
+
   /**
    * Return the expression used to compute the receiver of the invocation. If this invocation is not
    * part of a cascade expression, then this is the same as {@link #getTarget()}. If this invocation
@@ -10081,7 +10188,7 @@
     }
     return _target;
   }
-  
+
   /**
    * Return the expression computing the object defining the property being accessed, or{@code null} if this property access is part of a cascade expression.
    * @return the expression computing the object defining the property being accessed
@@ -10089,14 +10196,14 @@
    */
   Expression get target => _target;
   bool isAssignable() => true;
-  
+
   /**
    * Return {@code true} if this expression is cascaded. If it is, then the target of this
    * expression is not stored locally but is stored in the nearest ancestor that is a{@link CascadeExpression}.
    * @return {@code true} if this expression is cascaded
    */
   bool isCascaded() => _operator != null && identical(_operator.type, TokenType.PERIOD_PERIOD);
-  
+
   /**
    * Set the property access operator to the given token.
    * @param operator the property access operator
@@ -10104,7 +10211,7 @@
   void set operator(Token operator2) {
     this._operator = operator2;
   }
-  
+
   /**
    * Set the name of the property being accessed to the given identifier.
    * @param identifier the name of the property being accessed
@@ -10112,7 +10219,7 @@
   void set propertyName(SimpleIdentifier identifier) {
     _propertyName = becomeParentOf(identifier);
   }
-  
+
   /**
    * Set the expression computing the object defining the property being accessed to the given
    * expression.
@@ -10126,7 +10233,6 @@
     safelyVisitChild(_propertyName, visitor);
   }
 }
-
 /**
  * Instances of the class {@code RedirectingConstructorInvocation} represent the invocation of a
  * another constructor in the same class from within a constructor's initialization list.
@@ -10137,39 +10243,39 @@
  * @coverage dart.engine.ast
  */
 class RedirectingConstructorInvocation extends ConstructorInitializer {
-  
+
   /**
    * The token for the 'this' keyword.
    */
   Token _keyword;
-  
+
   /**
    * The token for the period before the name of the constructor that is being invoked, or{@code null} if the unnamed constructor is being invoked.
    */
   Token _period;
-  
+
   /**
    * The name of the constructor that is being invoked, or {@code null} if the unnamed constructor
    * is being invoked.
    */
   SimpleIdentifier _constructorName;
-  
+
   /**
    * The list of arguments to the constructor.
    */
   ArgumentList _argumentList;
-  
+
   /**
    * The element associated with the constructor based on static type information, or {@code null}if the AST structure has not been resolved or if the constructor could not be resolved.
    */
   ConstructorElement _staticElement;
-  
+
   /**
    * The element associated with the constructor based on propagated type information, or{@code null} if the AST structure has not been resolved or if the constructor could not be
    * resolved.
    */
   ConstructorElement _propagatedElement;
-  
+
   /**
    * Initialize a newly created redirecting invocation to invoke the constructor with the given name
    * with the given arguments.
@@ -10184,7 +10290,7 @@
     this._constructorName = becomeParentOf(constructorName);
     this._argumentList = becomeParentOf(argumentList);
   }
-  
+
   /**
    * Initialize a newly created redirecting invocation to invoke the constructor with the given name
    * with the given arguments.
@@ -10195,21 +10301,21 @@
    */
   RedirectingConstructorInvocation({Token keyword, Token period, SimpleIdentifier constructorName, ArgumentList argumentList}) : this.full(keyword, period, constructorName, argumentList);
   accept(ASTVisitor visitor) => visitor.visitRedirectingConstructorInvocation(this);
-  
+
   /**
    * Return the list of arguments to the constructor.
    * @return the list of arguments to the constructor
    */
   ArgumentList get argumentList => _argumentList;
   Token get beginToken => _keyword;
-  
+
   /**
    * Return the name of the constructor that is being invoked, or {@code null} if the unnamed
    * constructor is being invoked.
    * @return the name of the constructor that is being invoked
    */
   SimpleIdentifier get constructorName => _constructorName;
-  
+
   /**
    * Return the element associated with the constructor based on propagated type information, or{@code null} if the AST structure has not been resolved or if the constructor could not be
    * resolved.
@@ -10217,26 +10323,26 @@
    */
   ConstructorElement get element => _propagatedElement;
   Token get endToken => _argumentList.endToken;
-  
+
   /**
    * Return the token for the 'this' keyword.
    * @return the token for the 'this' keyword
    */
   Token get keyword => _keyword;
-  
+
   /**
    * Return the token for the period before the name of the constructor that is being invoked, or{@code null} if the unnamed constructor is being invoked.
    * @return the token for the period before the name of the constructor that is being invoked
    */
   Token get period => _period;
-  
+
   /**
    * Return the element associated with the constructor based on static type information, or{@code null} if the AST structure has not been resolved or if the constructor could not be
    * resolved.
    * @return the element associated with the constructor
    */
   ConstructorElement get staticElement => _staticElement;
-  
+
   /**
    * Set the list of arguments to the constructor to the given list.
    * @param argumentList the list of arguments to the constructor
@@ -10244,7 +10350,7 @@
   void set argumentList(ArgumentList argumentList2) {
     this._argumentList = becomeParentOf(argumentList2);
   }
-  
+
   /**
    * Set the name of the constructor that is being invoked to the given identifier.
    * @param identifier the name of the constructor that is being invoked
@@ -10252,7 +10358,7 @@
   void set constructorName(SimpleIdentifier identifier) {
     _constructorName = becomeParentOf(identifier);
   }
-  
+
   /**
    * Set the element associated with the constructor based on propagated type information to the
    * given element.
@@ -10261,7 +10367,7 @@
   void set element(ConstructorElement element2) {
     _propagatedElement = element2;
   }
-  
+
   /**
    * Set the token for the 'this' keyword to the given token.
    * @param keyword the token for the 'this' keyword
@@ -10269,7 +10375,7 @@
   void set keyword(Token keyword2) {
     this._keyword = keyword2;
   }
-  
+
   /**
    * Set the token for the period before the name of the constructor that is being invoked to the
    * given token.
@@ -10278,7 +10384,7 @@
   void set period(Token period2) {
     this._period = period2;
   }
-  
+
   /**
    * Set the element associated with the constructor based on static type information to the given
    * element.
@@ -10292,7 +10398,6 @@
     safelyVisitChild(_argumentList, visitor);
   }
 }
-
 /**
  * Instances of the class {@code RethrowExpression} represent a rethrow expression.
  * <pre>
@@ -10302,12 +10407,12 @@
  * @coverage dart.engine.ast
  */
 class RethrowExpression extends Expression {
-  
+
   /**
    * The token representing the 'rethrow' keyword.
    */
   Token _keyword;
-  
+
   /**
    * Initialize a newly created rethrow expression.
    * @param keyword the token representing the 'rethrow' keyword
@@ -10315,7 +10420,7 @@
   RethrowExpression.full(Token keyword) {
     this._keyword = keyword;
   }
-  
+
   /**
    * Initialize a newly created rethrow expression.
    * @param keyword the token representing the 'rethrow' keyword
@@ -10324,13 +10429,13 @@
   accept(ASTVisitor visitor) => visitor.visitRethrowExpression(this);
   Token get beginToken => _keyword;
   Token get endToken => _keyword;
-  
+
   /**
    * Return the token representing the 'rethrow' keyword.
    * @return the token representing the 'rethrow' keyword
    */
   Token get keyword => _keyword;
-  
+
   /**
    * Set the token representing the 'rethrow' keyword to the given token.
    * @param keyword the token representing the 'rethrow' keyword
@@ -10341,7 +10446,6 @@
   void visitChildren(ASTVisitor<Object> visitor) {
   }
 }
-
 /**
  * Instances of the class {@code ReturnStatement} represent a return statement.
  * <pre>
@@ -10351,23 +10455,23 @@
  * @coverage dart.engine.ast
  */
 class ReturnStatement extends Statement {
-  
+
   /**
    * The token representing the 'return' keyword.
    */
   Token _keyword;
-  
+
   /**
    * The expression computing the value to be returned, or {@code null} if no explicit value was
    * provided.
    */
   Expression _expression;
-  
+
   /**
    * The semicolon terminating the statement.
    */
   Token _semicolon;
-  
+
   /**
    * Initialize a newly created return statement.
    * @param keyword the token representing the 'return' keyword
@@ -10379,7 +10483,7 @@
     this._expression = becomeParentOf(expression);
     this._semicolon = semicolon;
   }
-  
+
   /**
    * Initialize a newly created return statement.
    * @param keyword the token representing the 'return' keyword
@@ -10390,26 +10494,26 @@
   accept(ASTVisitor visitor) => visitor.visitReturnStatement(this);
   Token get beginToken => _keyword;
   Token get endToken => _semicolon;
-  
+
   /**
    * Return the expression computing the value to be returned, or {@code null} if no explicit value
    * was provided.
    * @return the expression computing the value to be returned
    */
   Expression get expression => _expression;
-  
+
   /**
    * Return the token representing the 'return' keyword.
    * @return the token representing the 'return' keyword
    */
   Token get keyword => _keyword;
-  
+
   /**
    * Return the semicolon terminating the statement.
    * @return the semicolon terminating the statement
    */
   Token get semicolon => _semicolon;
-  
+
   /**
    * Set the expression computing the value to be returned to the given expression.
    * @param expression the expression computing the value to be returned
@@ -10417,7 +10521,7 @@
   void set expression(Expression expression2) {
     this._expression = becomeParentOf(expression2);
   }
-  
+
   /**
    * Set the token representing the 'return' keyword to the given token.
    * @param keyword the token representing the 'return' keyword
@@ -10425,7 +10529,7 @@
   void set keyword(Token keyword2) {
     this._keyword = keyword2;
   }
-  
+
   /**
    * Set the semicolon terminating the statement to the given token.
    * @param semicolon the semicolon terminating the statement
@@ -10437,7 +10541,6 @@
     safelyVisitChild(_expression, visitor);
   }
 }
-
 /**
  * Instances of the class {@code ScriptTag} represent the script tag that can optionally occur at
  * the beginning of a compilation unit.
@@ -10448,12 +10551,12 @@
  * @coverage dart.engine.ast
  */
 class ScriptTag extends ASTNode {
-  
+
   /**
    * The token representing this script tag.
    */
   Token _scriptTag;
-  
+
   /**
    * Initialize a newly created script tag.
    * @param scriptTag the token representing this script tag
@@ -10461,7 +10564,7 @@
   ScriptTag.full(Token scriptTag) {
     this._scriptTag = scriptTag;
   }
-  
+
   /**
    * Initialize a newly created script tag.
    * @param scriptTag the token representing this script tag
@@ -10470,13 +10573,13 @@
   accept(ASTVisitor visitor) => visitor.visitScriptTag(this);
   Token get beginToken => _scriptTag;
   Token get endToken => _scriptTag;
-  
+
   /**
    * Return the token representing this script tag.
    * @return the token representing this script tag
    */
   Token get scriptTag => _scriptTag;
-  
+
   /**
    * Set the token representing this script tag to the given script tag.
    * @param scriptTag the token representing this script tag
@@ -10487,7 +10590,6 @@
   void visitChildren(ASTVisitor<Object> visitor) {
   }
 }
-
 /**
  * Instances of the class {@code ShowCombinator} represent a combinator that restricts the names
  * being imported to those in a given list.
@@ -10498,12 +10600,12 @@
  * @coverage dart.engine.ast
  */
 class ShowCombinator extends Combinator {
-  
+
   /**
    * The list of names from the library that are made visible by this combinator.
    */
   NodeList<SimpleIdentifier> _shownNames;
-  
+
   /**
    * Initialize a newly created import show combinator.
    * @param keyword the comma introducing the combinator
@@ -10513,7 +10615,7 @@
     this._shownNames = new NodeList<SimpleIdentifier>(this);
     this._shownNames.addAll(shownNames);
   }
-  
+
   /**
    * Initialize a newly created import show combinator.
    * @param keyword the comma introducing the combinator
@@ -10522,7 +10624,7 @@
   ShowCombinator({Token keyword, List<SimpleIdentifier> shownNames}) : this.full(keyword, shownNames);
   accept(ASTVisitor visitor) => visitor.visitShowCombinator(this);
   Token get endToken => _shownNames.endToken;
-  
+
   /**
    * Return the list of names from the library that are made visible by this combinator.
    * @return the list of names from the library that are made visible by this combinator
@@ -10532,7 +10634,6 @@
     _shownNames.accept(visitor);
   }
 }
-
 /**
  * Instances of the class {@code SimpleFormalParameter} represent a simple formal parameter.
  * <pre>
@@ -10541,19 +10642,19 @@
  * @coverage dart.engine.ast
  */
 class SimpleFormalParameter extends NormalFormalParameter {
-  
+
   /**
    * The token representing either the 'final', 'const' or 'var' keyword, or {@code null} if no
    * keyword was used.
    */
   Token _keyword;
-  
+
   /**
    * The name of the declared type of the parameter, or {@code null} if the parameter does not have
    * a declared type.
    */
   TypeName _type;
-  
+
   /**
    * Initialize a newly created formal parameter.
    * @param comment the documentation comment associated with this parameter
@@ -10566,7 +10667,7 @@
     this._keyword = keyword;
     this._type = becomeParentOf(type);
   }
-  
+
   /**
    * Initialize a newly created formal parameter.
    * @param comment the documentation comment associated with this parameter
@@ -10586,13 +10687,13 @@
     return identifier.beginToken;
   }
   Token get endToken => identifier.endToken;
-  
+
   /**
    * Return the token representing either the 'final', 'const' or 'var' keyword.
    * @return the token representing either the 'final', 'const' or 'var' keyword
    */
   Token get keyword => _keyword;
-  
+
   /**
    * Return the name of the declared type of the parameter, or {@code null} if the parameter does
    * not have a declared type.
@@ -10601,7 +10702,7 @@
   TypeName get type => _type;
   bool isConst() => (_keyword is KeywordToken) && identical(((_keyword as KeywordToken)).keyword, Keyword.CONST);
   bool isFinal() => (_keyword is KeywordToken) && identical(((_keyword as KeywordToken)).keyword, Keyword.FINAL);
-  
+
   /**
    * Set the token representing either the 'final', 'const' or 'var' keyword to the given token.
    * @param keyword the token representing either the 'final', 'const' or 'var' keyword
@@ -10609,7 +10710,7 @@
   void set keyword(Token keyword2) {
     this._keyword = keyword2;
   }
-  
+
   /**
    * Set the name of the declared type of the parameter to the given type name.
    * @param typeName the name of the declared type of the parameter
@@ -10623,7 +10724,6 @@
     safelyVisitChild(identifier, visitor);
   }
 }
-
 /**
  * Instances of the class {@code SimpleIdentifier} represent a simple identifier.
  * <pre>
@@ -10635,23 +10735,23 @@
  * @coverage dart.engine.ast
  */
 class SimpleIdentifier extends Identifier {
-  
+
   /**
    * The token representing the identifier.
    */
   Token _token;
-  
+
   /**
    * The element associated with this identifier based on static type information, or {@code null}if the AST structure has not been resolved or if this identifier could not be resolved.
    */
   Element _staticElement;
-  
+
   /**
    * The element associated with this identifier based on propagated type information, or{@code null} if the AST structure has not been resolved or if this identifier could not be
    * resolved.
    */
   Element _propagatedElement;
-  
+
   /**
    * Initialize a newly created identifier.
    * @param token the token representing the identifier
@@ -10659,7 +10759,7 @@
   SimpleIdentifier.full(Token token) {
     this._token = token;
   }
-  
+
   /**
    * Initialize a newly created identifier.
    * @param token the token representing the identifier
@@ -10671,13 +10771,13 @@
   Token get endToken => _token;
   String get name => _token.lexeme;
   Element get staticElement => _staticElement;
-  
+
   /**
    * Return the token representing the identifier.
    * @return the token representing the identifier
    */
   Token get token => _token;
-  
+
   /**
    * Return {@code true} if this identifier is the name being declared in a declaration.
    * @return {@code true} if this identifier is the name being declared in a declaration
@@ -10710,7 +10810,7 @@
     }
     return false;
   }
-  
+
   /**
    * Return {@code true} if this expression is computing a right-hand value.
    * <p>
@@ -10747,7 +10847,7 @@
     }
     return true;
   }
-  
+
   /**
    * Return {@code true} if this expression is computing a left-hand value.
    * <p>
@@ -10783,7 +10883,7 @@
     return false;
   }
   bool isSynthetic() => _token.isSynthetic();
-  
+
   /**
    * Set the element associated with this identifier based on propagated type information to the
    * given element.
@@ -10792,7 +10892,7 @@
   void set element(Element element2) {
     _propagatedElement = element2;
   }
-  
+
   /**
    * Set the element associated with this identifier based on static type information to the given
    * element.
@@ -10801,7 +10901,7 @@
   void set staticElement(Element element) {
     _staticElement = element;
   }
-  
+
   /**
    * Set the token representing the identifier to the given token.
    * @param token the token representing the literal
@@ -10812,7 +10912,6 @@
   void visitChildren(ASTVisitor<Object> visitor) {
   }
 }
-
 /**
  * Instances of the class {@code SimpleStringLiteral} represent a string literal expression that
  * does not contain any interpolations.
@@ -10835,17 +10934,17 @@
  * @coverage dart.engine.ast
  */
 class SimpleStringLiteral extends StringLiteral {
-  
+
   /**
    * The token representing the literal.
    */
   Token _literal;
-  
+
   /**
    * The value of the literal.
    */
   String _value;
-  
+
   /**
    * Initialize a newly created simple string literal.
    * @param literal the token representing the literal
@@ -10855,7 +10954,7 @@
     this._literal = literal;
     this._value = StringUtilities.intern(value);
   }
-  
+
   /**
    * Initialize a newly created simple string literal.
    * @param literal the token representing the literal
@@ -10865,19 +10964,19 @@
   accept(ASTVisitor visitor) => visitor.visitSimpleStringLiteral(this);
   Token get beginToken => _literal;
   Token get endToken => _literal;
-  
+
   /**
    * Return the token representing the literal.
    * @return the token representing the literal
    */
   Token get literal => _literal;
-  
+
   /**
    * Return the value of the literal.
    * @return the value of the literal
    */
   String get value => _value;
-  
+
   /**
    * Return {@code true} if this string literal is a multi-line string.
    * @return {@code true} if this string literal is a multi-line string
@@ -10888,14 +10987,14 @@
     }
     return _value.endsWith("\"\"\"") || _value.endsWith("'''");
   }
-  
+
   /**
    * Return {@code true} if this string literal is a raw string.
    * @return {@code true} if this string literal is a raw string
    */
   bool isRaw() => _value.codeUnitAt(0) == 0x40;
   bool isSynthetic() => _literal.isSynthetic();
-  
+
   /**
    * Set the token representing the literal to the given token.
    * @param literal the token representing the literal
@@ -10903,7 +11002,7 @@
   void set literal(Token literal2) {
     this._literal = literal2;
   }
-  
+
   /**
    * Set the value of the literal to the given string.
    * @param string the value of the literal
@@ -10917,7 +11016,6 @@
     builder.append(value);
   }
 }
-
 /**
  * Instances of the class {@code Statement} defines the behavior common to nodes that represent a
  * statement.
@@ -10927,7 +11025,6 @@
  */
 abstract class Statement extends ASTNode {
 }
-
 /**
  * Instances of the class {@code StringInterpolation} represent a string interpolation literal.
  * <pre>
@@ -10938,12 +11035,12 @@
  * @coverage dart.engine.ast
  */
 class StringInterpolation extends StringLiteral {
-  
+
   /**
    * The elements that will be composed to produce the resulting string.
    */
   NodeList<InterpolationElement> _elements;
-  
+
   /**
    * Initialize a newly created string interpolation expression.
    * @param elements the elements that will be composed to produce the resulting string
@@ -10952,7 +11049,7 @@
     this._elements = new NodeList<InterpolationElement>(this);
     this._elements.addAll(elements);
   }
-  
+
   /**
    * Initialize a newly created string interpolation expression.
    * @param elements the elements that will be composed to produce the resulting string
@@ -10960,7 +11057,7 @@
   StringInterpolation({List<InterpolationElement> elements}) : this.full(elements);
   accept(ASTVisitor visitor) => visitor.visitStringInterpolation(this);
   Token get beginToken => _elements.beginToken;
-  
+
   /**
    * Return the elements that will be composed to produce the resulting string.
    * @return the elements that will be composed to produce the resulting string
@@ -10974,7 +11071,6 @@
     throw new IllegalArgumentException();
   }
 }
-
 /**
  * Instances of the class {@code StringLiteral} represent a string literal expression.
  * <pre>
@@ -10982,7 +11078,7 @@
  * @coverage dart.engine.ast
  */
 abstract class StringLiteral extends Literal {
-  
+
   /**
    * Return the value of the string literal, or {@code null} if the string is not a constant string
    * without any string interpolation.
@@ -10997,7 +11093,7 @@
     }
     return builder.toString();
   }
-  
+
   /**
    * Append the value of the given string literal to the given string builder.
    * @param builder the builder to which the string's value is to be appended
@@ -11006,7 +11102,6 @@
    */
   void appendStringValue(JavaStringBuilder builder);
 }
-
 /**
  * Instances of the class {@code SuperConstructorInvocation} represent the invocation of a
  * superclass' constructor from within a constructor's initialization list.
@@ -11016,39 +11111,39 @@
  * @coverage dart.engine.ast
  */
 class SuperConstructorInvocation extends ConstructorInitializer {
-  
+
   /**
    * The token for the 'super' keyword.
    */
   Token _keyword;
-  
+
   /**
    * The token for the period before the name of the constructor that is being invoked, or{@code null} if the unnamed constructor is being invoked.
    */
   Token _period;
-  
+
   /**
    * The name of the constructor that is being invoked, or {@code null} if the unnamed constructor
    * is being invoked.
    */
   SimpleIdentifier _constructorName;
-  
+
   /**
    * The list of arguments to the constructor.
    */
   ArgumentList _argumentList;
-  
+
   /**
    * The element associated with the constructor based on static type information, or {@code null}if the AST structure has not been resolved or if the constructor could not be resolved.
    */
   ConstructorElement _staticElement;
-  
+
   /**
    * The element associated with the constructor based on propagated type information, or {@code null} if the AST structure has not been
    * resolved or if the constructor could not be resolved.
    */
   ConstructorElement _propagatedElement;
-  
+
   /**
    * Initialize a newly created super invocation to invoke the inherited constructor with the given
    * name with the given arguments.
@@ -11063,7 +11158,7 @@
     this._constructorName = becomeParentOf(constructorName);
     this._argumentList = becomeParentOf(argumentList);
   }
-  
+
   /**
    * Initialize a newly created super invocation to invoke the inherited constructor with the given
    * name with the given arguments.
@@ -11074,21 +11169,21 @@
    */
   SuperConstructorInvocation({Token keyword, Token period, SimpleIdentifier constructorName, ArgumentList argumentList}) : this.full(keyword, period, constructorName, argumentList);
   accept(ASTVisitor visitor) => visitor.visitSuperConstructorInvocation(this);
-  
+
   /**
    * Return the list of arguments to the constructor.
    * @return the list of arguments to the constructor
    */
   ArgumentList get argumentList => _argumentList;
   Token get beginToken => _keyword;
-  
+
   /**
    * Return the name of the constructor that is being invoked, or {@code null} if the unnamed
    * constructor is being invoked.
    * @return the name of the constructor that is being invoked
    */
   SimpleIdentifier get constructorName => _constructorName;
-  
+
   /**
    * Return the element associated with the constructor based on propagated type information, or{@code null} if the AST structure has not been resolved or if the constructor could not be
    * resolved.
@@ -11096,26 +11191,26 @@
    */
   ConstructorElement get element => _propagatedElement;
   Token get endToken => _argumentList.endToken;
-  
+
   /**
    * Return the token for the 'super' keyword.
    * @return the token for the 'super' keyword
    */
   Token get keyword => _keyword;
-  
+
   /**
    * Return the token for the period before the name of the constructor that is being invoked, or{@code null} if the unnamed constructor is being invoked.
    * @return the token for the period before the name of the constructor that is being invoked
    */
   Token get period => _period;
-  
+
   /**
    * Return the element associated with the constructor based on static type information, or{@code null} if the AST structure has not been resolved or if the constructor could not be
    * resolved.
    * @return the element associated with the constructor
    */
   ConstructorElement get staticElement => _staticElement;
-  
+
   /**
    * Set the list of arguments to the constructor to the given list.
    * @param argumentList the list of arguments to the constructor
@@ -11123,7 +11218,7 @@
   void set argumentList(ArgumentList argumentList2) {
     this._argumentList = becomeParentOf(argumentList2);
   }
-  
+
   /**
    * Set the name of the constructor that is being invoked to the given identifier.
    * @param identifier the name of the constructor that is being invoked
@@ -11131,7 +11226,7 @@
   void set constructorName(SimpleIdentifier identifier) {
     _constructorName = becomeParentOf(identifier);
   }
-  
+
   /**
    * Set the element associated with the constructor based on propagated type information to the
    * given element.
@@ -11140,7 +11235,7 @@
   void set element(ConstructorElement element2) {
     _propagatedElement = element2;
   }
-  
+
   /**
    * Set the token for the 'super' keyword to the given token.
    * @param keyword the token for the 'super' keyword
@@ -11148,7 +11243,7 @@
   void set keyword(Token keyword2) {
     this._keyword = keyword2;
   }
-  
+
   /**
    * Set the token for the period before the name of the constructor that is being invoked to the
    * given token.
@@ -11157,7 +11252,7 @@
   void set period(Token period2) {
     this._period = period2;
   }
-  
+
   /**
    * Set the element associated with the constructor based on static type information to the given
    * element.
@@ -11171,7 +11266,6 @@
     safelyVisitChild(_argumentList, visitor);
   }
 }
-
 /**
  * Instances of the class {@code SuperExpression} represent a super expression.
  * <pre>
@@ -11181,12 +11275,12 @@
  * @coverage dart.engine.ast
  */
 class SuperExpression extends Expression {
-  
+
   /**
    * The token representing the keyword.
    */
   Token _keyword;
-  
+
   /**
    * Initialize a newly created super expression.
    * @param keyword the token representing the keyword
@@ -11194,7 +11288,7 @@
   SuperExpression.full(Token keyword) {
     this._keyword = keyword;
   }
-  
+
   /**
    * Initialize a newly created super expression.
    * @param keyword the token representing the keyword
@@ -11203,13 +11297,13 @@
   accept(ASTVisitor visitor) => visitor.visitSuperExpression(this);
   Token get beginToken => _keyword;
   Token get endToken => _keyword;
-  
+
   /**
    * Return the token representing the keyword.
    * @return the token representing the keyword
    */
   Token get keyword => _keyword;
-  
+
   /**
    * Set the token representing the keyword to the given token.
    * @param keyword the token representing the keyword
@@ -11220,7 +11314,6 @@
   void visitChildren(ASTVisitor<Object> visitor) {
   }
 }
-
 /**
  * Instances of the class {@code SwitchCase} represent the case in a switch statement.
  * <pre>
@@ -11228,12 +11321,12 @@
  * @coverage dart.engine.ast
  */
 class SwitchCase extends SwitchMember {
-  
+
   /**
    * The expression controlling whether the statements will be executed.
    */
   Expression _expression;
-  
+
   /**
    * Initialize a newly created switch case.
    * @param labels the labels associated with the switch member
@@ -11245,7 +11338,7 @@
   SwitchCase.full(List<Label> labels, Token keyword, Expression expression, Token colon, List<Statement> statements) : super.full(labels, keyword, colon, statements) {
     this._expression = becomeParentOf(expression);
   }
-  
+
   /**
    * Initialize a newly created switch case.
    * @param labels the labels associated with the switch member
@@ -11256,13 +11349,13 @@
    */
   SwitchCase({List<Label> labels, Token keyword, Expression expression, Token colon, List<Statement> statements}) : this.full(labels, keyword, expression, colon, statements);
   accept(ASTVisitor visitor) => visitor.visitSwitchCase(this);
-  
+
   /**
    * Return the expression controlling whether the statements will be executed.
    * @return the expression controlling whether the statements will be executed
    */
   Expression get expression => _expression;
-  
+
   /**
    * Set the expression controlling whether the statements will be executed to the given expression.
    * @param expression the expression controlling whether the statements will be executed
@@ -11276,7 +11369,6 @@
     statements.accept(visitor);
   }
 }
-
 /**
  * Instances of the class {@code SwitchDefault} represent the default case in a switch statement.
  * <pre>
@@ -11284,7 +11376,7 @@
  * @coverage dart.engine.ast
  */
 class SwitchDefault extends SwitchMember {
-  
+
   /**
    * Initialize a newly created switch default.
    * @param labels the labels associated with the switch member
@@ -11294,7 +11386,7 @@
    */
   SwitchDefault.full(List<Label> labels, Token keyword, Token colon, List<Statement> statements) : super.full(labels, keyword, colon, statements) {
   }
-  
+
   /**
    * Initialize a newly created switch default.
    * @param labels the labels associated with the switch member
@@ -11309,7 +11401,6 @@
     statements.accept(visitor);
   }
 }
-
 /**
  * The abstract class {@code SwitchMember} defines the behavior common to objects representing
  * elements within a switch statement.
@@ -11321,27 +11412,27 @@
  * @coverage dart.engine.ast
  */
 abstract class SwitchMember extends ASTNode {
-  
+
   /**
    * The labels associated with the switch member.
    */
   NodeList<Label> _labels;
-  
+
   /**
    * The token representing the 'case' or 'default' keyword.
    */
   Token _keyword;
-  
+
   /**
    * The colon separating the keyword or the expression from the statements.
    */
   Token _colon;
-  
+
   /**
    * The statements that will be executed if this switch member is selected.
    */
   NodeList<Statement> _statements;
-  
+
   /**
    * Initialize a newly created switch member.
    * @param labels the labels associated with the switch member
@@ -11357,7 +11448,7 @@
     this._colon = colon;
     this._statements.addAll(statements);
   }
-  
+
   /**
    * Initialize a newly created switch member.
    * @param labels the labels associated with the switch member
@@ -11372,7 +11463,7 @@
     }
     return _keyword;
   }
-  
+
   /**
    * Return the colon separating the keyword or the expression from the statements.
    * @return the colon separating the keyword or the expression from the statements
@@ -11384,25 +11475,25 @@
     }
     return _colon;
   }
-  
+
   /**
    * Return the token representing the 'case' or 'default' keyword.
    * @return the token representing the 'case' or 'default' keyword
    */
   Token get keyword => _keyword;
-  
+
   /**
    * Return the labels associated with the switch member.
    * @return the labels associated with the switch member
    */
   NodeList<Label> get labels => _labels;
-  
+
   /**
    * Return the statements that will be executed if this switch member is selected.
    * @return the statements that will be executed if this switch member is selected
    */
   NodeList<Statement> get statements => _statements;
-  
+
   /**
    * Set the colon separating the keyword or the expression from the statements to the given token.
    * @param colon the colon separating the keyword or the expression from the statements
@@ -11410,7 +11501,7 @@
   void set colon(Token colon2) {
     this._colon = colon2;
   }
-  
+
   /**
    * Set the token representing the 'case' or 'default' keyword to the given token.
    * @param keyword the token representing the 'case' or 'default' keyword
@@ -11419,7 +11510,6 @@
     this._keyword = keyword2;
   }
 }
-
 /**
  * Instances of the class {@code SwitchStatement} represent a switch statement.
  * <pre>
@@ -11429,42 +11519,42 @@
  * @coverage dart.engine.ast
  */
 class SwitchStatement extends Statement {
-  
+
   /**
    * The token representing the 'switch' keyword.
    */
   Token _keyword;
-  
+
   /**
    * The left parenthesis.
    */
   Token _leftParenthesis;
-  
+
   /**
    * The expression used to determine which of the switch members will be selected.
    */
   Expression _expression;
-  
+
   /**
    * The right parenthesis.
    */
   Token _rightParenthesis;
-  
+
   /**
    * The left curly bracket.
    */
   Token _leftBracket;
-  
+
   /**
    * The switch members that can be selected by the expression.
    */
   NodeList<SwitchMember> _members;
-  
+
   /**
    * The right curly bracket.
    */
   Token _rightBracket;
-  
+
   /**
    * Initialize a newly created switch statement.
    * @param keyword the token representing the 'switch' keyword
@@ -11485,7 +11575,7 @@
     this._members.addAll(members);
     this._rightBracket = rightBracket;
   }
-  
+
   /**
    * Initialize a newly created switch statement.
    * @param keyword the token representing the 'switch' keyword
@@ -11500,49 +11590,49 @@
   accept(ASTVisitor visitor) => visitor.visitSwitchStatement(this);
   Token get beginToken => _keyword;
   Token get endToken => _rightBracket;
-  
+
   /**
    * Return the expression used to determine which of the switch members will be selected.
    * @return the expression used to determine which of the switch members will be selected
    */
   Expression get expression => _expression;
-  
+
   /**
    * Return the token representing the 'switch' keyword.
    * @return the token representing the 'switch' keyword
    */
   Token get keyword => _keyword;
-  
+
   /**
    * Return the left curly bracket.
    * @return the left curly bracket
    */
   Token get leftBracket => _leftBracket;
-  
+
   /**
    * Return the left parenthesis.
    * @return the left parenthesis
    */
   Token get leftParenthesis => _leftParenthesis;
-  
+
   /**
    * Return the switch members that can be selected by the expression.
    * @return the switch members that can be selected by the expression
    */
   NodeList<SwitchMember> get members => _members;
-  
+
   /**
    * Return the right curly bracket.
    * @return the right curly bracket
    */
   Token get rightBracket => _rightBracket;
-  
+
   /**
    * Return the right parenthesis.
    * @return the right parenthesis
    */
   Token get rightParenthesis => _rightParenthesis;
-  
+
   /**
    * Set the expression used to determine which of the switch members will be selected to the given
    * expression.
@@ -11551,7 +11641,7 @@
   void set expression(Expression expression2) {
     this._expression = becomeParentOf(expression2);
   }
-  
+
   /**
    * Set the token representing the 'switch' keyword to the given token.
    * @param keyword the token representing the 'switch' keyword
@@ -11559,7 +11649,7 @@
   void set keyword(Token keyword2) {
     this._keyword = keyword2;
   }
-  
+
   /**
    * Set the left curly bracket to the given token.
    * @param leftBracket the left curly bracket
@@ -11567,7 +11657,7 @@
   void set leftBracket(Token leftBracket2) {
     this._leftBracket = leftBracket2;
   }
-  
+
   /**
    * Set the left parenthesis to the given token.
    * @param leftParenthesis the left parenthesis
@@ -11575,7 +11665,7 @@
   void set leftParenthesis(Token leftParenthesis2) {
     this._leftParenthesis = leftParenthesis2;
   }
-  
+
   /**
    * Set the right curly bracket to the given token.
    * @param rightBracket the right curly bracket
@@ -11583,7 +11673,7 @@
   void set rightBracket(Token rightBracket2) {
     this._rightBracket = rightBracket2;
   }
-  
+
   /**
    * Set the right parenthesis to the given token.
    * @param rightParenthesis the right parenthesis
@@ -11596,7 +11686,6 @@
     _members.accept(visitor);
   }
 }
-
 /**
  * Instances of the class {@code ThisExpression} represent a this expression.
  * <pre>
@@ -11606,12 +11695,12 @@
  * @coverage dart.engine.ast
  */
 class ThisExpression extends Expression {
-  
+
   /**
    * The token representing the keyword.
    */
   Token _keyword;
-  
+
   /**
    * Initialize a newly created this expression.
    * @param keyword the token representing the keyword
@@ -11619,7 +11708,7 @@
   ThisExpression.full(Token keyword) {
     this._keyword = keyword;
   }
-  
+
   /**
    * Initialize a newly created this expression.
    * @param keyword the token representing the keyword
@@ -11628,13 +11717,13 @@
   accept(ASTVisitor visitor) => visitor.visitThisExpression(this);
   Token get beginToken => _keyword;
   Token get endToken => _keyword;
-  
+
   /**
    * Return the token representing the keyword.
    * @return the token representing the keyword
    */
   Token get keyword => _keyword;
-  
+
   /**
    * Set the token representing the keyword to the given token.
    * @param keyword the token representing the keyword
@@ -11645,7 +11734,6 @@
   void visitChildren(ASTVisitor<Object> visitor) {
   }
 }
-
 /**
  * Instances of the class {@code ThrowExpression} represent a throw expression.
  * <pre>
@@ -11654,17 +11742,17 @@
  * @coverage dart.engine.ast
  */
 class ThrowExpression extends Expression {
-  
+
   /**
    * The token representing the 'throw' keyword.
    */
   Token _keyword;
-  
+
   /**
    * The expression computing the exception to be thrown.
    */
   Expression _expression;
-  
+
   /**
    * Initialize a newly created throw expression.
    * @param keyword the token representing the 'throw' keyword
@@ -11674,7 +11762,7 @@
     this._keyword = keyword;
     this._expression = becomeParentOf(expression);
   }
-  
+
   /**
    * Initialize a newly created throw expression.
    * @param keyword the token representing the 'throw' keyword
@@ -11689,19 +11777,19 @@
     }
     return _keyword;
   }
-  
+
   /**
    * Return the expression computing the exception to be thrown.
    * @return the expression computing the exception to be thrown
    */
   Expression get expression => _expression;
-  
+
   /**
    * Return the token representing the 'throw' keyword.
    * @return the token representing the 'throw' keyword
    */
   Token get keyword => _keyword;
-  
+
   /**
    * Set the expression computing the exception to be thrown to the given expression.
    * @param expression the expression computing the exception to be thrown
@@ -11709,7 +11797,7 @@
   void set expression(Expression expression2) {
     this._expression = becomeParentOf(expression2);
   }
-  
+
   /**
    * Set the token representing the 'throw' keyword to the given token.
    * @param keyword the token representing the 'throw' keyword
@@ -11721,7 +11809,6 @@
     safelyVisitChild(_expression, visitor);
   }
 }
-
 /**
  * Instances of the class {@code TopLevelVariableDeclaration} represent the declaration of one or
  * more top-level variables of the same type.
@@ -11733,17 +11820,17 @@
  * @coverage dart.engine.ast
  */
 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
@@ -11755,7 +11842,7 @@
     this._variableList = becomeParentOf(variableList);
     this._semicolon = semicolon;
   }
-  
+
   /**
    * Initialize a newly created top-level variable declaration.
    * @param comment the documentation comment associated with this variable
@@ -11767,19 +11854,19 @@
   accept(ASTVisitor visitor) => visitor.visitTopLevelVariableDeclaration(this);
   Element get element => null;
   Token get endToken => _semicolon;
-  
+
   /**
    * Return the semicolon terminating the declaration.
    * @return the semicolon terminating the declaration
    */
   Token get semicolon => _semicolon;
-  
+
   /**
    * Return the top-level variables being declared.
    * @return the top-level variables being declared
    */
   VariableDeclarationList get variables => _variableList;
-  
+
   /**
    * Set the semicolon terminating the declaration to the given token.
    * @param semicolon the semicolon terminating the declaration
@@ -11787,7 +11874,7 @@
   void set semicolon(Token semicolon2) {
     this._semicolon = semicolon2;
   }
-  
+
   /**
    * Set the top-level variables being declared to the given list of variables.
    * @param variableList the top-level variables being declared
@@ -11801,7 +11888,6 @@
   }
   Token get firstTokenAfterCommentAndMetadata => _variableList.beginToken;
 }
-
 /**
  * Instances of the class {@code TryStatement} represent a try statement.
  * <pre>
@@ -11812,34 +11898,34 @@
  * @coverage dart.engine.ast
  */
 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 {@code null} if the statement does not contain
    * a finally clause.
    */
   Token _finallyKeyword;
-  
+
   /**
    * The finally clause contained in the try statement, or {@code null} if the statement does not
    * contain a finally clause.
    */
   Block _finallyClause;
-  
+
   /**
    * Initialize a newly created try statement.
    * @param tryKeyword the token representing the 'try' keyword
@@ -11856,7 +11942,7 @@
     this._finallyKeyword = finallyKeyword;
     this._finallyClause = becomeParentOf(finallyClause);
   }
-  
+
   /**
    * Initialize a newly created try statement.
    * @param tryKeyword the token representing the 'try' keyword
@@ -11868,13 +11954,13 @@
   TryStatement({Token tryKeyword, Block body, List<CatchClause> catchClauses, Token finallyKeyword, Block finallyClause}) : this.full(tryKeyword, body, catchClauses, finallyKeyword, finallyClause);
   accept(ASTVisitor visitor) => visitor.visitTryStatement(this);
   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
@@ -11890,27 +11976,27 @@
     }
     return _body.endToken;
   }
-  
+
   /**
    * Return the finally clause contained in the try statement, or {@code null} if the statement does
    * not contain a finally clause.
    * @return the finally clause contained in the try statement
    */
   Block get finallyClause => _finallyClause;
-  
+
   /**
    * Return the token representing the 'finally' keyword, or {@code null} if the statement does not
    * contain a finally clause.
    * @return the token representing the 'finally' keyword
    */
   Token get finallyKeyword => _finallyKeyword;
-  
+
   /**
    * Return the token representing the 'try' keyword.
    * @return the token representing the 'try' keyword
    */
   Token get tryKeyword => _tryKeyword;
-  
+
   /**
    * Set the body of the statement to the given block.
    * @param block the body of the statement
@@ -11918,7 +12004,7 @@
   void set body(Block block) {
     _body = becomeParentOf(block);
   }
-  
+
   /**
    * Set the finally clause contained in the try statement to the given block.
    * @param block the finally clause contained in the try statement
@@ -11926,7 +12012,7 @@
   void set finallyClause(Block block) {
     _finallyClause = becomeParentOf(block);
   }
-  
+
   /**
    * Set the token representing the 'finally' keyword to the given token.
    * @param finallyKeyword the token representing the 'finally' keyword
@@ -11934,7 +12020,7 @@
   void set finallyKeyword(Token finallyKeyword2) {
     this._finallyKeyword = finallyKeyword2;
   }
-  
+
   /**
    * Set the token representing the 'try' keyword to the given token.
    * @param tryKeyword the token representing the 'try' keyword
@@ -11948,7 +12034,6 @@
     safelyVisitChild(_finallyClause, visitor);
   }
 }
-
 /**
  * The abstract class {@code TypeAlias} defines the behavior common to declarations of type aliases.
  * <pre>
@@ -11961,17 +12046,17 @@
  * @coverage dart.engine.ast
  */
 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
@@ -11983,7 +12068,7 @@
     this._keyword = keyword;
     this._semicolon = semicolon;
   }
-  
+
   /**
    * Initialize a newly created type alias.
    * @param comment the documentation comment associated with this type alias
@@ -11993,19 +12078,19 @@
    */
   TypeAlias({Comment comment, List<Annotation> metadata, Token keyword, Token semicolon}) : this.full(comment, metadata, keyword, semicolon);
   Token get endToken => _semicolon;
-  
+
   /**
    * Return the token representing the 'typedef' keyword.
    * @return the token representing the 'typedef' keyword
    */
   Token get keyword => _keyword;
-  
+
   /**
    * Return the semicolon terminating the declaration.
    * @return the semicolon terminating the declaration
    */
   Token get semicolon => _semicolon;
-  
+
   /**
    * Set the token representing the 'typedef' keyword to the given token.
    * @param keyword the token representing the 'typedef' keyword
@@ -12013,7 +12098,7 @@
   void set keyword(Token keyword2) {
     this._keyword = keyword2;
   }
-  
+
   /**
    * Set the semicolon terminating the declaration to the given token.
    * @param semicolon the semicolon terminating the declaration
@@ -12023,7 +12108,6 @@
   }
   Token get firstTokenAfterCommentAndMetadata => _keyword;
 }
-
 /**
  * Instances of the class {@code TypeArgumentList} represent a list of type arguments.
  * <pre>
@@ -12033,22 +12117,22 @@
  * @coverage dart.engine.ast
  */
 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
@@ -12061,7 +12145,7 @@
     this._arguments.addAll(arguments);
     this._rightBracket = rightBracket;
   }
-  
+
   /**
    * Initialize a newly created list of type arguments.
    * @param leftBracket the left bracket
@@ -12070,7 +12154,7 @@
    */
   TypeArgumentList({Token leftBracket, List<TypeName> arguments, Token rightBracket}) : this.full(leftBracket, arguments, rightBracket);
   accept(ASTVisitor visitor) => visitor.visitTypeArgumentList(this);
-  
+
   /**
    * Return the type arguments associated with the type.
    * @return the type arguments associated with the type
@@ -12078,19 +12162,19 @@
   NodeList<TypeName> get arguments => _arguments;
   Token get beginToken => _leftBracket;
   Token get endToken => _rightBracket;
-  
+
   /**
    * Return the left bracket.
    * @return the left bracket
    */
   Token get leftBracket => _leftBracket;
-  
+
   /**
    * Return the right bracket.
    * @return the right bracket
    */
   Token get rightBracket => _rightBracket;
-  
+
   /**
    * Set the left bracket to the given token.
    * @param leftBracket the left bracket
@@ -12098,7 +12182,7 @@
   void set leftBracket(Token leftBracket2) {
     this._leftBracket = leftBracket2;
   }
-  
+
   /**
    * Set the right bracket to the given token.
    * @param rightBracket the right bracket
@@ -12110,7 +12194,6 @@
     _arguments.accept(visitor);
   }
 }
-
 /**
  * Instances of the class {@code TypeName} represent the name of a type, which can optionally
  * include type arguments.
@@ -12120,22 +12203,22 @@
  * @coverage dart.engine.ast
  */
 class TypeName extends ASTNode {
-  
+
   /**
    * The name of the type.
    */
   Identifier _name;
-  
+
   /**
    * The type arguments associated with the type, or {@code null} if there are no type arguments.
    */
   TypeArgumentList _typeArguments;
-  
+
   /**
    * The type being named, or {@code null} if the AST structure has not been resolved.
    */
   Type2 _type;
-  
+
   /**
    * Initialize a newly created type name.
    * @param name the name of the type
@@ -12146,7 +12229,7 @@
     this._name = becomeParentOf(name);
     this._typeArguments = becomeParentOf(typeArguments);
   }
-  
+
   /**
    * Initialize a newly created type name.
    * @param name the name of the type
@@ -12162,19 +12245,19 @@
     }
     return _name.endToken;
   }
-  
+
   /**
    * Return the name of the type.
    * @return the name of the type
    */
   Identifier get name => _name;
-  
+
   /**
    * Return the type being named, or {@code null} if the AST structure has not been resolved.
    * @return the type being named
    */
   Type2 get type => _type;
-  
+
   /**
    * Return the type arguments associated with the type, or {@code null} if there are no type
    * arguments.
@@ -12182,7 +12265,7 @@
    */
   TypeArgumentList get typeArguments => _typeArguments;
   bool isSynthetic() => _name.isSynthetic() && _typeArguments == null;
-  
+
   /**
    * Set the name of the type to the given identifier.
    * @param identifier the name of the type
@@ -12190,7 +12273,7 @@
   void set name(Identifier identifier) {
     _name = becomeParentOf(identifier);
   }
-  
+
   /**
    * Set the type being named to the given type.
    * @param type the type being named
@@ -12198,7 +12281,7 @@
   void set type(Type2 type2) {
     this._type = type2;
   }
-  
+
   /**
    * Set the type arguments associated with the type to the given type arguments.
    * @param typeArguments the type arguments associated with the type
@@ -12211,7 +12294,6 @@
     safelyVisitChild(_typeArguments, visitor);
   }
 }
-
 /**
  * Instances of the class {@code TypeParameter} represent a type parameter.
  * <pre>
@@ -12220,24 +12302,24 @@
  * @coverage dart.engine.ast
  */
 class TypeParameter extends Declaration {
-  
+
   /**
    * The name of the type parameter.
    */
   SimpleIdentifier _name;
-  
+
   /**
    * The token representing the 'extends' keyword, or {@code null} if there was no explicit upper
    * bound.
    */
   Token _keyword;
-  
+
   /**
    * The name of the upper bound for legal arguments, or {@code 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
@@ -12251,7 +12333,7 @@
     this._keyword = keyword;
     this._bound = becomeParentOf(bound);
   }
-  
+
   /**
    * Initialize a newly created type parameter.
    * @param comment the documentation comment associated with the type parameter
@@ -12262,7 +12344,7 @@
    */
   TypeParameter({Comment comment, List<Annotation> metadata, SimpleIdentifier name, Token keyword, TypeName bound}) : this.full(comment, metadata, name, keyword, bound);
   accept(ASTVisitor visitor) => visitor.visitTypeParameter(this);
-  
+
   /**
    * Return the name of the upper bound for legal arguments, or {@code null} if there was no
    * explicit upper bound.
@@ -12276,19 +12358,19 @@
     }
     return _bound.endToken;
   }
-  
+
   /**
    * Return the token representing the 'assert' keyword.
    * @return the token representing the 'assert' keyword
    */
   Token get keyword => _keyword;
-  
+
   /**
    * 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
@@ -12296,7 +12378,7 @@
   void set bound(TypeName typeName) {
     _bound = becomeParentOf(typeName);
   }
-  
+
   /**
    * Set the token representing the 'assert' keyword to the given token.
    * @param keyword the token representing the 'assert' keyword
@@ -12304,7 +12386,7 @@
   void set keyword(Token keyword2) {
     this._keyword = keyword2;
   }
-  
+
   /**
    * Set the name of the type parameter to the given identifier.
    * @param identifier the name of the type parameter
@@ -12319,7 +12401,6 @@
   }
   Token get firstTokenAfterCommentAndMetadata => _name.beginToken;
 }
-
 /**
  * Instances of the class {@code TypeParameterList} represent type parameters within a declaration.
  * <pre>
@@ -12329,22 +12410,22 @@
  * @coverage dart.engine.ast
  */
 class TypeParameterList extends ASTNode {
-  
+
   /**
    * The left angle bracket.
    */
   Token _leftBracket;
-  
+
   /**
    * The type parameters in the list.
    */
   NodeList<TypeParameter> _typeParameters;
-  
+
   /**
    * The right angle bracket.
    */
   Token _rightBracket;
-  
+
   /**
    * Initialize a newly created list of type parameters.
    * @param leftBracket the left angle bracket
@@ -12357,7 +12438,7 @@
     this._typeParameters.addAll(typeParameters);
     this._rightBracket = rightBracket;
   }
-  
+
   /**
    * Initialize a newly created list of type parameters.
    * @param leftBracket the left angle bracket
@@ -12368,19 +12449,19 @@
   accept(ASTVisitor visitor) => visitor.visitTypeParameterList(this);
   Token get beginToken => _leftBracket;
   Token get endToken => _rightBracket;
-  
+
   /**
    * Return the left angle bracket.
    * @return the left angle bracket
    */
   Token get leftBracket => _leftBracket;
-  
+
   /**
    * Return the right angle bracket.
    * @return the right angle bracket
    */
   Token get rightBracket => _rightBracket;
-  
+
   /**
    * Return the type parameters for the type.
    * @return the type parameters for the type
@@ -12390,7 +12471,6 @@
     _typeParameters.accept(visitor);
   }
 }
-
 /**
  * The abstract class {@code TypedLiteral} defines the behavior common to literals that have a type
  * associated with them.
@@ -12399,19 +12479,19 @@
  * @coverage dart.engine.ast
  */
 abstract class TypedLiteral extends Literal {
-  
+
   /**
    * The const modifier associated with this literal, or {@code null} if the literal is not a
    * constant.
    */
   Token _modifier;
-  
+
   /**
    * The type argument associated with this literal, or {@code null} if no type arguments were
    * declared.
    */
   TypeArgumentList _typeArguments;
-  
+
   /**
    * Initialize a newly created typed literal.
    * @param modifier the const modifier associated with this literal
@@ -12422,7 +12502,7 @@
     this._modifier = modifier;
     this._typeArguments = becomeParentOf(typeArguments);
   }
-  
+
   /**
    * Initialize a newly created typed literal.
    * @param modifier the const modifier associated with this literal
@@ -12430,20 +12510,20 @@
    * arguments were declared
    */
   TypedLiteral({Token modifier, TypeArgumentList typeArguments}) : this.full(modifier, typeArguments);
-  
+
   /**
    * Return the const modifier associated with this literal.
    * @return the const modifier associated with this literal
    */
   Token get modifier => _modifier;
-  
+
   /**
    * Return the type argument associated with this literal, or {@code null} if no type arguments
    * were declared.
    * @return the type argument associated with this literal
    */
   TypeArgumentList get typeArguments => _typeArguments;
-  
+
   /**
    * Set the modifiers associated with this literal to the given modifiers.
    * @param modifiers the modifiers associated with this literal
@@ -12451,7 +12531,7 @@
   void set modifier(Token modifier2) {
     this._modifier = modifier2;
   }
-  
+
   /**
    * Set the type argument associated with this literal to the given arguments.
    * @param typeArguments the type argument associated with this literal
@@ -12463,7 +12543,6 @@
     safelyVisitChild(_typeArguments, visitor);
   }
 }
-
 /**
  * The abstract class {@code UriBasedDirective} defines the behavior common to nodes that represent
  * a directive that references a URI.
@@ -12472,12 +12551,12 @@
  * @coverage dart.engine.ast
  */
 abstract class UriBasedDirective extends Directive {
-  
+
   /**
    * The URI referenced by this directive.
    */
   StringLiteral _uri;
-  
+
   /**
    * Initialize a newly create URI-based directive.
    * @param comment the documentation comment associated with this directive
@@ -12487,7 +12566,7 @@
   UriBasedDirective.full(Comment comment, List<Annotation> metadata, StringLiteral uri) : super.full(comment, metadata) {
     this._uri = becomeParentOf(uri);
   }
-  
+
   /**
    * Initialize a newly create URI-based directive.
    * @param comment the documentation comment associated with this directive
@@ -12495,13 +12574,13 @@
    * @param uri the URI referenced by this directive
    */
   UriBasedDirective({Comment comment, List<Annotation> metadata, StringLiteral uri}) : this.full(comment, metadata, 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 {@code null} if the AST
    * structure has not been resolved or if this URI could not be resolved. Examples of the latter
@@ -12509,7 +12588,7 @@
    * @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
@@ -12522,7 +12601,6 @@
     safelyVisitChild(_uri, visitor);
   }
 }
-
 /**
  * Instances of the class {@code VariableDeclaration} represent an identifier that has an initial
  * value associated with it. Instances of this class are always children of the class{@link VariableDeclarationList}.
@@ -12532,24 +12610,24 @@
  * @coverage dart.engine.ast
  */
 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 {@code null} if the
    * initial value was not specified.
    */
   Token _equals;
-  
+
   /**
    * The expression used to compute the initial value for the variable, or {@code 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
@@ -12563,7 +12641,7 @@
     this._equals = equals;
     this._initializer = becomeParentOf(initializer);
   }
-  
+
   /**
    * Initialize a newly created variable declaration.
    * @param comment the documentation comment associated with this declaration
@@ -12581,27 +12659,27 @@
     }
     return _name.endToken;
   }
-  
+
   /**
    * Return the equal sign separating the variable name from the initial value, or {@code null} if
    * the initial value was not specified.
    * @return the equal sign separating the variable name from the initial value
    */
   Token get equals => _equals;
-  
+
   /**
    * Return the expression used to compute the initial value for the variable, or {@code 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 {@code true} if this variable was declared with the 'const' modifier.
    * @return {@code true} if this variable was declared with the 'const' modifier
@@ -12610,7 +12688,7 @@
     ASTNode parent2 = parent;
     return parent2 is VariableDeclarationList && ((parent2 as VariableDeclarationList)).isConst();
   }
-  
+
   /**
    * Return {@code true} if this variable was declared with the 'final' modifier. Variables that are
    * declared with the 'const' modifier will return {@code false} even though they are implicitly
@@ -12621,7 +12699,7 @@
     ASTNode parent2 = parent;
     return parent2 is VariableDeclarationList && ((parent2 as VariableDeclarationList)).isFinal();
   }
-  
+
   /**
    * Set the equal sign separating the variable name from the initial value to the given token.
    * @param equals the equal sign separating the variable name from the initial value
@@ -12629,7 +12707,7 @@
   void set equals(Token equals2) {
     this._equals = equals2;
   }
-  
+
   /**
    * 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
@@ -12637,7 +12715,7 @@
   void set initializer(Expression initializer2) {
     this._initializer = becomeParentOf(initializer2);
   }
-  
+
   /**
    * Set the name of the variable being declared to the given identifier.
    * @param name the name of the variable being declared
@@ -12652,7 +12730,6 @@
   }
   Token get firstTokenAfterCommentAndMetadata => _name.beginToken;
 }
-
 /**
  * Instances of the class {@code VariableDeclarationList} represent the declaration of one or more
  * variables of the same type.
@@ -12667,23 +12744,23 @@
  * @coverage dart.engine.ast
  */
 class VariableDeclarationList extends AnnotatedNode {
-  
+
   /**
    * The token representing the 'final', 'const' or 'var' keyword, or {@code null} if no keyword was
    * included.
    */
   Token _keyword;
-  
+
   /**
    * The type of the variables being declared, or {@code 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
@@ -12698,7 +12775,7 @@
     this._type = becomeParentOf(type);
     this._variables.addAll(variables);
   }
-  
+
   /**
    * Initialize a newly created variable declaration list.
    * @param comment the documentation comment associated with this declaration list
@@ -12710,32 +12787,32 @@
   VariableDeclarationList({Comment comment, List<Annotation> metadata, Token keyword, TypeName type, List<VariableDeclaration> variables}) : this.full(comment, metadata, keyword, type, variables);
   accept(ASTVisitor visitor) => visitor.visitVariableDeclarationList(this);
   Token get endToken => _variables.endToken;
-  
+
   /**
    * Return the token representing the 'final', 'const' or 'var' keyword, or {@code null} if no
    * keyword was included.
    * @return the token representing the 'final', 'const' or 'var' keyword
    */
   Token get keyword => _keyword;
-  
+
   /**
    * Return the type of the variables being declared, or {@code 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 {@code true} if the variables in this list were declared with the 'const' modifier.
    * @return {@code true} if the variables in this list were declared with the 'const' modifier
    */
   bool isConst() => _keyword is KeywordToken && identical(((_keyword as KeywordToken)).keyword, Keyword.CONST);
-  
+
   /**
    * Return {@code true} if the variables in this list were declared with the 'final' modifier.
    * Variables that are declared with the 'const' modifier will return {@code false} even though
@@ -12743,7 +12820,7 @@
    * @return {@code true} if the variables in this list were declared with the 'final' modifier
    */
   bool isFinal() => _keyword is KeywordToken && identical(((_keyword as KeywordToken)).keyword, Keyword.FINAL);
-  
+
   /**
    * Set the token representing the 'final', 'const' or 'var' keyword to the given token.
    * @param keyword the token representing the 'final', 'const' or 'var' keyword
@@ -12751,7 +12828,7 @@
   void set keyword(Token keyword2) {
     this._keyword = keyword2;
   }
-  
+
   /**
    * Set the type of the variables being declared to the given type name.
    * @param typeName the type of the variables being declared
@@ -12772,7 +12849,6 @@
     return _variables.beginToken;
   }
 }
-
 /**
  * Instances of the class {@code VariableDeclarationStatement} represent a list of variables that
  * are being declared in a context where a statement is required.
@@ -12782,17 +12858,17 @@
  * @coverage dart.engine.ast
  */
 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
@@ -12802,7 +12878,7 @@
     this._variableList = becomeParentOf(variableList);
     this._semicolon = semicolon;
   }
-  
+
   /**
    * Initialize a newly created variable declaration statement.
    * @param variableList the fields being declared
@@ -12812,19 +12888,19 @@
   accept(ASTVisitor visitor) => visitor.visitVariableDeclarationStatement(this);
   Token get beginToken => _variableList.beginToken;
   Token get endToken => _semicolon;
-  
+
   /**
    * Return the semicolon terminating the statement.
    * @return the semicolon terminating the statement
    */
   Token get semicolon => _semicolon;
-  
+
   /**
    * Return the variables being declared.
    * @return the variables being declared
    */
   VariableDeclarationList get variables => _variableList;
-  
+
   /**
    * Set the semicolon terminating the statement to the given token.
    * @param semicolon the semicolon terminating the statement
@@ -12832,7 +12908,7 @@
   void set semicolon(Token semicolon2) {
     this._semicolon = semicolon2;
   }
-  
+
   /**
    * Set the variables being declared to the given list of variables.
    * @param variableList the variables being declared
@@ -12844,7 +12920,6 @@
     safelyVisitChild(_variableList, visitor);
   }
 }
-
 /**
  * Instances of the class {@code WhileStatement} represent a while statement.
  * <pre>
@@ -12853,32 +12928,32 @@
  * @coverage dart.engine.ast
  */
 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
@@ -12894,7 +12969,7 @@
     this._rightParenthesis = rightParenthesis;
     this._body = becomeParentOf(body);
   }
-  
+
   /**
    * Initialize a newly created while statement.
    * @param keyword the token representing the 'while' keyword
@@ -12906,38 +12981,38 @@
   WhileStatement({Token keyword, Token leftParenthesis, Expression condition, Token rightParenthesis, Statement body}) : this.full(keyword, leftParenthesis, condition, rightParenthesis, body);
   accept(ASTVisitor visitor) => visitor.visitWhileStatement(this);
   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;
   Token get endToken => _body.endToken;
-  
+
   /**
    * Return the token representing the 'while' keyword.
    * @return the token representing the 'while' keyword
    */
   Token get keyword => _keyword;
-  
+
   /**
    * Return the left parenthesis.
    * @return the left parenthesis
    */
   Token get leftParenthesis => _leftParenthesis;
-  
+
   /**
    * Return the right parenthesis.
    * @return the right parenthesis
    */
   Token get rightParenthesis => _rightParenthesis;
-  
+
   /**
    * Set the body of the loop to the given statement.
    * @param statement the body of the loop
@@ -12945,7 +13020,7 @@
   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.
@@ -12954,7 +13029,7 @@
   void set condition(Expression expression) {
     _condition = becomeParentOf(expression);
   }
-  
+
   /**
    * Set the token representing the 'while' keyword to the given token.
    * @param keyword the token representing the 'while' keyword
@@ -12962,7 +13037,7 @@
   void set keyword(Token keyword2) {
     this._keyword = keyword2;
   }
-  
+
   /**
    * Set the left parenthesis to the given token.
    * @param leftParenthesis the left parenthesis
@@ -12970,7 +13045,7 @@
   void set leftParenthesis(Token leftParenthesis2) {
     this._leftParenthesis = leftParenthesis2;
   }
-  
+
   /**
    * Set the right parenthesis to the given token.
    * @param rightParenthesis the right parenthesis
@@ -12983,7 +13058,6 @@
     safelyVisitChild(_body, visitor);
   }
 }
-
 /**
  * Instances of the class {@code WithClause} represent the with clause in a class declaration.
  * <pre>
@@ -12993,17 +13067,17 @@
  * @coverage dart.engine.ast
  */
 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
@@ -13014,7 +13088,7 @@
     this._withKeyword = withKeyword;
     this._mixinTypes.addAll(mixinTypes);
   }
-  
+
   /**
    * Initialize a newly created with clause.
    * @param withKeyword the token representing the 'with' keyword
@@ -13024,19 +13098,19 @@
   accept(ASTVisitor visitor) => visitor.visitWithClause(this);
   Token get beginToken => _withKeyword;
   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
@@ -13048,7 +13122,6 @@
     _mixinTypes.accept(visitor);
   }
 }
-
 /**
  * Instances of the class {@code BreadthFirstVisitor} implement an AST visitor that will recursively
  * visit all of the nodes in an AST structure, similar to {@link GeneralizingASTVisitor}. This
@@ -13058,7 +13131,7 @@
 class BreadthFirstVisitor<R> extends GeneralizingASTVisitor<R> {
   Queue<ASTNode> _queue = new Queue<ASTNode>();
   GeneralizingASTVisitor<Object> _childVisitor;
-  
+
   /**
    * Visit all nodes in the tree starting at the given {@code root} node, in depth-first order.
    * @param root the root of the ASTNode tree
@@ -13086,7 +13159,6 @@
     return null;
   }
 }
-
 /**
  * Instances of the class {@code ConstantEvaluator} evaluate constant expressions to produce their
  * compile-time value. According to the Dart Language Specification: <blockquote> A constant
@@ -13120,7 +13192,7 @@
  * @coverage dart.engine.ast
  */
 class ConstantEvaluator extends GeneralizingASTVisitor<Object> {
-  
+
   /**
    * The value returned for expressions (or non-expression nodes) that are not compile-time constant
    * expressions.
@@ -13350,7 +13422,7 @@
     }
     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
@@ -13365,13 +13437,12 @@
     return NOT_A_CONSTANT;
   }
 }
-
 /**
  * Instances of the class {@code ElementLocator} locate the {@link Element Dart model element}associated with a given {@link ASTNode AST node}.
  * @coverage dart.engine.ast
  */
 class ElementLocator {
-  
+
   /**
    * Locate the {@link Element Dart model element} associated with the given {@link ASTNode AST
    * node}.
@@ -13383,7 +13454,6 @@
     return node.accept(mapper);
   }
 }
-
 /**
  * Visitor that maps nodes to elements.
  */
@@ -13438,7 +13508,6 @@
   }
   Element visitVariableDeclaration(VariableDeclaration node) => node.element;
 }
-
 /**
  * Instances of the class {@code GeneralizingASTVisitor} implement an AST visitor that will
  * recursively visit all of the nodes in an AST structure (like instances of the class{@link RecursiveASTVisitor}). In addition, when a node of a specific type is visited not only
@@ -13583,7 +13652,6 @@
   R visitWhileStatement(WhileStatement node) => visitStatement(node);
   R visitWithClause(WithClause node) => visitNode(node);
 }
-
 /**
  * Instances of the class {@code NodeLocator} locate the {@link ASTNode AST node} associated with a
  * source range, given the AST structure built from the source. More specifically, they will return
@@ -13592,23 +13660,23 @@
  * @coverage dart.engine.ast
  */
 class NodeLocator extends GeneralizingASTVisitor<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 {@code null} if there
    * is no such element.
    */
   ASTNode _foundNode;
-  
+
   /**
    * Initialize a newly created locator to locate one or more {@link ASTNode AST nodes} by locating
    * the node within an AST structure that corresponds to the given offset in the source.
@@ -13620,7 +13688,7 @@
   _jtd_constructor_120_impl(int offset) {
     _jtd_constructor_121_impl(offset, offset);
   }
-  
+
   /**
    * Initialize a newly created locator to locate one or more {@link ASTNode AST nodes} by locating
    * the node within an AST structure that corresponds to the given range of characters in the
@@ -13635,14 +13703,14 @@
     this._startOffset = start;
     this._endOffset = end;
   }
-  
+
   /**
    * Return the node that was found that corresponds to the given source range, or {@code 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 {@link DartElement Dart
    * element} in the specified source range. Return the element that was found, or {@code null} if
@@ -13683,7 +13751,6 @@
     return null;
   }
 }
-
 /**
  * Instances of the class {@code NodeFoundException} are used to cancel visiting after a node has
  * been found.
@@ -13691,7 +13758,6 @@
 class NodeLocator_NodeFoundException extends RuntimeException {
   static int _serialVersionUID = 1;
 }
-
 /**
  * Instances of the class {@code 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
@@ -14108,7 +14174,6 @@
     return null;
   }
 }
-
 /**
  * Instances of the class {@code 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
@@ -14219,19 +14284,18 @@
   R visitWhileStatement(WhileStatement node) => null;
   R visitWithClause(WithClause node) => null;
 }
-
 /**
  * Instances of the class {@code ToSourceVisitor} write a source representation of a visited AST
  * node (and all of it's children) to a writer.
  * @coverage dart.engine.ast
  */
 class ToSourceVisitor implements ASTVisitor<Object> {
-  
+
   /**
    * The writer to which the source is to be written.
    */
   PrintWriter _writer;
-  
+
   /**
    * Initialize a newly created visitor to write source code representing the visited nodes to the
    * given writer.
@@ -14923,7 +14987,7 @@
     visitList2(node.mixinTypes, ", ");
     return null;
   }
-  
+
   /**
    * Safely visit the given node.
    * @param node the node to be visited
@@ -14933,7 +14997,7 @@
       node.accept(this);
     }
   }
-  
+
   /**
    * Safely visit the given node, printing the suffix after the node if it is non-{@code null}.
    * @param suffix the suffix to be printed if there is a node to visit
@@ -14945,7 +15009,7 @@
       _writer.print(suffix);
     }
   }
-  
+
   /**
    * Safely visit the given node, printing the prefix before the node if it is non-{@code null}.
    * @param prefix the prefix to be printed if there is a node to visit
@@ -14957,7 +15021,7 @@
       node.accept(this);
     }
   }
-  
+
   /**
    * Visit the given function body, printing the prefix before if given body is not empty.
    * @param prefix the prefix to be printed if there is a node to visit
@@ -14969,7 +15033,7 @@
     }
     visit(body);
   }
-  
+
   /**
    * Safely visit the given node, printing the suffix after the node if it is non-{@code null}.
    * @param suffix the suffix to be printed if there is a node to visit
@@ -14981,7 +15045,7 @@
       _writer.print(suffix);
     }
   }
-  
+
   /**
    * Print a list of nodes without any separation.
    * @param nodes the nodes to be printed
@@ -14990,7 +15054,7 @@
   void visitList(NodeList<ASTNode> nodes) {
     visitList2(nodes, "");
   }
-  
+
   /**
    * Print a list of nodes, separated by the given separator.
    * @param nodes the nodes to be printed
@@ -15007,7 +15071,7 @@
       }
     }
   }
-  
+
   /**
    * Print a list of nodes, separated by the given separator.
    * @param nodes the nodes to be printed
@@ -15028,7 +15092,7 @@
       }
     }
   }
-  
+
   /**
    * Print a list of nodes, separated by the given separator.
    * @param prefix the prefix to be printed if the list is not empty
@@ -15050,7 +15114,6 @@
     }
   }
 }
-
 /**
  * Instances of the class {@code 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
@@ -15192,7 +15255,6 @@
     return clonedNodes;
   }
 }
-
 /**
  * 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
@@ -15308,7 +15370,7 @@
       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
diff --git a/pkg/analyzer_experimental/lib/src/generated/constant.dart b/pkg/analyzer_experimental/lib/src/generated/constant.dart
index 0f49924..41d94c9 100644
--- a/pkg/analyzer_experimental/lib/src/generated/constant.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/constant.dart
@@ -1,8 +1,6 @@
 // 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.constant;
-
 import 'java_core.dart';
 import 'source.dart' show Source;
 import 'error.dart' show AnalysisError, ErrorCode, CompileTimeErrorCode;
@@ -10,8 +8,6 @@
 import 'ast.dart';
 import 'element.dart';
 import 'engine.dart' show AnalysisEngine;
-
-
 /**
  * Instances of the class {@code ConstantEvaluator} evaluate constant expressions to produce their
  * compile-time value. According to the Dart Language Specification: <blockquote> A constant
@@ -44,12 +40,12 @@
  * those values.
  */
 class ConstantEvaluator {
-  
+
   /**
    * The source containing the expression(s) that will be evaluated.
    */
   Source _source;
-  
+
   /**
    * Initialize a newly created evaluator to evaluate expressions in the given source.
    * @param source the source containing the expression(s) that will be evaluated
@@ -70,13 +66,12 @@
     return EvaluationResult.forErrors(new List.from(errors));
   }
 }
-
 /**
  * Instances of the class {@code 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.
@@ -84,7 +79,7 @@
    * @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.
@@ -92,17 +87,17 @@
    * @return the result of evaluating an expression that is a compile-time constant
    */
   static EvaluationResult forValue(Object value) => new EvaluationResult(value, null);
-  
+
   /**
    * The value of the expression.
    */
   Object _value;
-  
+
   /**
    * The errors that should be reported for the expression(s) that were evaluated.
    */
   List<AnalysisError> _errors;
-  
+
   /**
    * Initialize a newly created result object with the given state. Clients should use one of the
    * factory methods: {@link #forErrors(AnalysisError\[\])} and {@link #forValue(Object)}.
@@ -113,7 +108,7 @@
     this._value = value;
     this._errors = 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
@@ -121,14 +116,14 @@
    * other parts of the analysis engine.
    */
   List<AnalysisError> get errors => _errors == null ? AnalysisError.NO_ERRORS : _errors;
-  
+
   /**
    * Return the value of the expression, or {@code null} if the expression evaluated to {@code null}or if the expression could not be evaluated, either because it was not a compile-time constant
    * expression or because it would throw an exception when evaluated.
    * @return the value of the expression
    */
   Object get value => _value;
-  
+
   /**
    * Return {@code true} if the expression is a compile-time constant expression that would not
    * throw an exception when evaluated.
@@ -136,19 +131,18 @@
    */
   bool isValid() => _errors == null;
 }
-
 /**
  * Instances of the class {@code 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.
  */
 class ConstantFinder extends RecursiveASTVisitor<Object> {
-  
+
   /**
    * A table mapping constant variable elements to the declarations of those variables.
    */
   Map<VariableElement, VariableDeclaration> _variableMap = new Map<VariableElement, VariableDeclaration>();
-  
+
   /**
    * Return a table mapping constant variable elements to the declarations of those variables.
    * @return a table mapping constant variable elements to the declarations of those variables
@@ -166,7 +160,6 @@
     return null;
   }
 }
-
 /**
  * Instances of the class {@code ConstantValueComputer} compute the values of constant variables in
  * one or more compilation units. The expected usage pattern is for the compilation units to be
@@ -174,23 +167,23 @@
  * method {@link #computeValues()} will result in unpredictable behavior.
  */
 class ConstantValueComputer {
-  
+
   /**
    * The object used to find constant variables in the compilation units that were added.
    */
   ConstantFinder _constantFinder = new ConstantFinder();
-  
+
   /**
    * 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.
    */
   DirectedGraph<VariableElement> _referenceGraph = new DirectedGraph<VariableElement>();
-  
+
   /**
    * A table mapping constant variables to the declarations of those variables.
    */
   Map<VariableElement, VariableDeclaration> _declarationMap;
-  
+
   /**
    * Add the constant variables in the given compilation unit to the list of constant variables
    * whose value needs to be computed.
@@ -199,7 +192,7 @@
   void add(CompilationUnit unit) {
     unit.accept(_constantFinder);
   }
-  
+
   /**
    * Compute values for all of the constant variables in the compilation units that were added.
    */
@@ -230,7 +223,7 @@
       }
     }
   }
-  
+
   /**
    * Compute a value for the given variable.
    * @param variable the variable for which a value is to be computed
@@ -251,7 +244,7 @@
       }
     }
   }
-  
+
   /**
    * Generate an error indicating that the given variable is not a valid compile-time constant
    * because it references at least one of the variables in the given cycle, each of which directly
@@ -262,7 +255,6 @@
   void generateCycleError(List<VariableElement> variablesInCycle, VariableElement variable) {
   }
 }
-
 /**
  * Instances of the class {@code ConstantVisitor} evaluate constant expressions to produce their
  * compile-time value. According to the Dart Language Specification: <blockquote> A constant
@@ -371,6 +363,9 @@
   }
   EvaluationResultImpl visitInterpolationString(InterpolationString node) => new ValidResult(node.value);
   EvaluationResultImpl visitListLiteral(ListLiteral node) {
+    if (node.modifier == null) {
+      return new ErrorResult.con1(node, CompileTimeErrorCode.MISSING_CONST_IN_LIST_LITERAL);
+    }
     ErrorResult result = null;
     for (Expression element in node.elements) {
       result = union(result, element.accept(this));
@@ -381,6 +376,9 @@
     return ValidResult.RESULT_OBJECT;
   }
   EvaluationResultImpl visitMapLiteral(MapLiteral node) {
+    if (node.modifier == null) {
+      return new ErrorResult.con1(node, CompileTimeErrorCode.MISSING_CONST_IN_MAP_LITERAL);
+    }
     ErrorResult result = null;
     for (MapLiteralEntry entry in node.entries) {
       result = union(result, entry.key.accept(this));
@@ -447,7 +445,7 @@
     }
     return result;
   }
-  
+
   /**
    * Return a result object representing an error associated with the given node.
    * @param node the AST node associated with the error
@@ -455,7 +453,7 @@
    * @return a result object representing an error associated with the given node
    */
   ErrorResult error(ASTNode node, ErrorCode code) => new ErrorResult.con1(node, code == null ? CompileTimeErrorCode.INVALID_CONSTANT : code);
-  
+
   /**
    * Return the constant value of the static constant represented by the given element.
    * @param node the node to be used if an error needs to be reported
@@ -478,7 +476,7 @@
     }
     return error(node, null);
   }
-  
+
   /**
    * Return the union of the errors encoded in the given results.
    * @param leftResult the first set of errors, or {@code null} if there was no previous collection
@@ -498,7 +496,6 @@
     return leftResult;
   }
 }
-
 /**
  * Instances of the class {@code DirectedGraph} implement a directed graph in which the nodes are
  * arbitrary (client provided) objects and edges are represented implicitly. The graph will allow an
@@ -507,14 +504,14 @@
  * @param N the type of the nodes in the graph
  */
 class DirectedGraph<N> {
-  
+
   /**
    * The table encoding the edges in the graph. An edge is represented by an entry mapping the head
    * to a set of tails. Nodes that are not the head of any edge are represented by an entry mapping
    * the node to an empty set of tails.
    */
   Map<N, Set<N>> _edges = new Map<N, Set<N>>();
-  
+
   /**
    * Add an edge from the given head node to the given tail node. Both nodes will be a part of the
    * graph after this method is invoked, whether or not they were before.
@@ -533,7 +530,7 @@
     }
     javaSetAdd(tails, tail);
   }
-  
+
   /**
    * Add the given node to the set of nodes in the graph.
    * @param node the node to be added
@@ -544,19 +541,19 @@
       _edges[node] = new Set<N>();
     }
   }
-  
+
   /**
    * Return a list of nodes that form a cycle, or {@code null} if there are no cycles in this graph.
    * @return a list of nodes that form a cycle
    */
   List<N> findCycle() => null;
-  
+
   /**
    * Return the number of nodes in this graph.
    * @return the number of nodes in this graph
    */
   int get nodeCount => _edges.length;
-  
+
   /**
    * Return a set containing the tails of edges that have the given node as their head. The set will
    * be empty if there are no such edges or if the node is not part of the graph. Clients must not
@@ -571,13 +568,13 @@
     }
     return tails;
   }
-  
+
   /**
    * Return {@code true} if this graph is empty.
    * @return {@code true} if this graph is empty
    */
   bool isEmpty() => _edges.isEmpty;
-  
+
   /**
    * Remove all of the given nodes from this graph. As a consequence, any edges for which those
    * nodes were either a head or a tail will also be removed.
@@ -588,7 +585,7 @@
       removeNode(node);
     }
   }
-  
+
   /**
    * Remove the edge from the given head node to the given tail node. If there was no such edge then
    * the graph will be unmodified: the number of edges will be the same and the set of nodes will be
@@ -603,7 +600,7 @@
       tails.remove(tail);
     }
   }
-  
+
   /**
    * Remove the given node from this graph. As a consequence, any edges for which that node was
    * either a head or a tail will also be removed.
@@ -615,7 +612,7 @@
       tails.remove(node);
     }
   }
-  
+
   /**
    * Find one node (referred to as a sink node) that has no outgoing edges (that is, for which there
    * are no edges that have that node as the head of the edge) and remove it from this graph. Return
@@ -632,33 +629,30 @@
     removeNode(sink);
     return sink;
   }
-  
+
   /**
    * Return one node that has no outgoing edges (that is, for which there are no edges that have
    * that node as the head of the edge), or {@code null} if there are no such nodes.
    * @return a sink node
    */
   N findSink() {
-    for (MapEntry<N, Set<N>> entry in getMapEntrySet(_edges)) {
-      if (entry.getValue().isEmpty) {
-        return entry.getKey();
-      }
+    for (N key in _edges.keys) {
+      if (_edges[key].isEmpty) return key;
     }
     return null;
   }
 }
-
 /**
  * Instances of the class {@code 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.
@@ -666,12 +660,12 @@
    * @param errorCode the error code for the error to be generated
    */
   ErrorResult.con1(ASTNode node, ErrorCode errorCode) {
-    _jtd_constructor_171_impl(node, errorCode);
+    _jtd_constructor_172_impl(node, errorCode);
   }
-  _jtd_constructor_171_impl(ASTNode node, ErrorCode errorCode) {
+  _jtd_constructor_172_impl(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.
@@ -679,9 +673,9 @@
    * @param secondResult the second set of results being merged
    */
   ErrorResult.con2(ErrorResult firstResult, ErrorResult secondResult) {
-    _jtd_constructor_172_impl(firstResult, secondResult);
+    _jtd_constructor_173_impl(firstResult, secondResult);
   }
-  _jtd_constructor_172_impl(ErrorResult firstResult, ErrorResult secondResult) {
+  _jtd_constructor_173_impl(ErrorResult firstResult, ErrorResult secondResult) {
     _errors.addAll(firstResult._errors);
     _errors.addAll(secondResult._errors);
   }
@@ -752,17 +746,17 @@
   EvaluationResultImpl timesValid(BinaryExpression node, ValidResult leftOperand) => this;
 }
 class ErrorResult_ErrorData {
-  
+
   /**
    * The node against which the error should be reported.
    */
   ASTNode _node;
-  
+
   /**
    * The error code for the error to be generated.
    */
   ErrorCode _errorCode;
-  
+
   /**
    * Initialize a newly created data holder to represent the error with the given code reported
    * against the given node.
@@ -773,20 +767,19 @@
     this._node = node;
     this._errorCode = errorCode;
   }
-  
+
   /**
    * Return the error code for the error to be generated.
    * @return the error code for the error to be generated
    */
   ErrorCode get errorCode => _errorCode;
-  
+
   /**
    * Return the node against which the error should be reported.
    * @return the node against which the error should be reported
    */
   ASTNode get node => _node;
 }
-
 /**
  * Instances of the class {@code InternalResult} represent the result of attempting to evaluate a
  * expression.
@@ -857,24 +850,23 @@
   EvaluationResultImpl timesError(BinaryExpression node, ErrorResult leftOperand);
   EvaluationResultImpl timesValid(BinaryExpression node, ValidResult leftOperand);
 }
-
 /**
  * Instances of the class {@code 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.
    */
   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.
    */
   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.
@@ -900,69 +892,68 @@
     return null;
   }
 }
-
 /**
  * Instances of the class {@code ValidResult} represent the result of attempting to evaluate a valid
  * compile time constant expression.
  */
 class ValidResult extends EvaluationResultImpl {
-  
+
   /**
    * A result object representing the value 'false'.
    */
   static ValidResult RESULT_FALSE = new ValidResult(false);
-  
+
   /**
    * A result object representing the an object without specific type on which no further operations
    * can be performed.
    */
   static ValidResult RESULT_DYNAMIC = new ValidResult(null);
-  
+
   /**
    * A result object representing the an arbitrary integer on which no further operations can be
    * performed.
    */
   static ValidResult RESULT_INT = new ValidResult(null);
-  
+
   /**
    * A result object representing the {@code null} value.
    */
   static ValidResult RESULT_NULL = new ValidResult(null);
-  
+
   /**
    * A result object representing the an arbitrary numeric on which no further operations can be
    * performed.
    */
   static ValidResult RESULT_NUM = new ValidResult(null);
-  
+
   /**
    * A result object representing the an arbitrary boolean on which no further operations can be
    * performed.
    */
   static ValidResult RESULT_BOOL = new ValidResult(null);
-  
+
   /**
    * A result object representing the an arbitrary object on which no further operations can be
    * performed.
    */
   static ValidResult RESULT_OBJECT = new ValidResult(new Object());
-  
+
   /**
    * A result object representing the an arbitrary string on which no further operations can be
    * performed.
    */
   static ValidResult RESULT_STRING = new ValidResult("<string>");
-  
+
   /**
    * A result object representing the value 'true'.
    */
   static ValidResult RESULT_TRUE = new ValidResult(true);
-  
+
   /**
    * The value of the expression.
    */
   Object _value;
-  
+
   /**
    * Initialize a newly created result to represent the given value.
    * @param value the value of the expression
@@ -1303,15 +1294,15 @@
         return valueOf(((leftValue as int)) ~/ (_value as int));
       } else if (_value is double) {
         double result = ((leftValue as int)).toDouble() / ((_value as double));
-        return valueOf((result as int));
+        return valueOf(result.toInt());
       }
     } else if (leftValue is double) {
       if (_value is int) {
         double result = ((leftValue as double)) / ((_value as int)).toDouble();
-        return valueOf((result as int));
+        return valueOf(result.toInt());
       } else if (_value is double) {
         double result = ((leftValue as double)) / ((_value as double));
-        return valueOf((result as int));
+        return valueOf(result.toInt());
       }
     }
     return error(node);
@@ -1574,7 +1565,7 @@
     return error(node);
   }
   bool isNull() => identical(this, RESULT_NULL);
-  
+
   /**
    * Return the result of applying boolean conversion to the given value.
    * @param node the node against which errors should be reported
@@ -1592,7 +1583,7 @@
     return error(node);
   }
   ErrorResult error(ASTNode node) => error2(node, CompileTimeErrorCode.INVALID_CONSTANT);
-  
+
   /**
    * Return a result object representing an error associated with the given node.
    * @param node the AST node associated with the error
@@ -1600,43 +1591,43 @@
    * @return a result object representing an error associated with the given node
    */
   ErrorResult error2(ASTNode node, ErrorCode code) => new ErrorResult.con1(node, code);
-  
+
   /**
    * Checks if this result has type "bool", with known or unknown value.
    */
   bool isAnyBool() => isSomeBool() || identical(this, RESULT_TRUE) || identical(this, RESULT_FALSE);
-  
+
   /**
    * Checks if this result has type "int", with known or unknown value.
    */
   bool isAnyInt() => identical(this, RESULT_INT) || _value is int;
-  
+
   /**
    * Checks if this result has one of the types - "bool", "num" or "string"; or may be {@code null}.
    */
   bool isAnyNullBoolNumString() => isNull() || isAnyBool() || isAnyNum() || _value is String;
-  
+
   /**
    * Checks if this result has type "num", with known or unknown value.
    */
   bool isAnyNum() => isSomeNum() || _value is num;
-  
+
   /**
    * Checks if this result has type "bool", exact value of which we don't know.
    */
   bool isSomeBool() => identical(this, RESULT_BOOL);
-  
+
   /**
    * Checks if this result has type "int", exact value of which we don't know.
    */
   bool isSomeInt() => identical(this, RESULT_INT);
-  
+
   /**
    * Checks if this result has type "num" (or "int"), exact value of which we don't know.
    */
   bool isSomeNum() => identical(this, RESULT_DYNAMIC) || identical(this, RESULT_INT) || identical(this, RESULT_NUM);
   double toDouble(int value) => value.toDouble();
-  
+
   /**
    * Return an error result that is the union of the two given error results.
    * @param firstError the first error to be combined
@@ -1644,28 +1635,28 @@
    * @return an error result that is the union of the two given error results
    */
   ErrorResult union(ErrorResult firstError, ErrorResult secondError) => new ErrorResult.con2(firstError, secondError);
-  
+
   /**
    * 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(int value) => new ValidResult(value);
-  
+
   /**
    * 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 valueOf2(bool value) => value ? RESULT_TRUE : RESULT_FALSE;
-  
+
   /**
    * 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 valueOf3(double value) => new ValidResult(value);
-  
+
   /**
    * Return a result object representing the given value.
    * @param value the value to be represented as a result object
diff --git a/pkg/analyzer_experimental/lib/src/generated/element.dart b/pkg/analyzer_experimental/lib/src/generated/element.dart
index 3ed952a..575fe43 100644
--- a/pkg/analyzer_experimental/lib/src/generated/element.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/element.dart
@@ -1,8 +1,6 @@
 // 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.element;
-
 import 'dart:collection';
 import 'java_core.dart';
 import 'java_engine.dart';
@@ -14,15 +12,13 @@
 import 'engine.dart' show AnalysisContext;
 import 'constant.dart' show EvaluationResultImpl;
 import 'utilities_dart.dart';
-
-
 /**
  * The interface {@code Annotation} defines the behavior of objects representing a single annotation
  * associated with an element.
  * @coverage dart.engine.element
  */
 abstract class Annotation {
-  
+
   /**
    * Return the element representing the field, variable, or const constructor being used as an
    * annotation.
@@ -30,38 +26,37 @@
    */
   Element get element;
 }
-
 /**
  * The interface {@code ClassElement} defines the behavior of elements that represent a class.
  * @coverage dart.engine.element
  */
 abstract class ClassElement implements Element {
-  
+
   /**
    * Return an array containing all of the accessors (getters and setters) declared in this class.
    * @return the accessors declared in this class
    */
   List<PropertyAccessorElement> get accessors;
-  
+
   /**
    * Return an array containing all the supertypes defined for this class and its supertypes. This
    * includes superclasses, mixins and interfaces.
    * @return all the supertypes of this class, including mixins
    */
   List<InterfaceType> get allSupertypes;
-  
+
   /**
    * Return an array containing all of the constructors declared in this class.
    * @return the constructors declared in this class
    */
   List<ConstructorElement> get constructors;
-  
+
   /**
    * Return an array containing all of the fields declared in this class.
    * @return the fields declared in this class
    */
   List<FieldElement> get fields;
-  
+
   /**
    * Return the element representing the getter with the given name that is declared in this class,
    * or {@code null} if this class does not declare a getter with the given name.
@@ -69,7 +64,7 @@
    * @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 class.
    * <p>
@@ -80,7 +75,7 @@
    * @return the interfaces that are implemented by this class
    */
   List<InterfaceType> get interfaces;
-  
+
   /**
    * Return the element representing the method with the given name that is declared in this class,
    * or {@code null} if this class does not declare a method with the given name.
@@ -88,13 +83,13 @@
    * @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 class.
    * @return the methods declared in this class
    */
   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.
@@ -106,7 +101,7 @@
    * @return the mixins that are applied to derive the superclass of this class
    */
   List<InterfaceType> get mixins;
-  
+
   /**
    * Return the named constructor declared in this class with the given name, or {@code null} if
    * this class does not declare a named constructor with the given name.
@@ -114,7 +109,7 @@
    * @return the element representing the specified constructor
    */
   ConstructorElement getNamedConstructor(String name);
-  
+
   /**
    * Return the element representing the setter with the given name that is declared in this class,
    * or {@code null} if this class does not declare a setter with the given name.
@@ -122,7 +117,7 @@
    * @return the setter declared in this class with the given name
    */
   PropertyAccessorElement getSetter(String setterName);
-  
+
   /**
    * Return the superclass of this class, or {@code null} if the class represents the class
    * 'Object'. All other classes will have a non-{@code null} superclass. If the superclass was not
@@ -135,19 +130,19 @@
    * @return the superclass of this class
    */
   InterfaceType get supertype;
-  
+
   /**
    * Return the type defined by the class.
    * @return the type defined by the class
    */
   InterfaceType get type;
-  
+
   /**
    * Return an array containing all of the type variables declared for this class.
    * @return the type variables declared for this class
    */
   List<TypeVariableElement> get typeVariables;
-  
+
   /**
    * Return the unnamed constructor declared in this class, or {@code null} if this class does not
    * declare an unnamed constructor but does declare named constructors. The returned constructor
@@ -156,33 +151,33 @@
    * @return the unnamed constructor defined in this class
    */
   ConstructorElement get unnamedConstructor;
-  
+
   /**
    * Return {@code true} if this class or its superclass declares a non-final instance field.
    * @return {@code true} if this class or its superclass declares a non-final instance field
    */
   bool hasNonFinalField();
-  
+
   /**
    * Return {@code true} if this class has reference to super (so, for example, cannot be used as a
    * mixin).
    * @return {@code true} if this class has reference to super
    */
   bool hasReferenceToSuper();
-  
+
   /**
    * Return {@code true} if this class is abstract. A class is abstract if it has an explicit{@code abstract} modifier. Note, that this definition of <i>abstract</i> is different from
    * <i>has unimplemented members</i>.
    * @return {@code true} if this class is abstract
    */
   bool isAbstract();
-  
+
   /**
    * Return {@code true} if this class is defined by a typedef construct.
    * @return {@code true} if this class is defined by a typedef construct
    */
   bool isTypedef();
-  
+
   /**
    * Return {@code true} if this class can validly be used as a mixin when defining another class.
    * The behavior of this method is defined by the Dart Language Specification in section 9:
@@ -193,7 +188,7 @@
    * @return {@code true} if this class can validly be used as a mixin
    */
   bool isValidMixin();
-  
+
   /**
    * Return the element representing the getter that results from looking up the given getter in
    * this class with respect to the given library, or {@code null} if the look up fails. The
@@ -214,7 +209,7 @@
    * library
    */
   PropertyAccessorElement lookUpGetter(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 {@code null} if the look up fails. The
@@ -234,7 +229,7 @@
    * library
    */
   MethodElement lookUpMethod(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 {@code null} if the look up fails. The
@@ -256,45 +251,44 @@
    */
   PropertyAccessorElement lookUpSetter(String setterName, LibraryElement library);
 }
-
 /**
  * The interface {@code CompilationUnitElement} defines the behavior of elements representing a
  * compilation unit.
  * @coverage dart.engine.element
  */
 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 the library in which this compilation unit is defined.
    * @return the library in which this compilation unit is defined
    */
   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 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 {@code null} if
    * this compilation unit does not define a class with the given name.
@@ -302,46 +296,44 @@
    * @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;
 }
-
 /**
  * The interface {@code ConstructorElement} defines the behavior of elements representing a
  * constructor or a factory method defined within a type.
  * @coverage dart.engine.element
  */
 abstract class ConstructorElement implements ExecutableElement {
-  
+
   /**
    * Return the type in which this constructor is defined.
    * @return the type in which this constructor is defined
    */
   ClassElement get enclosingElement;
-  
+
   /**
    * Return the constructor to which this constructor is redirecting.
    * @return the constructor to which this constructor is redirecting
    */
   ConstructorElement get redirectedConstructor;
-  
+
   /**
    * Return {@code true} if this constructor is a const constructor.
    * @return {@code true} if this constructor is a const constructor
    */
   bool isConst();
-  
+
   /**
    * Return {@code true} if this constructor represents a factory constructor.
    * @return {@code true} if this constructor represents a factory constructor
    */
   bool isFactory();
 }
-
 /**
  * The interface {@code 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
@@ -364,20 +356,20 @@
  * @coverage dart.engine.element
  */
 abstract class Element {
-  
+
   /**
    * 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 Comparator<Element> SORT_BY_OFFSET = (Element firstElement, Element secondElement) => firstElement.nameOffset - secondElement.nameOffset;
-  
+  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 {@code null} if this element does not
@@ -388,20 +380,20 @@
    * analysis could not be performed
    */
   String computeDocumentationComment();
-  
+
   /**
    * Return the element of the given class that most immediately encloses this element, or{@code 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(Type elementClass);
-  
+
   /**
    * 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 {@code null} if this element does not have a name.
    * <p>
@@ -410,20 +402,20 @@
    * @return the display name of this element
    */
   String get displayName;
-  
+
   /**
    * Return the element that either physically or logically encloses this element. This will be{@code 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 {@code null} if this element is an HTML file because HTML files
@@ -431,26 +423,26 @@
    * @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.
    * @return the metadata associated with this element
    */
   List<Annotation> get metadata;
-  
+
   /**
    * Return the name of this element, or {@code 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 {@code -1} if this element is synthetic, does not have a name, or otherwise does
@@ -458,14 +450,14 @@
    * @return the offset of the name of this element
    */
   int get nameOffset;
-  
+
   /**
    * Return the source that contains this element, or {@code null} if this element is not contained
    * in a source.
    * @return the source that contains this element
    */
   Source get source;
-  
+
   /**
    * Return {@code 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:
@@ -475,7 +467,7 @@
    * @return {@code true} if this element is accessible to code in the given library
    */
   bool isAccessibleIn(LibraryElement library);
-  
+
   /**
    * Return {@code 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
@@ -483,7 +475,7 @@
    * @return {@code true} if this element is synthetic
    */
   bool 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.
@@ -491,7 +483,6 @@
    */
   void visitChildren(ElementVisitor<Object> visitor);
 }
-
 /**
  * The enumeration {@code ElementKind} defines the various kinds of elements in the element model.
  * @coverage dart.engine.element
@@ -523,13 +514,13 @@
   static final ElementKind TYPE_VARIABLE = new ElementKind('TYPE_VARIABLE', 23, "type variable");
   static final ElementKind UNIVERSE = new ElementKind('UNIVERSE', 24, "<universe>");
   static final List<ElementKind> values = [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, PREFIX, SETTER, TOP_LEVEL_VARIABLE, FUNCTION_TYPE_ALIAS, TYPE_VARIABLE, UNIVERSE];
-  
+
   /// The name of this enum constant, as declared in the enum declaration.
   final String name;
-  
+
   /// The position in the enum declaration.
   final int ordinal;
-  
+
   /**
    * Return the kind of the given element, or {@link #ERROR} if the element is {@code null}. This is
    * a utility method that can reduce the need for null checks in other places.
@@ -542,12 +533,12 @@
     }
     return element.kind;
   }
-  
+
   /**
    * The name displayed in the UI for this kind of element.
    */
   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
@@ -555,7 +546,7 @@
   ElementKind(this.name, this.ordinal, String displayName) {
     this._displayName = displayName;
   }
-  
+
   /**
    * Return the name displayed in the UI for this kind of element.
    * @return the name of this {@link ElementKind} to display in UI.
@@ -564,14 +555,13 @@
   int compareTo(ElementKind other) => ordinal - other.ordinal;
   String toString() => name;
 }
-
 /**
  * The interface {@code ElementLocation} defines the behavior of objects that represent the location
  * of an element within the element model.
  * @coverage dart.engine.element
  */
 abstract class ElementLocation {
-  
+
   /**
    * Return an encoded representation of this location that can be used to create a location that is
    * equal to this location.
@@ -579,7 +569,6 @@
    */
   String get encoding;
 }
-
 /**
  * The interface {@code ElementVisitor} defines the behavior of objects that can be used to visit an
  * element structure.
@@ -609,58 +598,56 @@
   R visitTopLevelVariableElement(TopLevelVariableElement element);
   R visitTypeVariableElement(TypeVariableElement element);
 }
-
 /**
  * The interface {@code EmbeddedHtmlScriptElement} defines the behavior of elements representing a
  * script tag in an HTML file having content that defines a Dart library.
  * @coverage dart.engine.element
  */
 abstract class EmbeddedHtmlScriptElement implements HtmlScriptElement {
-  
+
   /**
    * Return the library element defined by the content of the script tag.
    * @return the library element (not {@code null})
    */
   LibraryElement get scriptLibrary;
 }
-
 /**
  * The interface {@code ExecutableElement} defines the behavior of elements representing an
  * executable object, including functions, methods, constructors, getters, and setters.
  * @coverage dart.engine.element
  */
 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 type of function defined by this executable element.
    * @return the type of function defined by this executable element
    */
   FunctionType get type;
-  
+
   /**
    * Return {@code 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
@@ -668,7 +655,7 @@
    * @return {@code true} if this executable element is an operator
    */
   bool isOperator();
-  
+
   /**
    * Return {@code 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.
@@ -676,33 +663,31 @@
    */
   bool isStatic();
 }
-
 /**
  * The interface {@code ExportElement} defines the behavior of objects representing information
  * about a single export directive within a library.
  * @coverage dart.engine.element
  */
 abstract class ExportElement implements Element, UriReferencedElement {
-  
+
   /**
    * An empty array of export elements.
    */
-  static List<ExportElement> EMPTY_ARRAY = new List<ExportElement>(0);
-  
+  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 {@code ExternalHtmlScriptElement} defines the behavior of elements representing a
  * script tag in an HTML file having a {@code source} attribute that references a Dart library
@@ -710,7 +695,7 @@
  * @coverage dart.engine.element
  */
 abstract class ExternalHtmlScriptElement implements HtmlScriptElement {
-  
+
   /**
    * Return the source referenced by this element, or {@code null} if this element does not
    * reference a Dart library source file.
@@ -718,27 +703,25 @@
    */
   Source get scriptSource;
 }
-
 /**
  * The interface {@code FieldElement} defines the behavior of elements representing a field defined
  * within a type.
  * @coverage dart.engine.element
  */
 abstract class FieldElement implements PropertyInducingElement {
-  
+
   /**
    * Return the type in which this field is defined.
    * @return the type in which this field is defined
    */
   ClassElement get enclosingElement;
 }
-
 /**
  * The interface {@code 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 {@code null} if the
    * parameter references a field that doesn't exist.
@@ -746,53 +729,50 @@
    */
   FieldElement get field;
 }
-
 /**
  * The interface {@code FunctionElement} defines the behavior of elements representing a function.
  * @coverage dart.engine.element
  */
 abstract class FunctionElement implements ExecutableElement, LocalElement {
 }
-
 /**
  * The interface {@code FunctionTypeAliasElement} defines the behavior of elements representing a
  * function type alias ({@code typedef}).
  * @coverage dart.engine.element
  */
 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
    */
   CompilationUnitElement get enclosingElement;
-  
+
   /**
    * 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 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 variables defined for this type.
    * @return the type variables defined for this type
    */
   List<TypeVariableElement> get typeVariables;
 }
-
 /**
  * The interface {@code HideCombinator} defines the behavior of combinators that cause some of the
  * names in a namespace to be hidden when being imported.
  * @coverage dart.engine.element
  */
 abstract class HideCombinator 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.
@@ -800,13 +780,12 @@
    */
   List<String> get hiddenNames;
 }
-
 /**
  * The interface {@code HtmlElement} defines the behavior of elements representing an HTML file.
  * @coverage dart.engine.element
  */
 abstract class HtmlElement implements Element {
-  
+
   /**
    * 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
@@ -815,7 +794,6 @@
    */
   List<HtmlScriptElement> get scripts;
 }
-
 /**
  * The interface {@code HtmlScriptElement} defines the behavior of elements representing a script
  * tag in an HTML file.
@@ -825,32 +803,31 @@
  */
 abstract class HtmlScriptElement implements Element {
 }
-
 /**
  * The interface {@code ImportElement} defines the behavior of objects representing information
  * about a single import directive within a library.
  * @coverage dart.engine.element
  */
 abstract class ImportElement implements Element, UriReferencedElement {
-  
+
   /**
    * An empty array of import elements.
    */
-  static List<ImportElement> EMPTY_ARRAY = new List<ImportElement>(0);
-  
+  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 {@code null} if there
    * was no prefix specified.
@@ -858,52 +835,50 @@
    */
   PrefixElement get prefix;
 }
-
 /**
  * The interface {@code LabelElement} defines the behavior of elements representing a label
  * associated with a statement.
  * @coverage dart.engine.element
  */
 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
    */
   ExecutableElement get enclosingElement;
 }
-
 /**
  * The interface {@code LibraryElement} defines the behavior of elements representing a library.
  * @coverage dart.engine.element
  */
 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 {@code 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{@code 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
@@ -911,27 +886,27 @@
    * @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 compilation units that are included in this library using
    * a {@code part} directive. This does not include the defining compilation unit that contains the{@code 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 {@code import} libraries
    * into this library. Each prefix can be used in more than one {@code import} directive.
    * @return the prefixes used to {@code import} libraries into this library
    */
   List<PrefixElement> get prefixes;
-  
+
   /**
    * Return the class defined in this library that has the given name, or {@code null} if this
    * library does not define a class with the given name.
@@ -939,19 +914,19 @@
    * @return the class with the given name that is defined in this library
    */
   ClassElement getType(String className);
-  
+
   /**
    * Answer {@code true} if this library is an application that can be run in the browser.
    * @return {@code true} if this library is an application that can be run in the browser
    */
   bool isBrowserApplication();
-  
+
   /**
    * Return {@code true} if this library is the dart:core library.
    * @return {@code true} if this library is the dart:core library
    */
   bool isDartCore();
-  
+
   /**
    * Return {@code 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.
@@ -960,14 +935,13 @@
    */
   bool isUpToDate2(int timeStamp);
 }
-
 /**
  * The interface {@code LocalElement} defines the behavior of elements that can be (but are not
  * required to be) defined within a method or function (an {@link ExecutableElement}).
  * @coverage dart.engine.element
  */
 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 {@code null} if there is no single range of characters within which
@@ -986,7 +960,6 @@
    */
   SourceRange get visibleRange;
 }
-
 /**
  * The interface {@code LocalVariableElement} defines the behavior common to elements that represent
  * a local variable.
@@ -994,20 +967,19 @@
  */
 abstract class LocalVariableElement implements LocalElement, VariableElement {
 }
-
 /**
  * The interface {@code MethodElement} defines the behavior of elements that represent a method
  * defined within a type.
  * @coverage dart.engine.element
  */
 abstract class MethodElement implements ExecutableElement {
-  
+
   /**
    * Return the type in which this method is defined.
    * @return the type in which this method is defined
    */
   ClassElement get enclosingElement;
-  
+
   /**
    * Return {@code true} if this method is abstract. Methods are abstract if they are not external
    * and have no body.
@@ -1015,7 +987,6 @@
    */
   bool isAbstract();
 }
-
 /**
  * The interface {@code MultiplyDefinedElement} defines the behavior of pseudo-elements that
  * represent multiple elements defined within a single scope that have the same name. This situation
@@ -1025,7 +996,7 @@
  * @coverage dart.engine.element
  */
 abstract class MultiplyDefinedElement implements Element {
-  
+
   /**
    * Return an array containing all of the elements that were defined within the scope to have the
    * same name.
@@ -1033,67 +1004,63 @@
    */
   List<Element> get conflictingElements;
 }
-
 /**
  * The interface {@code NamespaceCombinator} defines the behavior common to objects that control how
  * namespaces are combined.
  * @coverage dart.engine.element
  */
 abstract class NamespaceCombinator {
-  
+
   /**
    * An empty array of namespace combinators.
    */
-  static List<NamespaceCombinator> EMPTY_ARRAY = new List<NamespaceCombinator>(0);
+  static final List<NamespaceCombinator> EMPTY_ARRAY = new List<NamespaceCombinator>(0);
 }
-
 /**
  * The interface {@code ParameterElement} defines the behavior of elements representing a parameter
  * defined within an executable element.
  * @coverage dart.engine.element
  */
 abstract class ParameterElement implements LocalElement, VariableElement {
-  
+
   /**
    * 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 {@code true} if this parameter is an initializing formal parameter.
    * @return {@code true} if this parameter is an initializing formal parameter
    */
   bool isInitializingFormal();
 }
-
 /**
  * The interface {@code PrefixElement} defines the behavior common to elements that represent a
  * prefix used to import one or more libraries into another library.
  * @coverage dart.engine.element
  */
 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
    */
   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 {@code PropertyAccessorElement} defines the behavior of elements representing a
  * getter or a setter. Note that explicitly defined property accessors implicitly define a synthetic
@@ -1110,7 +1077,7 @@
  * @coverage dart.engine.element
  */
 abstract class PropertyAccessorElement implements ExecutableElement {
-  
+
   /**
    * Return the accessor representing the getter that corresponds to (has the same name as) this
    * setter, or {@code null} if this accessor is not a setter or if there is no corresponding
@@ -1118,7 +1085,7 @@
    * @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 {@code null} if this accessor is not a getter or if there is no corresponding
@@ -1126,34 +1093,33 @@
    * @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 {@code true} if this accessor is abstract. Accessors are abstract if they are not
    * external and have no body.
    * @return {@code true} if this accessor is abstract
    */
   bool isAbstract();
-  
+
   /**
    * Return {@code true} if this accessor represents a getter.
    * @return {@code true} if this accessor represents a getter
    */
   bool isGetter();
-  
+
   /**
    * Return {@code true} if this accessor represents a setter.
    * @return {@code true} if this accessor represents a setter
    */
   bool isSetter();
 }
-
 /**
  * The interface {@code PropertyInducingElement} defines the behavior of elements representing a
  * variable that has an associated getter and possibly a setter. Note that explicitly defined
@@ -1171,14 +1137,14 @@
  * @coverage dart.engine.element
  */
 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 {@code null} if the variable is effectively{@code final} and therefore does not have a setter associated with it. (This can happen either
    * because the variable is explicitly defined as being {@code final} or because the variable is
@@ -1187,7 +1153,7 @@
    * @return the setter associated with this variable
    */
   PropertyAccessorElement get setter;
-  
+
   /**
    * Return {@code 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.
@@ -1195,14 +1161,13 @@
    */
   bool isStatic();
 }
-
 /**
  * The interface {@code ShowCombinator} defines the behavior of combinators that cause some of the
  * names in a namespace to be visible (and the rest hidden) when being imported.
  * @coverage dart.engine.element
  */
 abstract class ShowCombinator implements NamespaceCombinator {
-  
+
   /**
    * Return an array containing the names that are to be made visible in the importing library if
    * they are defined in the imported library.
@@ -1210,7 +1175,6 @@
    */
   List<String> get shownNames;
 }
-
 /**
  * The interface {@code TopLevelVariableElement} defines the behavior of elements representing a
  * top-level variable.
@@ -1218,28 +1182,26 @@
  */
 abstract class TopLevelVariableElement implements PropertyInducingElement {
 }
-
 /**
  * The interface {@code TypeVariableElement} defines the behavior of elements representing a type
  * variable.
  * @coverage dart.engine.element
  */
 abstract class TypeVariableElement implements Element {
-  
+
   /**
    * Return the type representing the bound associated with this variable, or {@code null} if this
    * variable does not have an explicit bound.
    * @return the type representing the bound associated with this variable
    */
   Type2 get bound;
-  
+
   /**
    * Return the type defined by this type variable.
    * @return the type defined by this type variable
    */
   TypeVariableType get type;
 }
-
 /**
  * The interface {@code UndefinedElement} defines the behavior of pseudo-elements that represent
  * names that are undefined. This situation is not allowed by the language, so objects implementing
@@ -1249,28 +1211,26 @@
  */
 abstract class UndefinedElement implements Element {
 }
-
 /**
  * The interface {@code UriReferencedElement} defines the behavior of objects included into a
  * library using some URI.
  * @coverage dart.engine.element
  */
 abstract class UriReferencedElement implements Element {
-  
+
   /**
    * Return the URI that is used to include this element into the enclosing library, or {@code 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 {@code VariableElement} defines the behavior common to elements that represent a
  * variable.
  * @coverage dart.engine.element
  */
 abstract class VariableElement implements Element {
-  
+
   /**
    * Return a synthetic function representing this variable's initializer, or {@code null} if this
    * variable does not have an initializer. The function will have no parameters. The return type of
@@ -1278,20 +1238,20 @@
    * @return a synthetic function representing this variable's initializer
    */
   FunctionElement get initializer;
-  
+
   /**
    * Return the declared type of this variable, or {@code 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
    */
   Type2 get type;
-  
+
   /**
    * Return {@code true} if this variable was declared with the 'const' modifier.
    * @return {@code true} if this variable was declared with the 'const' modifier
    */
   bool isConst();
-  
+
   /**
    * Return {@code true} if this variable was declared with the 'final' modifier. Variables that are
    * declared with the 'const' modifier will return {@code false} even though they are implicitly
@@ -1300,7 +1260,6 @@
    */
   bool isFinal();
 }
-
 /**
  * Instances of the class {@code GeneralizingElementVisitor} implement an element visitor that will
  * recursively visit all of the elements in an element model (like instances of the class{@link RecursiveElementVisitor}). In addition, when an element of a specific type is visited not
@@ -1394,7 +1353,6 @@
   R visitTypeVariableElement(TypeVariableElement element) => visitElement(element);
   R visitVariableElement(VariableElement element) => visitElement(element);
 }
-
 /**
  * Instances of the class {@code RecursiveElementVisitor} implement an element visitor that will
  * recursively visit all of the element in an element model. For example, using an instance of this
@@ -1496,7 +1454,6 @@
     return null;
   }
 }
-
 /**
  * Instances of the class {@code 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
@@ -1528,23 +1485,22 @@
   R visitTopLevelVariableElement(TopLevelVariableElement element) => null;
   R visitTypeVariableElement(TypeVariableElement element) => null;
 }
-
 /**
  * Instances of the class {@code AnnotationImpl} implement an {@link Annotation}.
  * @coverage dart.engine.element
  */
 class AnnotationImpl implements Annotation {
-  
+
   /**
    * The element representing the field, variable, or constructor being used as an annotation.
    */
   Element _element;
-  
+
   /**
    * An empty array of annotations.
    */
   static List<AnnotationImpl> EMPTY_ARRAY = new List<AnnotationImpl>(0);
-  
+
   /**
    * Initialize a newly created annotation.
    * @param element the element representing the field, variable, or constructor being used as an
@@ -1556,64 +1512,63 @@
   Element get element => _element;
   String toString() => "@${_element.toString()}";
 }
-
 /**
  * Instances of the class {@code ClassElementImpl} implement a {@code ClassElement}.
  * @coverage dart.engine.element
  */
 class ClassElementImpl extends ElementImpl implements ClassElement {
-  
+
   /**
    * An array containing all of the accessors (getters and setters) contained in this class.
    */
   List<PropertyAccessorElement> _accessors = PropertyAccessorElementImpl.EMPTY_ARRAY;
-  
+
   /**
    * An array containing all of the constructors contained in this class.
    */
   List<ConstructorElement> _constructors = ConstructorElementImpl.EMPTY_ARRAY;
-  
+
   /**
    * An array containing all of the fields contained in this class.
    */
   List<FieldElement> _fields = FieldElementImpl.EMPTY_ARRAY;
-  
+
   /**
    * An array containing all of the mixins that are applied to the class being extended in order to
    * derive the superclass of this class.
    */
   List<InterfaceType> _mixins = InterfaceTypeImpl.EMPTY_ARRAY;
-  
+
   /**
    * An array containing all of the interfaces that are implemented by this class.
    */
   List<InterfaceType> _interfaces = InterfaceTypeImpl.EMPTY_ARRAY;
-  
+
   /**
    * An array containing all of the methods contained in this class.
    */
   List<MethodElement> _methods = MethodElementImpl.EMPTY_ARRAY;
-  
+
   /**
    * The superclass of the class, or {@code null} if the class does not have an explicit superclass.
    */
   InterfaceType _supertype;
-  
+
   /**
    * The type defined by the class.
    */
   InterfaceType _type;
-  
+
   /**
    * An array containing all of the type variables defined for this class.
    */
   List<TypeVariableElement> _typeVariables = TypeVariableElementImpl.EMPTY_ARRAY;
-  
+
   /**
    * An empty array of type elements.
    */
   static List<ClassElement> EMPTY_ARRAY = new List<ClassElement>(0);
-  
+
   /**
    * Initialize a newly created class element to have the given name.
    * @param name the name of this element
@@ -1656,7 +1611,7 @@
     return null;
   }
   List<ConstructorElement> get constructors => _constructors;
-  
+
   /**
    * Given some name, this returns the {@link FieldElement} with the matching name, if there is no
    * such field, then {@code null} is returned.
@@ -1833,7 +1788,7 @@
     }
     return null;
   }
-  
+
   /**
    * Set whether this class is abstract to correspond to the given value.
    * @param isAbstract {@code true} if the class is abstract
@@ -1841,7 +1796,7 @@
   void set abstract(bool isAbstract) {
     setModifier(Modifier.ABSTRACT, isAbstract);
   }
-  
+
   /**
    * Set the accessors contained in this class to the given accessors.
    * @param accessors the accessors contained in this class
@@ -1852,7 +1807,7 @@
     }
     this._accessors = accessors2;
   }
-  
+
   /**
    * Set the constructors contained in this class to the given constructors.
    * @param constructors the constructors contained in this class
@@ -1863,7 +1818,7 @@
     }
     this._constructors = constructors2;
   }
-  
+
   /**
    * Set the fields contained in this class to the given fields.
    * @param fields the fields contained in this class
@@ -1874,7 +1829,7 @@
     }
     this._fields = fields2;
   }
-  
+
   /**
    * Set whether this class references 'super' to the given value.
    * @param isReferencedSuper {@code true} references 'super'
@@ -1882,7 +1837,7 @@
   void set hasReferenceToSuper2(bool isReferencedSuper) {
     setModifier(Modifier.REFERENCES_SUPER, isReferencedSuper);
   }
-  
+
   /**
    * Set the interfaces that are implemented by this class to the given types.
    * @param the interfaces that are implemented by this class
@@ -1890,7 +1845,7 @@
   void set interfaces(List<InterfaceType> interfaces2) {
     this._interfaces = interfaces2;
   }
-  
+
   /**
    * Set the methods contained in this class to the given methods.
    * @param methods the methods contained in this class
@@ -1901,7 +1856,7 @@
     }
     this._methods = methods2;
   }
-  
+
   /**
    * Set the mixins that are applied to the class being extended in order to derive the superclass
    * of this class to the given types.
@@ -1910,7 +1865,7 @@
   void set mixins(List<InterfaceType> mixins2) {
     this._mixins = mixins2;
   }
-  
+
   /**
    * Set the superclass of the class to the given type.
    * @param supertype the superclass of the class
@@ -1918,7 +1873,7 @@
   void set supertype(InterfaceType supertype2) {
     this._supertype = supertype2;
   }
-  
+
   /**
    * Set the type defined by the class to the given type.
    * @param type the type defined by the class
@@ -1926,7 +1881,7 @@
   void set type(InterfaceType type2) {
     this._type = type2;
   }
-  
+
   /**
    * Set whether this class is defined by a typedef construct to correspond to the given value.
    * @param isTypedef {@code true} if the class is defined by a typedef construct
@@ -1934,7 +1889,7 @@
   void set typedef(bool isTypedef) {
     setModifier(Modifier.TYPEDEF, isTypedef);
   }
-  
+
   /**
    * Set the type variables defined for this class to the given type variables.
    * @param typeVariables the type variables defined for this class
@@ -1945,7 +1900,7 @@
     }
     this._typeVariables = typeVariables2;
   }
-  
+
   /**
    * Set whether this class is a valid mixin to correspond to the given value.
    * @param isValidMixin {@code true} if this class can be used as a mixin
@@ -2009,55 +1964,54 @@
     }
   }
 }
-
 /**
  * Instances of the class {@code CompilationUnitElementImpl} implement a{@link CompilationUnitElement}.
  * @coverage dart.engine.element
  */
 class CompilationUnitElementImpl extends ElementImpl implements CompilationUnitElement {
-  
+
   /**
    * An empty array of compilation unit elements.
    */
   static List<CompilationUnitElement> EMPTY_ARRAY = new List<CompilationUnitElement>(0);
-  
+
   /**
    * An array containing all of the top-level accessors (getters and setters) contained in this
    * compilation unit.
    */
   List<PropertyAccessorElement> _accessors = PropertyAccessorElementImpl.EMPTY_ARRAY;
-  
+
   /**
    * An array containing all of the top-level functions contained in this compilation unit.
    */
   List<FunctionElement> _functions = FunctionElementImpl.EMPTY_ARRAY;
-  
+
   /**
    * An array containing all of the variables contained in this compilation unit.
    */
   List<TopLevelVariableElement> _variables = TopLevelVariableElementImpl.EMPTY_ARRAY;
-  
+
   /**
    * The source that corresponds to this compilation unit.
    */
   Source _source;
-  
+
   /**
    * An array containing all of the function type aliases contained in this compilation unit.
    */
   List<FunctionTypeAliasElement> _typeAliases = FunctionTypeAliasElementImpl.EMPTY_ARRAY;
-  
+
   /**
    * An array containing all of the types contained in this compilation unit.
    */
   List<ClassElement> _types = ClassElementImpl.EMPTY_ARRAY;
-  
+
   /**
    * The URI that is specified by the "part" directive in the enclosing library, or {@code null} if
    * this is the defining compilation unit of a library.
    */
   String _uri;
-  
+
   /**
    * Initialize a newly created compilation unit element to have the given name.
    * @param name the name of this element
@@ -2113,7 +2067,7 @@
   List<ClassElement> get types => _types;
   String get uri => _uri;
   int get hashCode => _source.hashCode;
-  
+
   /**
    * Set the top-level accessors (getters and setters) contained in this compilation unit to the
    * given accessors.
@@ -2125,7 +2079,7 @@
     }
     this._accessors = accessors2;
   }
-  
+
   /**
    * Set the top-level functions contained in this compilation unit to the given functions.
    * @param functions the top-level functions contained in this compilation unit
@@ -2136,7 +2090,7 @@
     }
     this._functions = functions2;
   }
-  
+
   /**
    * Set the source that corresponds to this compilation unit to the given source.
    * @param source the source that corresponds to this compilation unit
@@ -2144,7 +2098,7 @@
   void set source(Source source2) {
     this._source = source2;
   }
-  
+
   /**
    * Set the top-level variables contained in this compilation unit to the given variables.
    * @param variables the top-level variables contained in this compilation unit
@@ -2155,7 +2109,7 @@
     }
     this._variables = variables2;
   }
-  
+
   /**
    * Set the function type aliases contained in this compilation unit to the given type aliases.
    * @param typeAliases the function type aliases contained in this compilation unit
@@ -2166,7 +2120,7 @@
     }
     this._typeAliases = typeAliases2;
   }
-  
+
   /**
    * Set the types contained in this compilation unit to the given types.
    * @param types types contained in this compilation unit
@@ -2177,7 +2131,7 @@
     }
     this._types = types2;
   }
-  
+
   /**
    * Set the URI that is specified by the "part" directive in the enclosing library.
    * @param uri the URI that is specified by the "part" directive in the enclosing library.
@@ -2201,18 +2155,17 @@
     }
   }
 }
-
 /**
  * Instances of the class {@code ConstFieldElementImpl} implement a {@code FieldElement} for a
  * 'const' field that has an initializer.
  */
 class ConstFieldElementImpl extends FieldElementImpl {
-  
+
   /**
    * The result of evaluating this variable's initializer.
    */
   EvaluationResultImpl _result;
-  
+
   /**
    * Initialize a newly created field element to have the given name.
    * @param name the name of this element
@@ -2224,18 +2177,17 @@
     this._result = result2;
   }
 }
-
 /**
  * Instances of the class {@code ConstLocalVariableElementImpl} implement a{@code LocalVariableElement} for a local 'const' variable that has an initializer.
  * @coverage dart.engine.element
  */
 class ConstLocalVariableElementImpl extends LocalVariableElementImpl {
-  
+
   /**
    * The result of evaluating this variable's initializer.
    */
   EvaluationResultImpl _result;
-  
+
   /**
    * Initialize a newly created local variable element to have the given name.
    * @param name the name of this element
@@ -2247,19 +2199,18 @@
     this._result = result2;
   }
 }
-
 /**
  * Instances of the class {@code ConstParameterElementImpl} implement a {@code ParameterElement} for
  * a 'const' parameter that has an initializer.
  * @coverage dart.engine.element
  */
 class ConstParameterElementImpl extends ParameterElementImpl {
-  
+
   /**
    * The result of evaluating this variable's initializer.
    */
   EvaluationResultImpl _result;
-  
+
   /**
    * Initialize a newly created parameter element to have the given name.
    * @param name the name of this element
@@ -2271,17 +2222,16 @@
     this._result = result2;
   }
 }
-
 /**
  * Instances of the class {@code ConstTopLevelVariableElementImpl} implement a{@code TopLevelVariableElement} for a top-level 'const' variable that has an initializer.
  */
 class ConstTopLevelVariableElementImpl extends TopLevelVariableElementImpl {
-  
+
   /**
    * The result of evaluating this variable's initializer.
    */
   EvaluationResultImpl _result;
-  
+
   /**
    * Initialize a newly created top-level variable element to have the given name.
    * @param name the name of this element
@@ -2293,23 +2243,22 @@
     this._result = result2;
   }
 }
-
 /**
  * Instances of the class {@code ConstructorElementImpl} implement a {@code ConstructorElement}.
  * @coverage dart.engine.element
  */
 class ConstructorElementImpl extends ExecutableElementImpl implements ConstructorElement {
-  
+
   /**
    * An empty array of constructor elements.
    */
   static List<ConstructorElement> EMPTY_ARRAY = new List<ConstructorElement>(0);
-  
+
   /**
    * The constructor to which this constructor is redirecting.
    */
   ConstructorElement _redirectedConstructor;
-  
+
   /**
    * Initialize a newly created constructor element to have the given name.
    * @param name the name of this element
@@ -2323,7 +2272,7 @@
   bool isConst() => hasModifier(Modifier.CONST);
   bool isFactory() => hasModifier(Modifier.FACTORY);
   bool isStatic() => false;
-  
+
   /**
    * Set whether this constructor represents a 'const' constructor to the given value.
    * @param isConst {@code true} if this constructor represents a 'const' constructor
@@ -2331,7 +2280,7 @@
   void set const2(bool isConst) {
     setModifier(Modifier.CONST, isConst);
   }
-  
+
   /**
    * Set whether this constructor represents a factory method to the given value.
    * @param isFactory {@code true} if this constructor represents a factory method
@@ -2339,7 +2288,7 @@
   void set factory(bool isFactory) {
     setModifier(Modifier.FACTORY, isFactory);
   }
-  
+
   /**
    * Sets the constructor to which this constructor is redirecting.
    * @param redirectedConstructor the constructor to which this constructor is redirecting
@@ -2357,25 +2306,24 @@
     super.appendTo(builder);
   }
 }
-
 /**
  * Instances of the class {@code DynamicElementImpl} represent the synthetic element representing
  * the declaration of the type {@code dynamic}.
  * @coverage dart.engine.element
  */
 class DynamicElementImpl extends ElementImpl {
-  
+
   /**
    * Return the unique instance of this class.
    * @return the unique instance of this class
    */
   static DynamicElementImpl get instance => DynamicTypeImpl.instance.element as DynamicElementImpl;
-  
+
   /**
    * The type defined by this element.
    */
   DynamicTypeImpl _type;
-  
+
   /**
    * Initialize a newly created instance of this class. Instances of this class should <b>not</b> be
    * created except as part of creating the type associated with this element. The single instance
@@ -2386,13 +2334,13 @@
   }
   accept(ElementVisitor visitor) => null;
   ElementKind get kind => ElementKind.DYNAMIC;
-  
+
   /**
    * Return the type defined by this element.
    * @return the type defined by this element
    */
   DynamicTypeImpl get type => _type;
-  
+
   /**
    * Set the type defined by this element to the given type.
    * @param type the type defined by this element
@@ -2401,57 +2349,56 @@
     this._type = type2;
   }
 }
-
 /**
  * The abstract class {@code ElementImpl} implements the behavior common to objects that implement
  * an {@link Element}.
  * @coverage dart.engine.element
  */
 abstract class ElementImpl implements Element {
-  
+
   /**
    * The enclosing element of this element, or {@code null} if this element is at the root of the
    * element structure.
    */
   ElementImpl _enclosingElement;
-  
+
   /**
    * The name of this element.
    */
   String _name;
-  
+
   /**
    * The offset of the name of this element in the file that contains the declaration of this
    * element.
    */
   int _nameOffset = 0;
-  
+
   /**
    * A bit-encoded form of the modifiers associated with this element.
    */
   Set<Modifier> _modifiers;
-  
+
   /**
    * An array containing all of the metadata associated with this element.
    */
   List<Annotation> _metadata = AnnotationImpl.EMPTY_ARRAY;
-  
+
   /**
    * A cached copy of the calculated hashCode for this element.
    */
   int _cachedHashCode = 0;
-  
+
   /**
    * Initialize a newly created element to have the given name.
    * @param name the name of this element
    */
   ElementImpl.con1(Identifier name2) {
-    _jtd_constructor_193_impl(name2);
+    _jtd_constructor_194_impl(name2);
   }
-  _jtd_constructor_193_impl(Identifier name2) {
-    _jtd_constructor_194_impl(name2 == null ? "" : name2.name, name2 == null ? -1 : name2.offset);
+  _jtd_constructor_194_impl(Identifier name2) {
+    _jtd_constructor_195_impl(name2 == null ? "" : name2.name, name2 == null ? -1 : name2.offset);
   }
-  
+
   /**
    * Initialize a newly created element to have the given name.
    * @param name the name of this element
@@ -2459,9 +2406,9 @@
    * declaration of this element
    */
   ElementImpl.con2(String name2, int nameOffset2) {
-    _jtd_constructor_194_impl(name2, nameOffset2);
+    _jtd_constructor_195_impl(name2, nameOffset2);
   }
-  _jtd_constructor_194_impl(String name2, int nameOffset2) {
+  _jtd_constructor_195_impl(String name2, int nameOffset2) {
     this._name = StringUtilities.intern(name2);
     this._nameOffset = nameOffset2;
   }
@@ -2480,7 +2427,7 @@
     }
     return ancestor as Element;
   }
-  
+
   /**
    * Return the child of this element that is uniquely identified by the given identifier, or{@code null} if there is no such child.
    * @param identifier the identifier used to select a child
@@ -2519,7 +2466,7 @@
     return true;
   }
   bool isSynthetic() => hasModifier(Modifier.SYNTHETIC);
-  
+
   /**
    * Set the metadata associate with this element to the given array of annotations.
    * @param metadata the metadata to be associated with this element
@@ -2527,7 +2474,7 @@
   void set metadata(List<Annotation> metadata2) {
     this._metadata = metadata2;
   }
-  
+
   /**
    * Set the offset of the name of this element in the file that contains the declaration of this
    * element to the given value. This is normally done via the constructor, but this method is
@@ -2537,7 +2484,7 @@
   void set nameOffset(int nameOffset2) {
     this._nameOffset = nameOffset2;
   }
-  
+
   /**
    * Set whether this element is synthetic to correspond to the given value.
    * @param isSynthetic {@code true} if the element is synthetic
@@ -2552,7 +2499,7 @@
   }
   void visitChildren(ElementVisitor<Object> visitor) {
   }
-  
+
   /**
    * Append a textual representation of this type to the given builder.
    * @param builder the builder to which the text is to be appended
@@ -2566,21 +2513,21 @@
       builder.append(_name);
     }
   }
-  
+
   /**
    * Return an identifier that uniquely identifies this element among the children of this element's
    * parent.
    * @return an identifier that uniquely identifies this element relative to its parent
    */
   String get identifier => name;
-  
+
   /**
    * Return {@code true} if this element has the given modifier associated with it.
    * @param modifier the modifier being tested for
    * @return {@code true} if this element has the given modifier associated with it
    */
   bool hasModifier(Modifier modifier) => _modifiers != null && _modifiers.contains(modifier);
-  
+
   /**
    * If the given child is not {@code null}, use the given visitor to visit it.
    * @param child the child to be visited
@@ -2591,7 +2538,7 @@
       child.accept(visitor);
     }
   }
-  
+
   /**
    * Use the given visitor to visit all of the children in the given array.
    * @param children the children to be visited
@@ -2604,7 +2551,7 @@
       }
     }
   }
-  
+
   /**
    * Set the enclosing element of this element to the given element.
    * @param element the enclosing element of this element
@@ -2612,7 +2559,7 @@
   void set enclosingElement(ElementImpl element) {
     _enclosingElement = element;
   }
-  
+
   /**
    * Set whether the given modifier is associated with this element to correspond to the given
    * value.
@@ -2635,31 +2582,30 @@
     }
   }
 }
-
 /**
  * Instances of the class {@code ElementLocationImpl} implement an {@link ElementLocation}.
  * @coverage dart.engine.element
  */
 class ElementLocationImpl implements ElementLocation {
-  
+
   /**
    * The path to the element whose location is represented by this object.
    */
   List<String> _components;
-  
+
   /**
    * The character used to separate components in the encoded form.
    */
   static int _SEPARATOR_CHAR = 0x3B;
-  
+
   /**
    * Initialize a newly created location to represent the given element.
    * @param element the element whose location is being represented
    */
   ElementLocationImpl.con1(Element element) {
-    _jtd_constructor_195_impl(element);
+    _jtd_constructor_196_impl(element);
   }
-  _jtd_constructor_195_impl(Element element) {
+  _jtd_constructor_196_impl(Element element) {
     List<String> components = new List<String>();
     Element ancestor = element;
     while (ancestor != null) {
@@ -2668,15 +2614,15 @@
     }
     this._components = new List.from(components);
   }
-  
+
   /**
    * Initialize a newly created location from the given encoded form.
    * @param encoding the encoded form of a location
    */
   ElementLocationImpl.con2(String encoding) {
-    _jtd_constructor_196_impl(encoding);
+    _jtd_constructor_197_impl(encoding);
   }
-  _jtd_constructor_196_impl(String encoding) {
+  _jtd_constructor_197_impl(String encoding) {
     this._components = decode(encoding);
   }
   bool operator ==(Object object) {
@@ -2686,7 +2632,7 @@
     ElementLocationImpl location = object as ElementLocationImpl;
     return JavaArrays.equals(_components, location._components);
   }
-  
+
   /**
    * Return the path to the element whose location is represented by this object.
    * @return the path to the element whose location is represented by this object
@@ -2705,7 +2651,7 @@
   }
   int get hashCode => JavaArrays.makeHashCode(_components);
   String toString() => encoding;
-  
+
   /**
    * Decode the encoded form of a location into an array of components.
    * @param encoding the encoded form of a location
@@ -2737,7 +2683,7 @@
     }
     return new List.from(components);
   }
-  
+
   /**
    * Append an encoded form of the given component to the given builder.
    * @param builder the builder to which the encoded component is to be appended
@@ -2754,18 +2700,17 @@
     }
   }
 }
-
 /**
  * Instances of the class {@code EmbeddedHtmlScriptElementImpl} implement an{@link EmbeddedHtmlScriptElement}.
  * @coverage dart.engine.element
  */
 class EmbeddedHtmlScriptElementImpl extends HtmlScriptElementImpl implements EmbeddedHtmlScriptElement {
-  
+
   /**
    * The library defined by the script tag's content.
    */
   LibraryElement _scriptLibrary;
-  
+
   /**
    * 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 {@code null})
@@ -2775,7 +2720,7 @@
   accept(ElementVisitor visitor) => visitor.visitEmbeddedHtmlScriptElement(this);
   ElementKind get kind => ElementKind.EMBEDDED_HTML_SCRIPT;
   LibraryElement get scriptLibrary => _scriptLibrary;
-  
+
   /**
    * Set the script library defined by the script tag's content.
    * @param scriptLibrary the library or {@code null} if none
@@ -2788,53 +2733,52 @@
     safelyVisitChild(_scriptLibrary, visitor);
   }
 }
-
 /**
  * The abstract class {@code ExecutableElementImpl} implements the behavior common to{@code ExecutableElement}s.
  * @coverage dart.engine.element
  */
 abstract class ExecutableElementImpl extends ElementImpl implements ExecutableElement {
-  
+
   /**
    * An array containing all of the functions defined within this executable element.
    */
   List<FunctionElement> _functions = FunctionElementImpl.EMPTY_ARRAY;
-  
+
   /**
    * An array containing all of the labels defined within this executable element.
    */
   List<LabelElement> _labels = LabelElementImpl.EMPTY_ARRAY;
-  
+
   /**
    * An array containing all of the local variables defined within this executable element.
    */
   List<LocalVariableElement> _localVariables = LocalVariableElementImpl.EMPTY_ARRAY;
-  
+
   /**
    * An array containing all of the parameters defined by this executable element.
    */
   List<ParameterElement> _parameters = ParameterElementImpl.EMPTY_ARRAY;
-  
+
   /**
    * The type of function defined by this executable element.
    */
   FunctionType _type;
-  
+
   /**
    * An empty array of executable elements.
    */
   static List<ExecutableElement> EMPTY_ARRAY = new List<ExecutableElement>(0);
-  
+
   /**
    * Initialize a newly created executable element to have the given name.
    * @param name the name of this element
    */
   ExecutableElementImpl.con1(Identifier name) : super.con1(name) {
-    _jtd_constructor_198_impl(name);
+    _jtd_constructor_199_impl(name);
   }
-  _jtd_constructor_198_impl(Identifier name) {
+  _jtd_constructor_199_impl(Identifier name) {
   }
-  
+
   /**
    * Initialize a newly created executable element to have the given name.
    * @param name the name of this element
@@ -2842,9 +2786,9 @@
    * declaration of this element
    */
   ExecutableElementImpl.con2(String name, int nameOffset) : super.con2(name, nameOffset) {
-    _jtd_constructor_199_impl(name, nameOffset);
+    _jtd_constructor_200_impl(name, nameOffset);
   }
-  _jtd_constructor_199_impl(String name, int nameOffset) {
+  _jtd_constructor_200_impl(String name, int nameOffset) {
   }
   ElementImpl getChild(String identifier2) {
     for (ExecutableElement function in _functions) {
@@ -2875,7 +2819,7 @@
   List<ParameterElement> get parameters => _parameters;
   FunctionType get type => _type;
   bool isOperator() => false;
-  
+
   /**
    * Set the functions defined within this executable element to the given functions.
    * @param functions the functions defined within this executable element
@@ -2886,7 +2830,7 @@
     }
     this._functions = functions2;
   }
-  
+
   /**
    * Set the labels defined within this executable element to the given labels.
    * @param labels the labels defined within this executable element
@@ -2897,7 +2841,7 @@
     }
     this._labels = labels2;
   }
-  
+
   /**
    * Set the local variables defined within this executable element to the given variables.
    * @param localVariables the local variables defined within this executable element
@@ -2908,7 +2852,7 @@
     }
     this._localVariables = localVariables2;
   }
-  
+
   /**
    * Set the parameters defined by this executable element to the given parameters.
    * @param parameters the parameters defined by this executable element
@@ -2919,7 +2863,7 @@
     }
     this._parameters = parameters2;
   }
-  
+
   /**
    * Set the type of function defined by this executable element to the given type.
    * @param type the type of function defined by this executable element
@@ -2950,29 +2894,28 @@
     }
   }
 }
-
 /**
  * Instances of the class {@code ExportElementImpl} implement an {@link ExportElement}.
  * @coverage dart.engine.element
  */
 class ExportElementImpl extends ElementImpl implements ExportElement {
-  
+
   /**
    * The URI that is specified by this directive.
    */
   String _uri;
-  
+
   /**
    * The library that is exported from this library by this export directive.
    */
   LibraryElement _exportedLibrary;
-  
+
   /**
    * The combinators that were specified as part of the export directive in the order in which they
    * were specified.
    */
   List<NamespaceCombinator> _combinators = NamespaceCombinator.EMPTY_ARRAY;
-  
+
   /**
    * Initialize a newly created export element.
    */
@@ -2983,7 +2926,7 @@
   LibraryElement get exportedLibrary => _exportedLibrary;
   ElementKind get kind => ElementKind.EXPORT;
   String get uri => _uri;
-  
+
   /**
    * Set the combinators that were specified as part of the export directive to the given array of
    * combinators.
@@ -2992,7 +2935,7 @@
   void set combinators(List<NamespaceCombinator> combinators2) {
     this._combinators = combinators2;
   }
-  
+
   /**
    * Set the library that is exported from this library by this import directive to the given
    * library.
@@ -3001,7 +2944,7 @@
   void set exportedLibrary(LibraryElement exportedLibrary2) {
     this._exportedLibrary = exportedLibrary2;
   }
-  
+
   /**
    * Set the URI that is specified by this directive.
    * @param uri the URI that is specified by this directive.
@@ -3015,18 +2958,17 @@
   }
   String get identifier => _exportedLibrary.name;
 }
-
 /**
  * Instances of the class {@code ExternalHtmlScriptElementImpl} implement an{@link ExternalHtmlScriptElement}.
  * @coverage dart.engine.element
  */
 class ExternalHtmlScriptElementImpl extends HtmlScriptElementImpl implements ExternalHtmlScriptElement {
-  
+
   /**
    * The source specified in the {@code source} attribute or {@code null} if unspecified.
    */
   Source _scriptSource;
-  
+
   /**
    * 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 {@code null})
@@ -3036,7 +2978,7 @@
   accept(ElementVisitor visitor) => visitor.visitExternalHtmlScriptElement(this);
   ElementKind get kind => ElementKind.EXTERNAL_HTML_SCRIPT;
   Source get scriptSource => _scriptSource;
-  
+
   /**
    * Set the source specified in the {@code source} attribute.
    * @param scriptSource the script source or {@code null} if unspecified
@@ -3045,42 +2987,41 @@
     this._scriptSource = scriptSource2;
   }
 }
-
 /**
  * Instances of the class {@code FieldElementImpl} implement a {@code FieldElement}.
  * @coverage dart.engine.element
  */
 class FieldElementImpl extends PropertyInducingElementImpl implements FieldElement {
-  
+
   /**
    * An empty array of field elements.
    */
   static List<FieldElement> EMPTY_ARRAY = new List<FieldElement>(0);
-  
+
   /**
    * Initialize a newly created field element to have the given name.
    * @param name the name of this element
    */
   FieldElementImpl.con1(Identifier name) : super.con1(name) {
-    _jtd_constructor_202_impl(name);
+    _jtd_constructor_203_impl(name);
   }
-  _jtd_constructor_202_impl(Identifier name) {
+  _jtd_constructor_203_impl(Identifier name) {
   }
-  
+
   /**
    * Initialize a newly created synthetic field element to have the given name.
    * @param name the name of this element
    */
   FieldElementImpl.con2(String name) : super.con2(name) {
-    _jtd_constructor_203_impl(name);
+    _jtd_constructor_204_impl(name);
   }
-  _jtd_constructor_203_impl(String name) {
+  _jtd_constructor_204_impl(String name) {
   }
   accept(ElementVisitor visitor) => visitor.visitFieldElement(this);
   ClassElement get enclosingElement => super.enclosingElement as ClassElement;
   ElementKind get kind => ElementKind.FIELD;
   bool isStatic() => hasModifier(Modifier.STATIC);
-  
+
   /**
    * Set whether this field is static to correspond to the given value.
    * @param isStatic {@code true} if the field is static
@@ -3089,18 +3030,17 @@
     setModifier(Modifier.STATIC, isStatic);
   }
 }
-
 /**
  * Instances of the class {@code FieldFormalParameterElementImpl} extend{@link ParameterElementImpl} to provide the additional information of the {@link FieldElement}associated with the parameter.
  * @coverage dart.engine.element
  */
 class FieldFormalParameterElementImpl extends ParameterElementImpl implements FieldFormalParameterElement {
-  
+
   /**
    * The field associated with this field formal parameter.
    */
   FieldElement _field;
-  
+
   /**
    * Initialize a newly created parameter element to have the given name.
    * @param name the name of this element
@@ -3110,7 +3050,7 @@
   accept(ElementVisitor visitor) => visitor.visitFieldFormalParameterElement(this);
   FieldElement get field => _field;
   bool isInitializingFormal() => true;
-  
+
   /**
    * Set the field element associated with this field formal parameter to the given element.
    * @param field the new field element
@@ -3119,49 +3059,48 @@
     this._field = field2;
   }
 }
-
 /**
  * Instances of the class {@code FunctionElementImpl} implement a {@code FunctionElement}.
  * @coverage dart.engine.element
  */
 class FunctionElementImpl extends ExecutableElementImpl implements FunctionElement {
-  
+
   /**
    * 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 {@code -1} if this element does not have a
    * visible range.
    */
   int _visibleRangeLength = -1;
-  
+
   /**
    * An empty array of function elements.
    */
   static List<FunctionElement> EMPTY_ARRAY = new List<FunctionElement>(0);
-  
+
   /**
    * Initialize a newly created synthetic function element.
    */
   FunctionElementImpl() : super.con2("", -1) {
-    _jtd_constructor_205_impl();
+    _jtd_constructor_206_impl();
   }
-  _jtd_constructor_205_impl() {
+  _jtd_constructor_206_impl() {
     synthetic = true;
   }
-  
+
   /**
    * Initialize a newly created function element to have the given name.
    * @param name the name of this element
    */
   FunctionElementImpl.con1(Identifier name) : super.con1(name) {
-    _jtd_constructor_206_impl(name);
+    _jtd_constructor_207_impl(name);
   }
-  _jtd_constructor_206_impl(Identifier name) {
+  _jtd_constructor_207_impl(Identifier name) {
   }
-  
+
   /**
    * Initialize a newly created function element to have no name and the given offset. This is used
    * for function expressions, which have no name.
@@ -3169,9 +3108,9 @@
    * declaration of this element
    */
   FunctionElementImpl.con2(int nameOffset) : super.con2("", nameOffset) {
-    _jtd_constructor_207_impl(nameOffset);
+    _jtd_constructor_208_impl(nameOffset);
   }
-  _jtd_constructor_207_impl(int nameOffset) {
+  _jtd_constructor_208_impl(int nameOffset) {
   }
   accept(ElementVisitor visitor) => visitor.visitFunctionElement(this);
   String get identifier => name;
@@ -3183,7 +3122,7 @@
     return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
   }
   bool isStatic() => enclosingElement is CompilationUnitElement;
-  
+
   /**
    * Set the visible range for this element to the range starting at the given offset with the given
    * length.
@@ -3203,33 +3142,32 @@
     super.appendTo(builder);
   }
 }
-
 /**
  * Instances of the class {@code FunctionTypeAliasElementImpl} implement a{@code FunctionTypeAliasElement}.
  * @coverage dart.engine.element
  */
 class FunctionTypeAliasElementImpl extends ElementImpl implements FunctionTypeAliasElement {
-  
+
   /**
    * An array containing all of the parameters defined by this type alias.
    */
   List<ParameterElement> _parameters = ParameterElementImpl.EMPTY_ARRAY;
-  
+
   /**
    * The type of function defined by this type alias.
    */
   FunctionType _type;
-  
+
   /**
    * An array containing all of the type variables defined for this type.
    */
   List<TypeVariableElement> _typeVariables = TypeVariableElementImpl.EMPTY_ARRAY;
-  
+
   /**
    * An empty array of type alias elements.
    */
   static List<FunctionTypeAliasElement> EMPTY_ARRAY = new List<FunctionTypeAliasElement>(0);
-  
+
   /**
    * Initialize a newly created type alias element to have the given name.
    * @param name the name of this element
@@ -3255,7 +3193,7 @@
   List<ParameterElement> get parameters => _parameters;
   FunctionType get type => _type;
   List<TypeVariableElement> get typeVariables => _typeVariables;
-  
+
   /**
    * Set the parameters defined by this type alias to the given parameters.
    * @param parameters the parameters defined by this type alias
@@ -3268,7 +3206,7 @@
     }
     this._parameters = parameters2;
   }
-  
+
   /**
    * Set the type of function defined by this type alias to the given type.
    * @param type the type of function defined by this type alias
@@ -3276,7 +3214,7 @@
   void set type(FunctionType type2) {
     this._type = type2;
   }
-  
+
   /**
    * Set the type variables defined for this type to the given variables.
    * @param typeVariables the type variables defined for this type
@@ -3321,20 +3259,19 @@
     }
   }
 }
-
 /**
  * Instances of the class {@code ShowCombinatorImpl} implement a {@link ShowCombinator}.
  * @coverage dart.engine.element
  */
 class HideCombinatorImpl implements HideCombinator {
-  
+
   /**
    * 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;
   List<String> get hiddenNames => _hiddenNames;
-  
+
   /**
    * Set the names that are not to be made visible in the importing library even if they are defined
    * in the imported library to the given names.
@@ -3356,33 +3293,32 @@
     return builder.toString();
   }
 }
-
 /**
  * Instances of the class {@code HtmlElementImpl} implement an {@link HtmlElement}.
  * @coverage dart.engine.element
  */
 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.
    */
   AnalysisContext _context;
-  
+
   /**
    * The scripts contained in or referenced from script tags in the HTML file.
    */
   List<HtmlScriptElement> _scripts = HtmlScriptElementImpl.EMPTY_ARRAY;
-  
+
   /**
    * The source that corresponds to this HTML file.
    */
   Source _source;
-  
+
   /**
    * Initialize a newly created HTML element to have the given name.
    * @param context the analysis context in which the HTML file is defined
@@ -3398,7 +3334,7 @@
   List<HtmlScriptElement> get scripts => _scripts;
   Source get source => _source;
   int get hashCode => _source.hashCode;
-  
+
   /**
    * Set the scripts contained in the HTML file to the given scripts.
    * @param scripts the scripts
@@ -3412,7 +3348,7 @@
     }
     this._scripts = scripts2;
   }
-  
+
   /**
    * Set the source that corresponds to this HTML file to the given source.
    * @param source the source that corresponds to this HTML file
@@ -3432,18 +3368,17 @@
     }
   }
 }
-
 /**
  * Instances of the class {@code HtmlScriptElementImpl} implement an {@link HtmlScriptElement}.
  * @coverage dart.engine.element
  */
 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 {@code null})
@@ -3451,35 +3386,34 @@
   HtmlScriptElementImpl(XmlTagNode node) : super.con2(node.tag.lexeme, node.tag.offset) {
   }
 }
-
 /**
  * Instances of the class {@code ImportElementImpl} implement an {@link ImportElement}.
  * @coverage dart.engine.element
  */
 class ImportElementImpl extends ElementImpl implements ImportElement {
-  
+
   /**
    * The URI that is specified by this directive.
    */
   String _uri;
-  
+
   /**
    * 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 {@code null} if there was no
    * prefix specified.
    */
   PrefixElement _prefix;
-  
+
   /**
    * Initialize a newly created import element.
    */
@@ -3491,7 +3425,7 @@
   ElementKind get kind => ElementKind.IMPORT;
   PrefixElement get prefix => _prefix;
   String get uri => _uri;
-  
+
   /**
    * Set the combinators that were specified as part of the import directive to the given array of
    * combinators.
@@ -3500,7 +3434,7 @@
   void set combinators(List<NamespaceCombinator> combinators2) {
     this._combinators = combinators2;
   }
-  
+
   /**
    * Set the library that is imported into this library by this import directive to the given
    * library.
@@ -3509,7 +3443,7 @@
   void set importedLibrary(LibraryElement importedLibrary2) {
     this._importedLibrary = importedLibrary2;
   }
-  
+
   /**
    * Set the prefix that was specified as part of the import directive to the given prefix.
    * @param prefix the prefix that was specified as part of the import directive
@@ -3517,7 +3451,7 @@
   void set prefix(PrefixElement prefix2) {
     this._prefix = prefix2;
   }
-  
+
   /**
    * Set the URI that is specified by this directive.
    * @param uri the URI that is specified by this directive.
@@ -3535,28 +3469,27 @@
   }
   String get identifier => ((_importedLibrary as LibraryElementImpl)).identifier;
 }
-
 /**
  * Instances of the class {@code LabelElementImpl} implement a {@code LabelElement}.
  * @coverage dart.engine.element
  */
 class LabelElementImpl extends ElementImpl implements LabelElement {
-  
+
   /**
    * A flag indicating whether this label is associated with a {@code switch} statement.
    */
   bool _onSwitchStatement = false;
-  
+
   /**
    * A flag indicating whether this label is associated with a {@code switch} member ({@code case}or {@code default}).
    */
   bool _onSwitchMember = false;
-  
+
   /**
    * 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
@@ -3570,31 +3503,30 @@
   accept(ElementVisitor visitor) => visitor.visitLabelElement(this);
   ExecutableElement get enclosingElement => super.enclosingElement as ExecutableElement;
   ElementKind get kind => ElementKind.LABEL;
-  
+
   /**
    * Return {@code true} if this label is associated with a {@code switch} member ({@code case} or{@code default}).
    * @return {@code true} if this label is associated with a {@code switch} member
    */
   bool isOnSwitchMember() => _onSwitchMember;
-  
+
   /**
    * Return {@code true} if this label is associated with a {@code switch} statement.
    * @return {@code true} if this label is associated with a {@code switch} statement
    */
   bool isOnSwitchStatement() => _onSwitchStatement;
 }
-
 /**
  * Instances of the class {@code LibraryElementImpl} implement a {@code LibraryElement}.
  * @coverage dart.engine.element
  */
 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
@@ -3625,37 +3557,37 @@
     }
     return true;
   }
-  
+
   /**
    * The analysis context in which this library is defined.
    */
   AnalysisContext _context;
-  
+
   /**
    * The compilation unit that defines this library.
    */
   CompilationUnitElement _definingCompilationUnit;
-  
+
   /**
    * The entry point for this library, or {@code 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{@code part} directive.
    */
   List<CompilationUnitElement> _parts = CompilationUnitElementImpl.EMPTY_ARRAY;
-  
+
   /**
    * Initialize a newly created library element to have the given name.
    * @param context the analysis context in which the library is defined
@@ -3752,7 +3684,7 @@
     Set<LibraryElement> visitedLibraries = new Set();
     return isUpToDate(this, timeStamp, visitedLibraries);
   }
-  
+
   /**
    * Set the compilation unit that defines this library to the given compilation unit.
    * @param definingCompilationUnit the compilation unit that defines this library
@@ -3761,7 +3693,7 @@
     ((definingCompilationUnit2 as CompilationUnitElementImpl)).enclosingElement = this;
     this._definingCompilationUnit = definingCompilationUnit2;
   }
-  
+
   /**
    * Set the entry point for this library to the given function.
    * @param entryPoint the entry point for this library
@@ -3769,7 +3701,7 @@
   void set entryPoint(FunctionElement entryPoint2) {
     this._entryPoint = entryPoint2;
   }
-  
+
   /**
    * 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
@@ -3780,7 +3712,7 @@
     }
     this._exports = exports2;
   }
-  
+
   /**
    * 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
@@ -3795,7 +3727,7 @@
     }
     this._imports = imports2;
   }
-  
+
   /**
    * Set the compilation units that are included in this library using a {@code part} directive.
    * @param parts the compilation units that are included in this library using a {@code part}directive
@@ -3813,7 +3745,7 @@
     safelyVisitChildren(_imports, visitor);
     safelyVisitChildren(_parts, visitor);
   }
-  
+
   /**
    * Answer {@code true} if the receiver directly or indirectly imports the dart:html libraries.
    * @return {@code true} if the receiver directly or indirectly imports the dart:html libraries
@@ -3842,29 +3774,28 @@
     return false;
   }
 }
-
 /**
  * Instances of the class {@code LocalVariableElementImpl} implement a {@code LocalVariableElement}.
  * @coverage dart.engine.element
  */
 class LocalVariableElementImpl extends VariableElementImpl implements LocalVariableElement {
-  
+
   /**
    * 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 {@code -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
@@ -3879,7 +3810,7 @@
     }
     return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
   }
-  
+
   /**
    * Set the visible range for this element to the range starting at the given offset with the given
    * length.
@@ -3897,28 +3828,27 @@
     builder.append(displayName);
   }
 }
-
 /**
  * Instances of the class {@code MethodElementImpl} implement a {@code MethodElement}.
  * @coverage dart.engine.element
  */
 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.con1(Identifier name) : super.con1(name) {
-    _jtd_constructor_216_impl(name);
+    _jtd_constructor_217_impl(name);
   }
-  _jtd_constructor_216_impl(Identifier name) {
+  _jtd_constructor_217_impl(Identifier name) {
   }
-  
+
   /**
    * Initialize a newly created method element to have the given name.
    * @param name the name of this element
@@ -3926,9 +3856,9 @@
    * declaration of this element
    */
   MethodElementImpl.con2(String name, int nameOffset) : super.con2(name, nameOffset) {
-    _jtd_constructor_217_impl(name, nameOffset);
+    _jtd_constructor_218_impl(name, nameOffset);
   }
-  _jtd_constructor_217_impl(String name, int nameOffset) {
+  _jtd_constructor_218_impl(String name, int nameOffset) {
   }
   accept(ElementVisitor visitor) => visitor.visitMethodElement(this);
   ClassElement get enclosingElement => super.enclosingElement as ClassElement;
@@ -3952,7 +3882,7 @@
     return !((0x61 <= first && first <= 0x7A) || (0x41 <= first && first <= 0x5A) || first == 0x5F || first == 0x24);
   }
   bool isStatic() => hasModifier(Modifier.STATIC);
-  
+
   /**
    * Set whether this method is abstract to correspond to the given value.
    * @param isAbstract {@code true} if the method is abstract
@@ -3960,7 +3890,7 @@
   void set abstract(bool isAbstract) {
     setModifier(Modifier.ABSTRACT, isAbstract);
   }
-  
+
   /**
    * Set whether this method is static to correspond to the given value.
    * @param isStatic {@code true} if the method is static
@@ -3975,7 +3905,6 @@
     super.appendTo(builder);
   }
 }
-
 /**
  * The enumeration {@code Modifier} defines constants for all of the modifiers defined by the Dart
  * language and for a few additional flags that are useful.
@@ -3994,10 +3923,10 @@
   static final Modifier SYNTHETIC = new Modifier('SYNTHETIC', 9);
   static final Modifier TYPEDEF = new Modifier('TYPEDEF', 10);
   static final List<Modifier> values = [ABSTRACT, CONST, FACTORY, FINAL, GETTER, MIXIN, REFERENCES_SUPER, SETTER, STATIC, SYNTHETIC, TYPEDEF];
-  
+
   /// The name of this enum constant, as declared in the enum declaration.
   final String name;
-  
+
   /// The position in the enum declaration.
   final int ordinal;
   Modifier(this.name, this.ordinal) {
@@ -4005,29 +3934,28 @@
   int compareTo(Modifier other) => ordinal - other.ordinal;
   String toString() => name;
 }
-
 /**
  * Instances of the class {@code MultiplyDefinedElementImpl} represent a collection of elements that
  * have the same name within the same scope.
  * @coverage dart.engine.element
  */
 class MultiplyDefinedElementImpl implements MultiplyDefinedElement {
-  
+
   /**
    * The analysis context in which the multiply defined elements are defined.
    */
   AnalysisContext _context;
-  
+
   /**
    * The name of the conflicting elements.
    */
   String _name;
-  
+
   /**
    * A list containing all of the elements that conflict.
    */
   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
@@ -4076,7 +4004,7 @@
   }
   void visitChildren(ElementVisitor<Object> visitor) {
   }
-  
+
   /**
    * 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.
@@ -4092,7 +4020,7 @@
       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
@@ -4108,40 +4036,39 @@
     return new List.from(elements);
   }
 }
-
 /**
  * Instances of the class {@code ParameterElementImpl} implement a {@code ParameterElement}.
  * @coverage dart.engine.element
  */
 class ParameterElementImpl extends VariableElementImpl implements ParameterElement {
-  
+
   /**
    * 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 visible range for this element.
    */
   int _visibleRangeOffset = 0;
-  
+
   /**
    * The length of the visible range for this element, or {@code -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
@@ -4159,7 +4086,7 @@
     return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
   }
   bool isInitializingFormal() => false;
-  
+
   /**
    * Set the kind of this parameter to the given kind.
    * @param parameterKind the new kind of this parameter
@@ -4167,7 +4094,7 @@
   void set parameterKind(ParameterKind parameterKind2) {
     this._parameterKind = parameterKind2;
   }
-  
+
   /**
    * Set the parameters defined by this executable element to the given parameters.
    * @param parameters the parameters defined by this executable element
@@ -4178,7 +4105,7 @@
     }
     this._parameters = parameters2;
   }
-  
+
   /**
    * Set the visible range for this element to the range starting at the given offset with the given
    * length.
@@ -4214,23 +4141,22 @@
     builder.append(right);
   }
 }
-
 /**
  * Instances of the class {@code PrefixElementImpl} implement a {@code PrefixElement}.
  * @coverage dart.engine.element
  */
 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
@@ -4241,7 +4167,7 @@
   LibraryElement get enclosingElement => super.enclosingElement as LibraryElement;
   List<LibraryElement> get importedLibraries => _importedLibraries;
   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
@@ -4257,42 +4183,41 @@
     super.appendTo(builder);
   }
 }
-
 /**
  * Instances of the class {@code PropertyAccessorElementImpl} implement a{@code PropertyAccessorElement}.
  * @coverage dart.engine.element
  */
 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.con1(Identifier name) : super.con1(name) {
-    _jtd_constructor_222_impl(name);
+    _jtd_constructor_223_impl(name);
   }
-  _jtd_constructor_222_impl(Identifier name) {
+  _jtd_constructor_223_impl(Identifier 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.con2(PropertyInducingElementImpl variable2) : super.con2(variable2.name, variable2.nameOffset) {
-    _jtd_constructor_223_impl(variable2);
+    _jtd_constructor_224_impl(variable2);
   }
-  _jtd_constructor_223_impl(PropertyInducingElementImpl variable2) {
+  _jtd_constructor_224_impl(PropertyInducingElementImpl variable2) {
     this._variable = variable2;
     synthetic = true;
   }
@@ -4327,7 +4252,7 @@
   bool isGetter() => hasModifier(Modifier.GETTER);
   bool isSetter() => hasModifier(Modifier.SETTER);
   bool isStatic() => hasModifier(Modifier.STATIC);
-  
+
   /**
    * Set whether this accessor is abstract to correspond to the given value.
    * @param isAbstract {@code true} if the accessor is abstract
@@ -4335,7 +4260,7 @@
   void set abstract(bool isAbstract) {
     setModifier(Modifier.ABSTRACT, isAbstract);
   }
-  
+
   /**
    * Set whether this accessor is a getter to correspond to the given value.
    * @param isGetter {@code true} if the accessor is a getter
@@ -4343,7 +4268,7 @@
   void set getter(bool isGetter) {
     setModifier(Modifier.GETTER, isGetter);
   }
-  
+
   /**
    * Set whether this accessor is a setter to correspond to the given value.
    * @param isSetter {@code true} if the accessor is a setter
@@ -4351,7 +4276,7 @@
   void set setter(bool isSetter) {
     setModifier(Modifier.SETTER, isSetter);
   }
-  
+
   /**
    * Set whether this accessor is static to correspond to the given value.
    * @param isStatic {@code true} if the accessor is static
@@ -4359,7 +4284,7 @@
   void set static(bool isStatic) {
     setModifier(Modifier.STATIC, isStatic);
   }
-  
+
   /**
    * Set the variable associated with this accessor to the given variable.
    * @param variable the variable associated with this accessor
@@ -4373,51 +4298,50 @@
     super.appendTo(builder);
   }
 }
-
 /**
  * Instances of the class {@code PropertyInducingElementImpl} implement a{@code PropertyInducingElement}.
  * @coverage dart.engine.element
  */
 abstract class PropertyInducingElementImpl extends VariableElementImpl implements PropertyInducingElement {
-  
+
   /**
    * The getter associated with this element.
    */
   PropertyAccessorElement _getter;
-  
+
   /**
    * The setter associated with this element, or {@code null} if the element is effectively{@code 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.con1(name) {
-    _jtd_constructor_224_impl(name);
+    _jtd_constructor_225_impl(name);
   }
-  _jtd_constructor_224_impl(Identifier name) {
+  _jtd_constructor_225_impl(Identifier name) {
   }
-  
+
   /**
    * Initialize a newly created synthetic element to have the given name.
    * @param name the name of this element
    */
   PropertyInducingElementImpl.con2(String name) : super.con2(name, -1) {
-    _jtd_constructor_225_impl(name);
+    _jtd_constructor_226_impl(name);
   }
-  _jtd_constructor_225_impl(String name) {
+  _jtd_constructor_226_impl(String name) {
     synthetic = true;
   }
   PropertyAccessorElement get getter => _getter;
   PropertyAccessorElement get setter => _setter;
-  
+
   /**
    * Set the getter associated with this element to the given accessor.
    * @param getter the getter associated with this element
@@ -4425,7 +4349,7 @@
   void set getter(PropertyAccessorElement getter2) {
     this._getter = getter2;
   }
-  
+
   /**
    * Set the setter associated with this element to the given accessor.
    * @param setter the setter associated with this element
@@ -4434,20 +4358,19 @@
     this._setter = setter2;
   }
 }
-
 /**
  * Instances of the class {@code ShowCombinatorImpl} implement a {@link ShowCombinator}.
  * @coverage dart.engine.element
  */
 class ShowCombinatorImpl implements ShowCombinator {
-  
+
   /**
    * 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;
   List<String> get shownNames => _shownNames;
-  
+
   /**
    * Set the names that are to be made visible in the importing library if they are defined in the
    * imported library to the given names.
@@ -4469,64 +4392,62 @@
     return builder.toString();
   }
 }
-
 /**
  * Instances of the class {@code TopLevelVariableElementImpl} implement a{@code TopLevelVariableElement}.
  * @coverage dart.engine.element
  */
 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) {
-    _jtd_constructor_227_impl(name);
+    _jtd_constructor_228_impl(name);
   }
-  _jtd_constructor_227_impl(Identifier name) {
+  _jtd_constructor_228_impl(Identifier 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) {
-    _jtd_constructor_228_impl(name);
+    _jtd_constructor_229_impl(name);
   }
-  _jtd_constructor_228_impl(String name) {
+  _jtd_constructor_229_impl(String name) {
   }
   accept(ElementVisitor visitor) => visitor.visitTopLevelVariableElement(this);
   ElementKind get kind => ElementKind.TOP_LEVEL_VARIABLE;
   bool isStatic() => true;
 }
-
 /**
  * Instances of the class {@code TypeVariableElementImpl} implement a {@code TypeVariableElement}.
  * @coverage dart.engine.element
  */
 class TypeVariableElementImpl extends ElementImpl implements TypeVariableElement {
-  
+
   /**
    * The type defined by this type variable.
    */
   TypeVariableType _type;
-  
+
   /**
    * The type representing the bound associated with this variable, or {@code null} if this variable
    * does not have an explicit bound.
    */
   Type2 _bound;
-  
+
   /**
    * An empty array of type variable elements.
    */
   static List<TypeVariableElement> EMPTY_ARRAY = new List<TypeVariableElement>(0);
-  
+
   /**
    * Initialize a newly created type variable element to have the given name.
    * @param name the name of this element
@@ -4537,7 +4458,7 @@
   Type2 get bound => _bound;
   ElementKind get kind => ElementKind.TYPE_VARIABLE;
   TypeVariableType get type => _type;
-  
+
   /**
    * Set the type representing the bound associated with this variable to the given type.
    * @param bound the type representing the bound associated with this variable
@@ -4545,7 +4466,7 @@
   void set bound(Type2 bound2) {
     this._bound = bound2;
   }
-  
+
   /**
    * Set the type defined by this type variable to the given type
    * @param type the type defined by this type variable
@@ -4561,39 +4482,38 @@
     }
   }
 }
-
 /**
  * Instances of the class {@code VariableElementImpl} implement a {@code VariableElement}.
  * @coverage dart.engine.element
  */
 abstract class VariableElementImpl extends ElementImpl implements VariableElement {
-  
+
   /**
    * The declared type of this variable.
    */
   Type2 _type;
-  
+
   /**
    * A synthetic function representing this variable's initializer, or {@code 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.con1(Identifier name) : super.con1(name) {
-    _jtd_constructor_230_impl(name);
+    _jtd_constructor_231_impl(name);
   }
-  _jtd_constructor_230_impl(Identifier name) {
+  _jtd_constructor_231_impl(Identifier name) {
   }
-  
+
   /**
    * Initialize a newly created variable element to have the given name.
    * @param name the name of this element
@@ -4601,11 +4521,11 @@
    * declaration of this element
    */
   VariableElementImpl.con2(String name, int nameOffset) : super.con2(name, nameOffset) {
-    _jtd_constructor_231_impl(name, nameOffset);
+    _jtd_constructor_232_impl(name, nameOffset);
   }
-  _jtd_constructor_231_impl(String name, int nameOffset) {
+  _jtd_constructor_232_impl(String name, int nameOffset) {
   }
-  
+
   /**
    * Return the result of evaluating this variable's initializer as a compile-time constant
    * expression, or {@code null} if this variable is not a 'const' variable or does not have an
@@ -4617,7 +4537,7 @@
   Type2 get type => _type;
   bool isConst() => hasModifier(Modifier.CONST);
   bool isFinal() => hasModifier(Modifier.FINAL);
-  
+
   /**
    * Set whether this variable is const to correspond to the given value.
    * @param isConst {@code true} if the variable is const
@@ -4625,7 +4545,7 @@
   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.
@@ -4634,7 +4554,7 @@
   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 {@code true} if the variable is final
@@ -4642,7 +4562,7 @@
   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
@@ -4653,7 +4573,7 @@
     }
     this._initializer = initializer2;
   }
-  
+
   /**
    * Set the declared type of this variable to the given type.
    * @param type the declared type of this variable
@@ -4671,13 +4591,12 @@
     builder.append(displayName);
   }
 }
-
 /**
  * Instances of the class {@code 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
@@ -4701,7 +4620,7 @@
     }
     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
@@ -4743,14 +4662,13 @@
   }
   InterfaceType get definingType => super.definingType as InterfaceType;
 }
-
 /**
  * The abstract class {@code 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.
@@ -4790,13 +4708,12 @@
     safelyVisitChildren(parameters, visitor);
   }
 }
-
 /**
  * Instances of the class {@code 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
@@ -4823,7 +4740,7 @@
     }
     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
@@ -4839,23 +4756,22 @@
   bool isStatic() => baseElement.isStatic();
   InterfaceType get definingType => super.definingType as InterfaceType;
 }
-
 /**
  * The abstract class {@code 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.
    */
   Element _baseElement;
-  
+
   /**
    * The type in which the element is defined.
    */
   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
@@ -4867,7 +4783,7 @@
   }
   String computeDocumentationComment() => _baseElement.computeDocumentationComment();
   Element getAncestor(Type elementClass) => baseElement.getAncestor(elementClass);
-  
+
   /**
    * Return the element on which the parameterized element was created.
    * @return the element on which the parameterized element was created
@@ -4886,13 +4802,13 @@
   bool isSynthetic() => _baseElement.isSynthetic();
   void visitChildren(ElementVisitor<Object> 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 {@code null}, use the given visitor to visit it.
    * @param child the child to be visited
@@ -4903,7 +4819,7 @@
       child.accept(visitor);
     }
   }
-  
+
   /**
    * Use the given visitor to visit all of the children in the given array.
    * @param children the children to be visited
@@ -4916,7 +4832,7 @@
       }
     }
   }
-  
+
   /**
    * Return the type that results from replacing the type parameters in the given type with the type
    * arguments.
@@ -4928,7 +4844,7 @@
     List<Type2> parameterTypes = TypeVariableTypeImpl.getTypes(_definingType.typeVariables);
     return type.substitute2(argumentTypes, parameterTypes) as Type2;
   }
-  
+
   /**
    * Return the array of types that results from replacing the type parameters in the given types
    * with the type arguments.
@@ -4944,13 +4860,12 @@
     return substitutedTypes;
   }
 }
-
 /**
  * Instances of the class {@code 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
@@ -4974,7 +4889,7 @@
     }
     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
@@ -5010,13 +4925,12 @@
     return builder.toString();
   }
 }
-
 /**
  * Instances of the class {@code 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
@@ -5040,7 +4954,7 @@
     }
     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
@@ -5108,13 +5022,12 @@
     safelyVisitChildren(parameters, visitor);
   }
 }
-
 /**
  * Instances of the class {@code 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
@@ -5138,7 +5051,7 @@
     }
     return new PropertyAccessorMember(baseAccessor, definingType);
   }
-  
+
   /**
    * Initialize a newly created element to represent a property accessor of the given parameterized
    * type.
@@ -5164,14 +5077,13 @@
   bool isSetter() => baseElement.isSetter();
   InterfaceType get definingType => super.definingType as InterfaceType;
 }
-
 /**
  * The abstract class {@code 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.
@@ -5192,21 +5104,20 @@
     safelyVisitChild(baseElement.initializer, visitor);
   }
 }
-
 /**
  * Instances of the class {@code AnonymousFunctionTypeImpl} extend the behavior of{@link FunctionTypeImpl} to support anonymous function types created for function typed
  * parameters.
  * @coverage dart.engine.type
  */
 class AnonymousFunctionTypeImpl extends FunctionTypeImpl {
-  
+
   /**
    * An array of parameters elements of this type of function.
    */
   List<ParameterElement> _baseParameters = ParameterElementImpl.EMPTY_ARRAY;
   AnonymousFunctionTypeImpl() : super.con2((null as FunctionTypeAliasElement)) {
   }
-  
+
   /**
    * Sets the parameters elements of this type of function.
    * @param parameters the parameters elements of this type of function
@@ -5216,24 +5127,23 @@
   }
   List<ParameterElement> get baseParameters => _baseParameters;
 }
-
 /**
  * The unique instance of the class {@code BottomTypeImpl} implements the type {@code bottom}.
  * @coverage dart.engine.type
  */
 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.
    */
@@ -5245,24 +5155,23 @@
   bool isSupertypeOf(Type2 type) => false;
   BottomTypeImpl substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes) => this;
 }
-
 /**
  * The unique instance of the class {@code DynamicTypeImpl} implements the type {@code dynamic}.
  * @coverage dart.engine.type
  */
 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.
    */
@@ -5276,14 +5185,13 @@
   bool isSupertypeOf(Type2 type) => true;
   DynamicTypeImpl substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes) => this;
 }
-
 /**
  * Instances of the class {@code FunctionTypeImpl} defines the behavior common to objects
  * representing the type of a function, method, constructor, getter, or setter.
  * @coverage dart.engine.type
  */
 class FunctionTypeImpl extends TypeImpl implements FunctionType {
-  
+
   /**
    * Return {@code true} if all of the name/type pairs in the first map are equal to the
    * corresponding name/type pairs in the second map. The maps are expected to iterate over their
@@ -5308,7 +5216,7 @@
     }
     return true;
   }
-  
+
   /**
    * Return a map containing the results of using the given argument types and parameter types to
    * perform a substitution on all of the values in the given map. The order of the entries will be
@@ -5328,56 +5236,56 @@
     }
     return newTypes;
   }
-  
+
   /**
    * An array containing the actual types of the type arguments.
    */
   List<Type2> _typeArguments = TypeImpl.EMPTY_ARRAY;
-  
+
   /**
    * 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<Type2> _normalParameterTypes = TypeImpl.EMPTY_ARRAY;
-  
+
   /**
    * A table mapping the names of optional (positional) parameters to the types of the optional
    * parameters of this type of function.
    */
   List<Type2> _optionalParameterTypes = TypeImpl.EMPTY_ARRAY;
-  
+
   /**
    * A table mapping the names of named parameters to the types of the named parameters of this type
    * of function.
    */
   Map<String, Type2> _namedParameterTypes = new Map();
-  
+
   /**
    * The type of object returned by this type of function.
    */
   Type2 _returnType = VoidTypeImpl.instance;
-  
+
   /**
    * Initialize a newly created function type to be declared by the given element and to have the
    * given name.
    * @param element the element representing the declaration of the function type
    */
   FunctionTypeImpl.con1(ExecutableElement element) : super(element, element == null ? null : element.name) {
-    _jtd_constructor_298_impl(element);
+    _jtd_constructor_299_impl(element);
   }
-  _jtd_constructor_298_impl(ExecutableElement element) {
+  _jtd_constructor_299_impl(ExecutableElement element) {
   }
-  
+
   /**
    * Initialize a newly created function type to be declared by the given element and to have the
    * given name.
    * @param element the element representing the declaration of the function type
    */
   FunctionTypeImpl.con2(FunctionTypeAliasElement element) : super(element, element == null ? null : element.name) {
-    _jtd_constructor_299_impl(element);
+    _jtd_constructor_300_impl(element);
   }
-  _jtd_constructor_299_impl(FunctionTypeAliasElement element) {
+  _jtd_constructor_300_impl(FunctionTypeAliasElement element) {
   }
   bool operator ==(Object object) {
     if (object is! FunctionTypeImpl) {
@@ -5541,7 +5449,7 @@
     }
     return s.returnType == VoidTypeImpl.instance || t.returnType.isAssignableTo(s.returnType);
   }
-  
+
   /**
    * Set the mapping of the names of named parameters to the types of the named parameters of this
    * type of function to the given mapping.
@@ -5551,7 +5459,7 @@
   void set namedParameterTypes(LinkedHashMap<String, Type2> namedParameterTypes2) {
     this._namedParameterTypes = namedParameterTypes2;
   }
-  
+
   /**
    * Set the types of the normal parameters of this type of function to the types in the given
    * array.
@@ -5560,7 +5468,7 @@
   void set normalParameterTypes(List<Type2> normalParameterTypes2) {
     this._normalParameterTypes = normalParameterTypes2;
   }
-  
+
   /**
    * Set the types of the optional parameters of this type of function to the types in the given
    * array.
@@ -5569,7 +5477,7 @@
   void set optionalParameterTypes(List<Type2> optionalParameterTypes2) {
     this._optionalParameterTypes = optionalParameterTypes2;
   }
-  
+
   /**
    * Set the type of object returned by this type of function to the given type.
    * @param returnType the type of object returned by this type of function
@@ -5577,7 +5485,7 @@
   void set returnType(Type2 returnType2) {
     this._returnType = returnType2;
   }
-  
+
   /**
    * Set the actual types of the type arguments to the given types.
    * @param typeArguments the actual types of the type arguments
@@ -5658,7 +5566,7 @@
       ((_returnType as TypeImpl)).appendTo(builder);
     }
   }
-  
+
   /**
    * @return the base parameter elements of this function element, not {@code null}.
    */
@@ -5671,7 +5579,6 @@
     }
   }
 }
-
 /**
  * Instances of the class {@code InterfaceTypeImpl} defines the behavior common to objects
  * representing the type introduced by either a class or an interface, or a reference to such a
@@ -5679,12 +5586,12 @@
  * @coverage dart.engine.type
  */
 class InterfaceTypeImpl extends TypeImpl implements InterfaceType {
-  
+
   /**
    * An empty array of types.
    */
   static List<InterfaceType> EMPTY_ARRAY = new List<InterfaceType>(0);
-  
+
   /**
    * This method computes the longest inheritance path from some passed {@link Type} to Object.
    * @param type the {@link Type} to compute the longest inheritance path of from the passed{@link Type} to Object
@@ -5692,7 +5599,7 @@
    * @see InterfaceType#getLeastUpperBound(Type)
    */
   static int computeLongestInheritancePathToObject(InterfaceType type) => computeLongestInheritancePathToObject2(type, 0, new Set<ClassElement>());
-  
+
   /**
    * Returns the set of all superinterfaces of the passed {@link Type}.
    * @param type the {@link Type} to compute the set of superinterfaces of
@@ -5701,7 +5608,7 @@
    */
   static Set<InterfaceType> computeSuperinterfaceSet(InterfaceType type) => computeSuperinterfaceSet2(type, new Set<InterfaceType>());
   List<TypeVariableElement> get typeVariables => element.typeVariables;
-  
+
   /**
    * This method computes the longest inheritance path from some passed {@link Type} to Object. This
    * method calls itself recursively, callers should use the public method{@link #computeLongestInheritancePathToObject(Type)}.
@@ -5740,7 +5647,7 @@
     }
     return longestPath;
   }
-  
+
   /**
    * Returns the set of all superinterfaces of the passed {@link Type}. This is a recursive method,
    * callers should call the public {@link #computeSuperinterfaceSet(Type)}.
@@ -5769,7 +5676,7 @@
     }
     return set;
   }
-  
+
   /**
    * Return the intersection of the given sets of types, where intersection is based on the equality
    * of the elements of the types rather than on the equality of the types themselves. In cases
@@ -5794,7 +5701,7 @@
     }
     return new List.from(result);
   }
-  
+
   /**
    * Return the "least upper bound" of the given types under the assumption that the types have the
    * same element and differ only in terms of the type arguments. The resulting type is composed by
@@ -5827,31 +5734,31 @@
     lub.typeArguments = lubArguments;
     return lub;
   }
-  
+
   /**
    * An array containing the actual types of the type arguments.
    */
   List<Type2> _typeArguments = TypeImpl.EMPTY_ARRAY;
-  
+
   /**
    * Initialize a newly created type to be declared by the given element.
    * @param element the element representing the declaration of the type
    */
   InterfaceTypeImpl.con1(ClassElement element) : super(element, element.displayName) {
-    _jtd_constructor_300_impl(element);
+    _jtd_constructor_301_impl(element);
   }
-  _jtd_constructor_300_impl(ClassElement element) {
+  _jtd_constructor_301_impl(ClassElement element) {
   }
-  
+
   /**
    * Initialize a newly created type to have the given name. This constructor should only be used in
    * cases where there is no declaration of the type.
    * @param name the name of the type
    */
   InterfaceTypeImpl.con2(String name) : super(null, name) {
-    _jtd_constructor_301_impl(name);
+    _jtd_constructor_302_impl(name);
   }
-  _jtd_constructor_301_impl(String name) {
+  _jtd_constructor_302_impl(String name) {
   }
   bool operator ==(Object object) {
     if (object is! InterfaceTypeImpl) {
@@ -6111,7 +6018,7 @@
     }
     return null;
   }
-  
+
   /**
    * Set the actual types of the type arguments to those in the given array.
    * @param typeArguments the actual types of the type arguments
@@ -6231,14 +6138,13 @@
     return false;
   }
 }
-
 /**
  * The abstract class {@code TypeImpl} implements the behavior common to objects representing the
  * declared type of elements in the element model.
  * @coverage dart.engine.type
  */
 abstract class TypeImpl implements Type2 {
-  
+
   /**
    * Return an array containing the results of using the given argument types and parameter types to
    * perform a substitution on all of the given types.
@@ -6258,23 +6164,23 @@
     }
     return newTypes;
   }
-  
+
   /**
    * The element representing the declaration of this type, or {@code null} if the type has not, or
    * cannot, be associated with an element.
    */
   Element _element;
-  
+
   /**
    * The name of this type, or {@code null} if the type does not have a name.
    */
   String _name;
-  
+
   /**
    * An empty array of types.
    */
   static List<Type2> EMPTY_ARRAY = new List<Type2>(0);
-  
+
   /**
    * Initialize a newly created type to be declared by the given element and to have the given name.
    * @param element the element representing the declaration of the type
@@ -6300,7 +6206,7 @@
     appendTo(builder);
     return builder.toString();
   }
-  
+
   /**
    * Append a textual representation of this type to the given builder.
    * @param builder the builder to which the text is to be appended
@@ -6313,14 +6219,13 @@
     }
   }
 }
-
 /**
  * Instances of the class {@code TypeVariableTypeImpl} defines the behavior of objects representing
  * the type introduced by a type variable.
  * @coverage dart.engine.type
  */
 class TypeVariableTypeImpl extends TypeImpl implements TypeVariableType {
-  
+
   /**
    * Return an array containing the type variable types defined by the given array of type variable
    * elements.
@@ -6335,7 +6240,7 @@
     }
     return types;
   }
-  
+
   /**
    * Initialize a newly created type variable to be declared by the given element and to have the
    * given name.
@@ -6361,24 +6266,23 @@
     return this;
   }
 }
-
 /**
  * The unique instance of the class {@code VoidTypeImpl} implements the type {@code void}.
  * @coverage dart.engine.type
  */
 class VoidTypeImpl extends TypeImpl implements VoidType {
-  
+
   /**
    * The unique instance of this class.
    */
   static VoidTypeImpl _INSTANCE = new VoidTypeImpl();
-  
+
   /**
    * Return the unique instance of this class.
    * @return the unique instance of this class
    */
   static VoidTypeImpl get instance => _INSTANCE;
-  
+
   /**
    * Prevent the creation of instances of this class.
    */
@@ -6389,7 +6293,6 @@
   bool isVoid() => true;
   VoidTypeImpl substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes) => this;
 }
-
 /**
  * The interface {@code FunctionType} defines the behavior common to objects representing the type
  * of a function, method, constructor, getter, or setter. Function types come in three variations:
@@ -6405,7 +6308,7 @@
  * @coverage dart.engine.type
  */
 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
@@ -6414,14 +6317,14 @@
    * @return a map from the name to the types of the named parameters of this type of function
    */
   Map<String, Type2> 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<Type2> 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
@@ -6430,20 +6333,20 @@
    * @return a map from the name to the types of the optional parameters of this type of function
    */
   List<Type2> 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
    */
   Type2 get returnType;
-  
+
   /**
    * Return {@code true} if this type is a subtype of the given type.
    * <p>
@@ -6508,7 +6411,7 @@
    * @return {@code true} if this type is a subtype of the given type
    */
   bool isSubtypeOf(Type2 type);
-  
+
   /**
    * Return the type resulting from substituting the given arguments for this type's parameters.
    * This is fully equivalent to {@code substitute(argumentTypes, getTypeArguments())}.
@@ -6518,7 +6421,6 @@
   FunctionType substitute4(List<Type2> argumentTypes);
   FunctionType substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes);
 }
-
 /**
  * The interface {@code 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.
@@ -6526,7 +6428,7 @@
  */
 abstract class InterfaceType implements ParameterizedType {
   ClassElement get element;
-  
+
   /**
    * Return the element representing the getter with the given name that is declared in this class,
    * or {@code null} if this class does not declare a getter with the given name.
@@ -6534,7 +6436,7 @@
    * @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
@@ -6542,7 +6444,7 @@
    * @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 {@code null} if there is no
    * least upper bound.
@@ -6559,7 +6461,7 @@
    * @return the least upper bound of this type and the given type
    */
   Type2 getLeastUpperBound(Type2 type);
-  
+
   /**
    * Return the element representing the method with the given name that is declared in this class,
    * or {@code null} if this class does not declare a method with the given name.
@@ -6567,7 +6469,7 @@
    * @return the method declared in this class with the given name
    */
   MethodElement getMethod(String methodName);
-  
+
   /**
    * 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,
@@ -6576,7 +6478,7 @@
    * @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 {@code null} if this class does not declare a setter with the given name.
@@ -6584,7 +6486,7 @@
    * @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
@@ -6593,7 +6495,7 @@
    * @return the superclass of this type
    */
   InterfaceType get superclass;
-  
+
   /**
    * Return {@code 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>
@@ -6609,7 +6511,7 @@
    * @return {@code true} if this type is a direct supertype of the given type
    */
   bool isDirectSupertypeOf(InterfaceType type);
-  
+
   /**
    * Return {@code 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
@@ -6629,7 +6531,7 @@
    * @return {@code true} if this type is more specific than the given type
    */
   bool isMoreSpecificThan(Type2 type);
-  
+
   /**
    * Return {@code 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
@@ -6640,7 +6542,7 @@
    * @return {@code true} if this type is a subtype of the given type
    */
   bool isSubtypeOf(Type2 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 {@code null} if the look up
@@ -6654,7 +6556,7 @@
    * 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 {@code null} if the look up fails. The
@@ -6675,7 +6577,7 @@
    * 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 {@code null} if the look up
@@ -6696,7 +6598,7 @@
    * 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 {@code null} if the look up fails. The
@@ -6716,7 +6618,7 @@
    * 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 {@code null} if the look up
@@ -6736,7 +6638,7 @@
    * 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 {@code null} if the look up fails. The
@@ -6757,7 +6659,7 @@
    * 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 {@code null} if the look up
@@ -6778,7 +6680,7 @@
    * 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 {@code substitute(argumentTypes, getTypeArguments())}.
@@ -6788,14 +6690,13 @@
   InterfaceType substitute5(List<Type2> argumentTypes);
   InterfaceType substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes);
 }
-
 /**
  * The interface {@code ParameterizedType} defines the behavior common to objects representing the
  * type with type parameters, such as class and function type alias.
  * @coverage dart.engine.type
  */
 abstract class ParameterizedType implements Type2 {
-  
+
   /**
    * 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
@@ -6805,28 +6706,27 @@
    * @return the actual types of the type arguments
    */
   List<Type2> get typeArguments;
-  
+
   /**
    * Return an array containing all of the type variables declared for this type.
    * @return the type variables declared for this type
    */
   List<TypeVariableElement> get typeVariables;
 }
-
 /**
  * The interface {@code Type} defines the behavior of objects representing the declared type of
  * elements in the element model.
  * @coverage dart.engine.type
  */
 abstract class Type2 {
-  
+
   /**
    * 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 {@code null} if the type has
    * not, or cannot, be associated with an element. The former case will occur if the element model
@@ -6834,7 +6734,7 @@
    * @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 {@code null} if there is no
    * least upper bound.
@@ -6842,14 +6742,14 @@
    * @return the least upper bound of this type and the given type
    */
   Type2 getLeastUpperBound(Type2 type);
-  
+
   /**
    * Return the name of this type, or {@code 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 {@code 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>
@@ -6858,7 +6758,7 @@
    * @return {@code true} if this type is assignable to the given type
    */
   bool isAssignableTo(Type2 type);
-  
+
   /**
    * Return {@code true} if this type represents the type 'Function' defined in the dart:core
    * library.
@@ -6866,33 +6766,33 @@
    * library
    */
   bool isDartCoreFunction();
-  
+
   /**
    * Return {@code true} if this type represents the type 'dynamic'.
    * @return {@code true} if this type represents the type 'dynamic'
    */
   bool isDynamic();
-  
+
   /**
    * Return {@code true} if this type is more specific than the given type.
    * @param type the type being compared with this type
    * @return {@code true} if this type is more specific than the given type
    */
   bool isMoreSpecificThan(Type2 type);
-  
+
   /**
    * Return {@code true} if this type represents the type 'Object'.
    * @return {@code true} if this type represents the type 'Object'
    */
   bool isObject();
-  
+
   /**
    * Return {@code true} if this type is a subtype of the given type.
    * @param type the type being compared with this type
    * @return {@code true} if this type is a subtype of the given type
    */
   bool isSubtypeOf(Type2 type);
-  
+
   /**
    * Return {@code 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>.
@@ -6900,13 +6800,13 @@
    * @return {@code true} if this type is a supertype of the given type
    */
   bool isSupertypeOf(Type2 type);
-  
+
   /**
    * Return {@code true} if this type represents the type 'void'.
    * @return {@code true} if this type represents the type 'void'
    */
   bool 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
@@ -6921,7 +6821,6 @@
    */
   Type2 substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes);
 }
-
 /**
  * The interface {@code TypeVariableType} defines the behavior of objects representing the type
  * introduced by a type variable.
@@ -6930,7 +6829,6 @@
 abstract class TypeVariableType implements Type2 {
   TypeVariableElement get element;
 }
-
 /**
  * The interface {@code VoidType} defines the behavior of the unique object representing the type{@code void}.
  * @coverage dart.engine.type
diff --git a/pkg/analyzer_experimental/lib/src/generated/engine.dart b/pkg/analyzer_experimental/lib/src/generated/engine.dart
index 8ecb091..52df59f 100644
--- a/pkg/analyzer_experimental/lib/src/generated/engine.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/engine.dart
@@ -1,8 +1,6 @@
 // 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;
-
 import 'dart:collection' show HasNextIterator;
 import 'java_core.dart';
 import 'java_engine.dart';
@@ -16,41 +14,39 @@
 import 'element.dart';
 import 'resolver.dart';
 import 'html.dart' show XmlTagNode, XmlAttributeNode, RecursiveXmlVisitor, HtmlScanner, HtmlScanResult, HtmlParser, HtmlParseResult, HtmlUnit;
-
-
 /**
  * The unique instance of the class {@code AnalysisEngine} serves as the entry point for the
  * functionality provided by the analysis engine.
  * @coverage dart.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 {@code true} if the given file name is assumed to contain Dart source code.
    * @param fileName the name of the file being tested
@@ -62,7 +58,7 @@
     }
     return javaStringEqualsIgnoreCase(FileNameUtilities.getExtension(fileName), SUFFIX_DART);
   }
-  
+
   /**
    * Return {@code true} if the given file name is assumed to contain HTML.
    * @param fileName the name of the file being tested
@@ -75,12 +71,12 @@
     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;
-  
+
   /**
    * Create a new context in which analysis can be performed.
    * @return the analysis context that was created
@@ -92,13 +88,13 @@
       return new InstrumentedAnalysisContextImpl.con1(new DelegatingAnalysisContextImpl());
     }
   }
-  
+
   /**
    * 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.
@@ -109,7 +105,6 @@
     this._logger = logger2 == null ? Logger.NULL : logger2;
   }
 }
-
 /**
  * The interface {@code AnalysisContext} defines the behavior of objects that represent a context in
  * which a single analysis can be performed and incrementally maintained. The context includes such
@@ -143,14 +138,14 @@
  * proposed future state, such as the state after a refactoring.
  */
 abstract class AnalysisContext {
-  
+
   /**
    * Apply the changes specified by the given change set to this context. Any analysis results that
    * have been invalidated by these changes will be removed.
    * @param changeSet a description of the changes that are to be applied
    */
   void applyChanges(ChangeSet changeSet);
-  
+
   /**
    * Return the documentation comment for the given element as it appears in the original source
    * (complete with the beginning and ending delimiters), or {@code null} if the element does not
@@ -162,7 +157,7 @@
    * analysis could not be performed
    */
   String computeDocumentationComment(Element element);
-  
+
   /**
    * Return an array containing all of the errors associated with the given source. If the errors
    * are not already known then the source will be analyzed in order to determine the errors
@@ -174,7 +169,7 @@
    * @see #getErrors(Source)
    */
   List<AnalysisError> computeErrors(Source source);
-  
+
   /**
    * Return the element model corresponding to the HTML file defined by the given source. If the
    * element model does not yet exist it will be created. The process of creating an element model
@@ -188,7 +183,7 @@
    * @see #getHtmlElement(Source)
    */
   HtmlElement computeHtmlElement(Source source);
-  
+
   /**
    * Return the kind of the given source, computing it's kind if it is not already known. Return{@link SourceKind#UNKNOWN} if the source is not contained in this context.
    * @param source the source whose kind is to be returned
@@ -196,7 +191,7 @@
    * @see #getKindOf(Source)
    */
   SourceKind computeKindOf(Source source);
-  
+
   /**
    * Return the element model corresponding to the library defined by the given source. If the
    * element model does not yet exist it will be created. The process of creating an element model
@@ -209,7 +204,7 @@
    * @see #getLibraryElement(Source)
    */
   LibraryElement computeLibraryElement(Source source);
-  
+
   /**
    * Return the line information for the given source, or {@code null} if the source is not of a
    * recognized kind (neither a Dart nor HTML file). If the line information was not previously
@@ -222,7 +217,7 @@
    * @see #getLineInfo(Source)
    */
   LineInfo computeLineInfo(Source source);
-  
+
   /**
    * Create a new context in which analysis can be performed. Any sources in the specified container
    * will be removed from this context and added to the newly created context.
@@ -231,13 +226,13 @@
    * @return the analysis context that was created
    */
   AnalysisContext extractContext(SourceContainer container);
-  
+
   /**
    * Return the set of analysis options controlling the behavior of this context.
    * @return the set of analysis options controlling the behavior of this context
    */
   AnalysisOptions get analysisOptions;
-  
+
   /**
    * Return the element referenced by the given location, or {@code null} if the element is not
    * immediately available or if there is no element with the given location. The latter condition
@@ -248,7 +243,7 @@
    * @return the element referenced by the given location
    */
   Element getElement(ElementLocation location);
-  
+
   /**
    * Return an analysis error info containing the array of all of the errors and the line info
    * associated with the given source. The array of errors will be empty if the source is not known
@@ -259,7 +254,7 @@
    * @see #computeErrors(Source)
    */
   AnalysisErrorInfo getErrors(Source source);
-  
+
   /**
    * Return the element model corresponding to the HTML file defined by the given source, or{@code null} if the source does not represent an HTML file, the element representing the file
    * has not yet been created, or the analysis of the HTML file failed for some reason.
@@ -268,7 +263,7 @@
    * @see #computeHtmlElement(Source)
    */
   HtmlElement getHtmlElement(Source source);
-  
+
   /**
    * Return the sources for the HTML files that reference the given compilation unit. If the source
    * does not represent a Dart source or is not known to this context, the returned array will be
@@ -277,14 +272,14 @@
    * @return the sources for the HTML files that reference the given compilation unit
    */
   List<Source> getHtmlFilesReferencing(Source source);
-  
+
   /**
    * Return an array containing all of the sources known to this context that represent HTML files.
    * The contents of the array can be incomplete.
    * @return the sources known to this context that represent HTML files
    */
   List<Source> get htmlSources;
-  
+
   /**
    * Return the kind of the given source, or {@code null} if the kind is not known to this context.
    * @param source the source whose kind is to be returned
@@ -292,7 +287,7 @@
    * @see #computeKindOf(Source)
    */
   SourceKind getKindOf(Source source);
-  
+
   /**
    * Return an array containing all of the sources known to this context that represent the defining
    * compilation unit of a library that can be run within a browser. The sources that are returned
@@ -303,7 +298,7 @@
    * library that can be run within a browser
    */
   List<Source> get launchableClientLibrarySources;
-  
+
   /**
    * Return an array containing all of the sources known to this context that represent the defining
    * compilation unit of a library that can be run outside of a browser. The contents of the array
@@ -312,7 +307,7 @@
    * library that can be run outside of a browser
    */
   List<Source> get launchableServerLibrarySources;
-  
+
   /**
    * Return the sources for the defining compilation units of any libraries of which the given
    * source is a part. The array will normally contain a single library because most Dart sources
@@ -325,7 +320,7 @@
    * @return the sources for the libraries containing the given source
    */
   List<Source> getLibrariesContaining(Source source);
-  
+
   /**
    * Return the sources for the defining compilation units of any libraries that depend on the given
    * library. One library depends on another if it either imports or exports that library.
@@ -334,7 +329,7 @@
    * @return the sources for the libraries that depend on the given library
    */
   List<Source> getLibrariesDependingOn(Source librarySource);
-  
+
   /**
    * Return the element model corresponding to the library defined by the given source, or{@code null} if the element model does not currently exist or if the library cannot be analyzed
    * for some reason.
@@ -342,7 +337,7 @@
    * @return the element model corresponding to the library defined by the given source
    */
   LibraryElement getLibraryElement(Source source);
-  
+
   /**
    * Return an array containing all of the sources known to this context that represent the defining
    * compilation unit of a library. The contents of the array can be incomplete.
@@ -350,7 +345,7 @@
    * library
    */
   List<Source> get librarySources;
-  
+
   /**
    * Return the line information for the given source, or {@code null} if the line information is
    * not known. The line information is used to map offsets from the beginning of the source to line
@@ -360,7 +355,7 @@
    * @see #computeLineInfo(Source)
    */
   LineInfo getLineInfo(Source source);
-  
+
   /**
    * Return a fully resolved AST for a single compilation unit within the given library, or{@code null} if the resolved AST is not already computed.
    * @param unitSource the source of the compilation unit
@@ -369,7 +364,7 @@
    * @see #resolveCompilationUnit(Source,LibraryElement)
    */
   CompilationUnit getResolvedCompilationUnit(Source unitSource, LibraryElement library);
-  
+
   /**
    * Return a fully resolved AST for a single compilation unit within the given library, or{@code null} if the resolved AST is not already computed.
    * @param unitSource the source of the compilation unit
@@ -379,13 +374,13 @@
    * @see #resolveCompilationUnit(Source,Source)
    */
   CompilationUnit getResolvedCompilationUnit2(Source unitSource, Source librarySource);
-  
+
   /**
    * Return the source factory used to create the sources that can be analyzed in this context.
    * @return the source factory used to create the sources that can be analyzed in this context
    */
   SourceFactory get sourceFactory;
-  
+
   /**
    * Return {@code true} if the given source is known to be the defining compilation unit of a
    * library that can be run on a client (references 'dart:html', either directly or indirectly).
@@ -397,7 +392,7 @@
    * @return {@code true} if the given source is known to be a library that can be run on a client
    */
   bool isClientLibrary(Source librarySource);
-  
+
   /**
    * Return {@code true} if the given source is known to be the defining compilation unit of a
    * library that can be run on the server (does not reference 'dart:html', either directly or
@@ -411,7 +406,7 @@
    * @return {@code true} if the given source is known to be a library that can be run on the server
    */
   bool isServerLibrary(Source librarySource);
-  
+
   /**
    * Add the sources contained in the specified context to this context's collection of sources.
    * This method is called when an existing context's pubspec has been removed, and the contained
@@ -419,7 +414,7 @@
    * @param context the context being merged
    */
   void mergeContext(AnalysisContext context);
-  
+
   /**
    * Parse a single source to produce an AST structure. The resulting AST structure may or may not
    * be resolved, and may have a slightly different structure depending upon whether it is resolved.
@@ -428,7 +423,7 @@
    * @throws AnalysisException if the analysis could not be performed
    */
   CompilationUnit parseCompilationUnit(Source source);
-  
+
   /**
    * Parse a single HTML source to produce an AST structure. The resulting HTML AST structure may or
    * may not be resolved, and may have a slightly different structure depending upon whether it is
@@ -438,7 +433,7 @@
    * @throws AnalysisException if the analysis could not be performed
    */
   HtmlUnit parseHtmlUnit(Source source);
-  
+
   /**
    * Perform the next unit of work required to keep the analysis results up-to-date and return
    * information about the consequent changes to the analysis results. If there were no results the
@@ -447,7 +442,7 @@
    * @return an array containing notices of changes to the analysis results
    */
   List<ChangeNotice> performAnalysisTask();
-  
+
   /**
    * Parse and resolve a single source within the given context to produce a fully resolved AST.
    * @param unitSource the source to be parsed and resolved
@@ -458,7 +453,7 @@
    * @see #getResolvedCompilationUnit(Source,LibraryElement)
    */
   CompilationUnit resolveCompilationUnit(Source unitSource, LibraryElement library);
-  
+
   /**
    * Parse and resolve a single source within the given context to produce a fully resolved AST.
    * @param unitSource the source to be parsed and resolved
@@ -470,7 +465,7 @@
    * @see #getResolvedCompilationUnit(Source,Source)
    */
   CompilationUnit resolveCompilationUnit2(Source unitSource, Source librarySource);
-  
+
   /**
    * Parse and resolve a single source within the given context to produce a fully resolved AST.
    * @param htmlSource the source to be parsed and resolved
@@ -478,14 +473,14 @@
    * @throws AnalysisException if the analysis could not be performed
    */
   HtmlUnit resolveHtmlUnit(Source htmlSource);
-  
+
   /**
    * Set the set of analysis options controlling the behavior of this context to the given options.
    * Clients can safely assume that all necessary analysis results have been invalidated.
    * @param options the set of analysis options that will control the behavior of this context
    */
   void set analysisOptions(AnalysisOptions options);
-  
+
   /**
    * Set the contents of the given source to the given contents and mark the source as having
    * changed. This has the effect of overriding the default contents of the source. If the contents
@@ -494,7 +489,7 @@
    * @param contents the new contents of the source
    */
   void setContents(Source source, String contents);
-  
+
   /**
    * Set the source factory used to create the sources that can be analyzed in this context to the
    * given source factory. Clients can safely assume that all analysis results have been
@@ -503,7 +498,7 @@
    * context
    */
   void set sourceFactory(SourceFactory factory);
-  
+
   /**
    * Given a collection of sources with content that has changed, return an {@link Iterable}identifying the sources that need to be resolved.
    * @param changedSources an array of sources (not {@code null}, contains no {@code null}s)
@@ -511,19 +506,18 @@
    */
   Iterable<Source> sourcesToResolve(List<Source> changedSources);
 }
-
 /**
  * The interface {@code 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 {@code 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 {@code null} if there were no
    * errors.
@@ -531,14 +525,13 @@
    */
   LineInfo get lineInfo;
 }
-
 /**
  * Instances of the class {@code AnalysisException} represent an exception that occurred during the
  * analysis of one or more sources.
  * @coverage dart.engine
  */
 class AnalysisException extends JavaException {
-  
+
   /**
    * Initialize a newly created exception.
    */
@@ -547,7 +540,7 @@
   }
   _jtd_constructor_125_impl() {
   }
-  
+
   /**
    * Initialize a newly created exception to have the given message.
    * @param message the message associated with the exception
@@ -557,7 +550,7 @@
   }
   _jtd_constructor_126_impl(String message) {
   }
-  
+
   /**
    * Initialize a newly created exception to have the given message and cause.
    * @param message the message associated with the exception
@@ -568,7 +561,7 @@
   }
   _jtd_constructor_127_impl(String message, Exception cause) {
   }
-  
+
   /**
    * Initialize a newly created exception to have the given cause.
    * @param cause the underlying exception that caused this exception
@@ -579,13 +572,12 @@
   _jtd_constructor_128_impl(Exception cause) {
   }
 }
-
 /**
  * The interface {@code 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 {@code true} if analysis is to use strict mode. In strict mode, error reporting is based
    * exclusively on the static type information.
@@ -593,55 +585,53 @@
    */
   bool get strictMode;
 }
-
 /**
  * The interface {@code ChangeNotice} defines the behavior of objects that represent a change to the
  * analysis results associated with a given source.
  * @coverage dart.engine
  */
 abstract class ChangeNotice implements AnalysisErrorInfo {
-  
+
   /**
    * Return the fully resolved AST that changed as a result of the analysis, or {@code 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 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 {@code ChangeSet} indicate what sources have been added, changed, or
  * removed.
  * @coverage dart.engine
  */
 class ChangeSet {
-  
+
   /**
    * A list containing the sources that have been added.
    */
   List<Source> _added2 = new List<Source>();
-  
+
   /**
    * A list containing the sources that have been changed.
    */
   List<Source> _changed2 = new List<Source>();
-  
+
   /**
    * A list containing the sources that have been removed.
    */
   List<Source> _removed2 = new List<Source>();
-  
+
   /**
    * A list containing the source containers specifying additional sources that have been removed.
    */
   List<SourceContainer> _removedContainers = new List<SourceContainer>();
-  
+
   /**
    * Record that the specified source has been added and that it's content is the default contents
    * of the source.
@@ -650,7 +640,7 @@
   void added(Source source) {
     _added2.add(source);
   }
-  
+
   /**
    * Record that the specified source has been changed and that it's content is the default contents
    * of the source.
@@ -659,37 +649,37 @@
   void changed(Source source) {
     _changed2.add(source);
   }
-  
+
   /**
    * Return a collection of the sources that have been added.
    * @return a collection of the sources that have been added
    */
   List<Source> get added3 => _added2;
-  
+
   /**
    * Return a collection of sources that have been changed.
    * @return a collection of sources that have been changed
    */
   List<Source> get changed3 => _changed2;
-  
+
   /**
    * Return a list containing the sources that were removed.
    * @return a list containing the sources that were removed
    */
   List<Source> get removed => _removed2;
-  
+
   /**
    * Return a list containing the source containers that were removed.
    * @return a list containing the source containers that were removed
    */
   List<SourceContainer> get removedContainers => _removedContainers;
-  
+
   /**
    * Return {@code true} if this change set does not contain any changes.
    * @return {@code true} if this change set does not contain any changes
    */
   bool isEmpty() => _added2.isEmpty && _changed2.isEmpty && _removed2.isEmpty && _removedContainers.isEmpty;
-  
+
   /**
    * Record that the specified source has been removed.
    * @param source the source that was removed
@@ -699,7 +689,7 @@
       _removed2.add(source);
     }
   }
-  
+
   /**
    * Record that the specified source container has been removed.
    * @param container the source container that was removed
@@ -710,81 +700,80 @@
     }
   }
 }
-
 /**
  * The interface {@code DartEntry} defines the behavior of objects that maintain the information
  * cached by an analysis context about an individual Dart file.
  * @coverage dart.engine
  */
 abstract class DartEntry implements SourceEntry {
-  
+
   /**
    * 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 DataDescriptor<LibraryElement> ELEMENT = new DataDescriptor<LibraryElement>("DartEntry.ELEMENT");
-  
+  static final DataDescriptor<LibraryElement> ELEMENT = new DataDescriptor<LibraryElement>("DartEntry.ELEMENT");
+
   /**
    * The data descriptor representing the list of referenced libraries. This data is only available
    * for Dart files that are the defining compilation unit of a library.
    */
-  static DataDescriptor<List<Source>> REFERENCED_LIBRARIES = new DataDescriptor<List<Source>>("DartEntry.REFERENCED_LIBRARIES");
-  
+  static final DataDescriptor<List<Source>> REFERENCED_LIBRARIES = new DataDescriptor<List<Source>>("DartEntry.REFERENCED_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 DataDescriptor<List<Source>> INCLUDED_PARTS = new DataDescriptor<List<Source>>("DartEntry.INCLUDED_PARTS");
-  
+  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 DataDescriptor<bool> IS_CLIENT = new DataDescriptor<bool>("DartEntry.IS_CLIENT");
-  
+  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 DataDescriptor<bool> IS_LAUNCHABLE = new DataDescriptor<bool>("DartEntry.IS_LAUNCHABLE");
-  
+  static final DataDescriptor<bool> IS_LAUNCHABLE = new DataDescriptor<bool>("DartEntry.IS_LAUNCHABLE");
+
   /**
    * The data descriptor representing the errors resulting from parsing the source.
    */
-  static DataDescriptor<List<AnalysisError>> PARSE_ERRORS = new DataDescriptor<List<AnalysisError>>("DartEntry.PARSE_ERRORS");
-  
+  static final DataDescriptor<List<AnalysisError>> PARSE_ERRORS = new DataDescriptor<List<AnalysisError>>("DartEntry.PARSE_ERRORS");
+
   /**
    * The data descriptor representing the parsed AST structure.
    */
-  static DataDescriptor<CompilationUnit> PARSED_UNIT = new DataDescriptor<CompilationUnit>("DartEntry.PARSED_UNIT");
-  
+  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 DataDescriptor<Namespace> PUBLIC_NAMESPACE = new DataDescriptor<Namespace>("DartEntry.PUBLIC_NAMESPACE");
-  
+  static final DataDescriptor<Namespace> PUBLIC_NAMESPACE = new DataDescriptor<Namespace>("DartEntry.PUBLIC_NAMESPACE");
+
   /**
    * The data descriptor representing the errors resulting from resolving the source.
    */
-  static DataDescriptor<List<AnalysisError>> RESOLUTION_ERRORS = new DataDescriptor<List<AnalysisError>>("DartEntry.RESOLUTION_ERRORS");
-  
+  static final DataDescriptor<List<AnalysisError>> RESOLUTION_ERRORS = new DataDescriptor<List<AnalysisError>>("DartEntry.RESOLUTION_ERRORS");
+
   /**
    * The data descriptor representing the resolved AST structure.
    */
-  static DataDescriptor<CompilationUnit> RESOLVED_UNIT = new DataDescriptor<CompilationUnit>("DartEntry.RESOLVED_UNIT");
-  
+  static final DataDescriptor<CompilationUnit> RESOLVED_UNIT = new DataDescriptor<CompilationUnit>("DartEntry.RESOLVED_UNIT");
+
   /**
    * The data descriptor representing the source kind.
    */
-  static DataDescriptor<SourceKind> SOURCE_KIND = new DataDescriptor<SourceKind>("DartEntry.SOURCE_KIND");
-  
+  static final DataDescriptor<SourceKind> SOURCE_KIND = new DataDescriptor<SourceKind>("DartEntry.SOURCE_KIND");
+
   /**
    * 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 {@code null} if there is no
@@ -792,14 +781,14 @@
    * @return a valid parsed compilation unit
    */
   CompilationUnit get anyParsedCompilationUnit;
-  
+
   /**
    * Return the result of resolving the compilation unit as part of any library, or {@code 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.
@@ -809,7 +798,7 @@
    * @return the value of the data represented by the given descriptor and library
    */
   CacheState getState2(DataDescriptor<Object> descriptor, Source librarySource);
-  
+
   /**
    * Return the value of the data represented by the given descriptor in the context of the given
    * library, or {@code null} if the data represented by the descriptor is not in the cache.
@@ -821,114 +810,113 @@
   Object getValue2(DataDescriptor descriptor, Source librarySource);
   DartEntryImpl get writableCopy;
 }
-
 /**
  * Instances of the class {@code DartEntryImpl} implement a {@link DartEntry}.
  * @coverage dart.engine
  */
 class DartEntryImpl extends SourceEntryImpl implements DartEntry {
-  
+
   /**
    * 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;
-  
+
   /**
    * The parsed compilation unit, or {@code 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 scanning and parsing the compilation unit, or {@code null} if the
    * errors are not currently cached.
    */
   List<AnalysisError> _parseErrors = AnalysisError.NO_ERRORS;
-  
+
   /**
    * 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 state of the cached list of referenced libraries.
    */
   CacheState _referencedLibrariesState = CacheState.INVALID;
-  
+
   /**
    * The list of libraries referenced (imported or 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> _referencedLibraries = Source.EMPTY_ARRAY;
-  
+
   /**
    * 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 {@code null}.
    */
   DartEntryImpl_ResolutionState _resolutionState = new DartEntryImpl_ResolutionState();
-  
+
   /**
    * The state of the cached library element.
    */
   CacheState _elementState = CacheState.INVALID;
-  
+
   /**
    * The element representing the library, or {@code 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 {@code 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;
-  
+
   /**
    * An integer holding bit masks such as {@link #LAUNCHABLE} and {@link #CLIENT_CODE}.
    */
   int _bitmask = 0;
-  
+
   /**
    * Mask indicating that this library is launchable: that the file has a main method.
    */
   static int _LAUNCHABLE = 1 << 1;
-  
+
   /**
    * Mask indicating that the library is client code: that the library depends on the html library.
    * If the library is not "client code", then it is referenced as "server code".
@@ -1060,7 +1048,7 @@
     copy.copyFrom(this);
     return copy;
   }
-  
+
   /**
    * Invalidate all of the information associated with the compilation unit.
    */
@@ -1074,7 +1062,7 @@
     _parsedUnitState = CacheState.INVALID;
     invalidateAllResolutionInformation();
   }
-  
+
   /**
    * Invalidate all of the resolution information associated with the compilation unit.
    */
@@ -1092,7 +1080,7 @@
     _publicNamespaceState = CacheState.INVALID;
     _resolutionState.invalidateAllResolutionInformation();
   }
-  
+
   /**
    * 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,
@@ -1108,7 +1096,7 @@
     _parsedUnitState = CacheState.ERROR;
     recordResolutionError();
   }
-  
+
   /**
    * Record that the parse-related information for the associated source is about to be computed by
    * the current thread.
@@ -1127,7 +1115,7 @@
       _parsedUnitState = CacheState.IN_PROCESS;
     }
   }
-  
+
   /**
    * 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
@@ -1147,7 +1135,7 @@
     _publicNamespaceState = CacheState.ERROR;
     _resolutionState.recordResolutionError();
   }
-  
+
   /**
    * 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.
@@ -1176,7 +1164,7 @@
       }
     }
   }
-  
+
   /**
    * Set the results of parsing the compilation unit at the given time to the given values.
    * @param modificationStamp the earliest time at which the source was last modified before the
@@ -1228,7 +1216,7 @@
       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.
@@ -1289,7 +1277,7 @@
       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 {@link CacheState#VALID}.
@@ -1330,7 +1318,7 @@
     _launchableState = other._launchableState;
     _bitmask = other._bitmask;
   }
-  
+
   /**
    * Return a resolution state for the specified library, creating one as necessary.
    * @param librarySource the library source (not {@code null})
@@ -1353,7 +1341,7 @@
     }
     return state;
   }
-  
+
   /**
    * Given that one of the flags is being transitioned to the given state, return the value of the
    * flags that should be kept in the cache.
@@ -1371,47 +1359,46 @@
     return currentValue &= ~bitMask;
   }
 }
-
 /**
  * Instances of the class {@code ResolutionState} represent the information produced by resolving
  * a compilation unit as part of a specific library.
  */
 class DartEntryImpl_ResolutionState {
-  
+
   /**
    * The next resolution state or {@code 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 resolved compilation unit.
    */
   CacheState _resolvedUnitState = CacheState.INVALID;
-  
+
   /**
    * The resolved compilation unit, or {@code 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 {@code null} if the errors are
    * not currently cached.
    */
   List<AnalysisError> _resolutionErrors = AnalysisError.NO_ERRORS;
-  
+
   /**
    * Set this state to be exactly like the given state, recursively copying the next state as
    * necessary.
@@ -1428,7 +1415,7 @@
       _nextState.copyFrom(other._nextState);
     }
   }
-  
+
   /**
    * Invalidate all of the resolution information associated with the compilation unit.
    */
@@ -1440,7 +1427,7 @@
     _resolutionErrorsState = CacheState.INVALID;
     _resolutionErrors = 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
@@ -1455,18 +1442,17 @@
     _resolutionErrors = AnalysisError.NO_ERRORS;
   }
 }
-
 /**
  * Instances of the class {@code 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.
    */
   String _name;
-  
+
   /**
    * Initialize a newly created descriptor to have the given name.
    * @param name the name of the descriptor
@@ -1476,39 +1462,38 @@
   }
   String toString() => _name;
 }
-
 /**
  * The interface {@code HtmlEntry} defines the behavior of objects that maintain the information
  * cached by an analysis context about an individual HTML file.
  * @coverage dart.engine
  */
 abstract class HtmlEntry implements SourceEntry {
-  
+
   /**
    * The data descriptor representing the HTML element.
    */
-  static DataDescriptor<HtmlElement> ELEMENT = new DataDescriptor<HtmlElement>("HtmlEntry.ELEMENT");
-  
+  static final DataDescriptor<HtmlElement> ELEMENT = new DataDescriptor<HtmlElement>("HtmlEntry.ELEMENT");
+
   /**
    * The data descriptor representing the parsed AST structure.
    */
-  static DataDescriptor<HtmlUnit> PARSED_UNIT = new DataDescriptor<HtmlUnit>("HtmlEntry.PARSED_UNIT");
-  
+  static final DataDescriptor<HtmlUnit> PARSED_UNIT = new DataDescriptor<HtmlUnit>("HtmlEntry.PARSED_UNIT");
+
   /**
    * The data descriptor representing the list of referenced libraries.
    */
-  static DataDescriptor<List<Source>> REFERENCED_LIBRARIES = new DataDescriptor<List<Source>>("HtmlEntry.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 DataDescriptor<List<AnalysisError>> RESOLUTION_ERRORS = new DataDescriptor<List<AnalysisError>>("HtmlEntry.RESOLUTION_ERRORS");
-  
+  static final DataDescriptor<List<AnalysisError>> RESOLUTION_ERRORS = new DataDescriptor<List<AnalysisError>>("HtmlEntry.RESOLUTION_ERRORS");
+
   /**
    * The data descriptor representing the resolved AST structure.
    */
-  static DataDescriptor<HtmlUnit> RESOLVED_UNIT = new DataDescriptor<HtmlUnit>("HtmlEntry.RESOLVED_UNIT");
-  
+  static final DataDescriptor<HtmlUnit> RESOLVED_UNIT = new DataDescriptor<HtmlUnit>("HtmlEntry.RESOLVED_UNIT");
+
   /**
    * Return all of the errors associated with the compilation unit that are currently cached.
    * @return all of the errors associated with the compilation unit
@@ -1516,60 +1501,59 @@
   List<AnalysisError> get allErrors;
   HtmlEntryImpl get writableCopy;
 }
-
 /**
  * Instances of the class {@code HtmlEntryImpl} implement an {@link HtmlEntry}.
  * @coverage dart.engine
  */
 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 {@code null} if the parsed HTML unit is not currently cached.
    */
   HtmlUnit _parsedUnit;
-  
+
   /**
    * The state of the cached resolution errors.
    */
   CacheState _resolutionErrorsState = CacheState.INVALID;
-  
+
   /**
    * The errors produced while resolving the compilation unit, or {@code null} if the errors are not
    * currently cached.
    */
   List<AnalysisError> _resolutionErrors = AnalysisError.NO_ERRORS;
-  
+
   /**
    * The state of the cached parsed and resolved HTML unit.
    */
   CacheState _resolvedUnitState = CacheState.INVALID;
-  
+
   /**
    * The resolved HTML unit, or {@code null} if the resolved HTML unit is not currently cached.
    */
   HtmlUnit _resolvedUnit;
-  
+
   /**
    * The state of the cached list of referenced libraries.
    */
   CacheState _referencedLibrariesState = CacheState.INVALID;
-  
+
   /**
    * The list of libraries referenced in the HTML, or {@code 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 {@code null} if the element is not currently cached.
    */
@@ -1673,7 +1657,6 @@
     _element = other._element;
   }
 }
-
 /**
  * The interface {@code 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.
@@ -1683,32 +1666,32 @@
  * @coverage dart.engine
  */
 abstract class SourceEntry {
-  
+
   /**
    * The data descriptor representing the line information.
    */
-  static DataDescriptor<LineInfo> LINE_INFO = new DataDescriptor<LineInfo>("SourceEntry.LINE_INFO");
-  
+  static final DataDescriptor<LineInfo> LINE_INFO = new DataDescriptor<LineInfo>("SourceEntry.LINE_INFO");
+
   /**
    * Return the kind of the source, or {@code 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<Object> descriptor);
-  
+
   /**
    * Return the value of the data represented by the given descriptor, or {@code null} if the data
    * represented by the descriptor is not in the cache.
@@ -1716,7 +1699,7 @@
    * @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.
@@ -1724,24 +1707,23 @@
    */
   SourceEntryImpl get writableCopy;
 }
-
 /**
  * Instances of the abstract class {@code SourceEntryImpl} implement the behavior common to all{@link SourceEntry source entries}.
  * @coverage dart.engine
  */
 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;
-  
+
   /**
    * The state of the cached line information.
    */
   CacheState _lineInfoState = CacheState.INVALID;
-  
+
   /**
    * The line information computed for the source, or {@code null} if the line information is not
    * currently cached.
@@ -1762,7 +1744,7 @@
       throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
     }
   }
-  
+
   /**
    * Set the most recent time at which the state of the source matched the state represented by this
    * entry to the given time.
@@ -1771,7 +1753,7 @@
   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
@@ -1785,7 +1767,7 @@
       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
@@ -1799,7 +1781,7 @@
       throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
     }
   }
-  
+
   /**
    * Copy the information from the given cache entry.
    * @param entry the cache entry from which information will be copied
@@ -1809,7 +1791,7 @@
     _lineInfoState = entry._lineInfoState;
     _lineInfo = entry._lineInfo;
   }
-  
+
   /**
    * Given that some data is being transitioned to the given state, return the value that should be
    * kept in the cache.
@@ -1827,62 +1809,72 @@
     return defaultValue;
   }
 }
-
 /**
  * Instances of the class {@code AnalysisContextImpl} implement an {@link AnalysisContext analysis
  * context}.
  * @coverage dart.engine
  */
 class AnalysisContextImpl implements InternalAnalysisContext {
-  
+
   /**
    * The set of analysis options controlling the behavior of this context.
    */
   AnalysisOptions _options = new AnalysisOptionsImpl();
-  
+
   /**
    * The source factory used to create the sources that can be analyzed in this context.
    */
   SourceFactory _sourceFactory;
-  
+
   /**
    * A table mapping the sources known to the context to the information known about the source.
    */
   Map<Source, SourceEntry> _sourceMap = new Map<Source, SourceEntry>();
-  
+
   /**
    * A table mapping sources to the change notices that are waiting to be returned related to that
    * source.
    */
   Map<Source, ChangeNoticeImpl> _pendingNotices = new Map<Source, ChangeNoticeImpl>();
-  
+
   /**
    * 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 = new List<Source>();
-  
+
   /**
    * The object used to synchronize access to all of the caches.
    */
   Object _cacheLock = new Object();
-  
+
   /**
    * The maximum number of sources for which data should be kept in the cache.
    */
   static int _MAX_CACHE_SIZE = 64;
-  
+
   /**
    * The name of the 'src' attribute in a HTML tag.
    */
   static String _ATTRIBUTE_SRC = "src";
-  
+
+  /**
+   * The name of the 'type' attribute in a HTML tag.
+   */
+  static String _ATTRIBUTE_TYPE = "type";
+
   /**
    * The name of the 'script' tag in an HTML file.
    */
   static String _TAG_SCRIPT = "script";
-  
+
+  /**
+   * The value of the 'type' attribute of a 'script' tag that indicates that the script is written
+   * in Dart.
+   */
+  static String _TYPE_DART = "application/dart";
+
   /**
    * The number of times that the flushing of information from the cache has been disabled without
    * being re-enabled.
@@ -2036,9 +2028,6 @@
     }
   }
   LibraryElement computeLibraryElement(Source source) {
-    if (!AnalysisEngine.isDartFileName(source.shortName)) {
-      return null;
-    }
     {
       DartEntry dartEntry = getDartEntry(source);
       if (dartEntry == null) {
@@ -2511,7 +2500,7 @@
     }
     return librarySources;
   }
-  
+
   /**
    * Return a list of the sources that would be processed by {@link #performAnalysisTask()}. This
    * method is intended to be used for testing purposes only.
@@ -2541,7 +2530,7 @@
     }
     return sources;
   }
-  
+
   /**
    * Record that the given source was just accessed for some unspecified purpose.
    * <p>
@@ -2573,7 +2562,7 @@
     }
     _recentlyUsed.add(source);
   }
-  
+
   /**
    * Add all of the sources contained in the given source container to the given list of sources.
    * <p>
@@ -2588,7 +2577,7 @@
       }
     }
   }
-  
+
   /**
    * Return {@code true} if the given array of sources contains the given source.
    * @param sources the sources being searched
@@ -2603,7 +2592,7 @@
     }
     return false;
   }
-  
+
   /**
    * Return {@code true} if the given array of sources contains any of the given target sources.
    * @param sources the sources being searched
@@ -2618,7 +2607,7 @@
     }
     return false;
   }
-  
+
   /**
    * Create a source information object suitable for the given source. Return the source information
    * object that was created, or {@code null} if the source should not be tracked by this context.
@@ -2631,14 +2620,13 @@
       HtmlEntry htmlEntry = new HtmlEntryImpl();
       _sourceMap[source] = htmlEntry;
       return htmlEntry;
-    } else if (AnalysisEngine.isDartFileName(name)) {
+    } else {
       DartEntry dartEntry = new DartEntryImpl();
       _sourceMap[source] = dartEntry;
       return dartEntry;
     }
-    return null;
   }
-  
+
   /**
    * Disable flushing information from the cache until {@link #enableCacheRemoval()} has been
    * called.
@@ -2646,7 +2634,7 @@
   void disableCacheRemoval() {
     _cacheRemovalCount++;
   }
-  
+
   /**
    * Re-enable flushing information from the cache.
    */
@@ -2674,7 +2662,7 @@
       }
     }
   }
-  
+
   /**
    * Search the compilation units that are part of the given library and return the element
    * representing the compilation unit with the given source. Return {@code null} if there is no
@@ -2695,7 +2683,7 @@
     }
     return null;
   }
-  
+
   /**
    * Return the compilation unit information associated with the given source, or {@code null} if
    * the source is not known to this context. This method should be used to access the compilation
@@ -2718,7 +2706,7 @@
     }
     return null;
   }
-  
+
   /**
    * Return the HTML unit information associated with the given source, or {@code null} if the
    * source is not known to this context. This method should be used to access the HTML unit
@@ -2741,7 +2729,7 @@
     }
     return null;
   }
-  
+
   /**
    * Return the sources of libraries that are referenced in the specified HTML file.
    * @param htmlSource the source of the HTML file being analyzed
@@ -2756,7 +2744,7 @@
     }
     return new List.from(libraries);
   }
-  
+
   /**
    * Return a change notice for the given source, creating one if one does not already exist.
    * @param source the source for which changes are being reported
@@ -2770,7 +2758,7 @@
     }
     return notice;
   }
-  
+
   /**
    * Return the cache entry associated with the given source, or {@code null} if there is no entry
    * associated with the source.
@@ -2782,7 +2770,7 @@
       return _sourceMap[source];
     }
   }
-  
+
   /**
    * Return the source information associated with the given source, or {@code null} if the source
    * is not known to this context. This method should be used to access the source information
@@ -2800,7 +2788,7 @@
     }
     return sourceEntry;
   }
-  
+
   /**
    * Return an array containing all of the sources known to this context that have the given kind.
    * @param kind the kind of sources to be returned
@@ -2817,7 +2805,7 @@
     }
     return new List.from(sources);
   }
-  
+
   /**
    * Return {@code true} if the given compilation unit has a part-of directive but no library
    * directive.
@@ -2835,7 +2823,7 @@
     }
     return hasPartOf;
   }
-  
+
   /**
    * Compute the kind of the given source. This method should only be invoked when the kind is not
    * already known.
@@ -2913,7 +2901,7 @@
     }
     return result;
   }
-  
+
   /**
    * Invalidate all of the results computed by this context.
    * <p>
@@ -2933,7 +2921,7 @@
       }
     }
   }
-  
+
   /**
    * In response to a change to at least one of the compilation units in the given library,
    * invalidate any results that are dependent on the result of resolving that library.
@@ -2957,7 +2945,7 @@
       }
     }
   }
-  
+
   /**
    * Return {@code true} if this library is, or depends on, dart:html.
    * @param library the library being tested
@@ -2985,7 +2973,7 @@
     }
     return false;
   }
-  
+
   /**
    * Perform a single analysis task.
    * <p>
@@ -3059,7 +3047,7 @@
     }
     return false;
   }
-  
+
   /**
    * Given a cache entry and a library element, record the library element and other information
    * gleaned from the element in the cache entry.
@@ -3079,7 +3067,7 @@
     }
     dartCopy.setValue(DartEntry.INCLUDED_PARTS, new List.from(unitSources));
   }
-  
+
   /**
    * Record the result of using the given resolver to resolve one or more libraries.
    * @param resolver the resolver that has the needed results
@@ -3138,7 +3126,7 @@
     }
     return scanner.result;
   }
-  
+
   /**
    * Create an entry for the newly added source. Return {@code true} if the new source is a Dart
    * file.
@@ -3154,7 +3142,7 @@
     }
     return sourceEntry is DartEntry;
   }
-  
+
   /**
    * <b>Note:</b> This method must only be invoked while we are synchronized on {@link #cacheLock}.
    * @param source the source that has been changed
@@ -3183,7 +3171,7 @@
       }
     }
   }
-  
+
   /**
    * <b>Note:</b> This method must only be invoked while we are synchronized on {@link #cacheLock}.
    * @param source the source that has been deleted
@@ -3205,22 +3193,21 @@
     _sourceMap.remove(source);
   }
 }
-
 /**
  * Instances of the class {@code ScanResult} represent the results of scanning a source.
  */
 class AnalysisContextImpl_ScanResult {
-  
+
   /**
    * The time at which the contents of the source were last set.
    */
   int _modificationTime = 0;
-  
+
   /**
    * The first token in the token stream.
    */
   Token _token;
-  
+
   /**
    * The line start information that was produced.
    */
@@ -3243,22 +3230,29 @@
   RecursiveXmlVisitor_7(this.AnalysisContextImpl_this, this.htmlSource, this.libraries) : super();
   Object visitXmlTagNode(XmlTagNode node) {
     if (javaStringEqualsIgnoreCase(node.tag.lexeme, AnalysisContextImpl._TAG_SCRIPT)) {
+      bool isDartScript = false;
+      XmlAttributeNode scriptAttribute = null;
       for (XmlAttributeNode attribute in node.attributes) {
         if (javaStringEqualsIgnoreCase(attribute.name.lexeme, AnalysisContextImpl._ATTRIBUTE_SRC)) {
-          try {
-            Uri uri = new Uri(path: attribute.text);
-            String fileName = uri.path;
-            if (AnalysisEngine.isDartFileName(fileName)) {
-              Source librarySource = AnalysisContextImpl_this._sourceFactory.resolveUri(htmlSource, fileName);
-              if (librarySource.exists()) {
-                libraries.add(librarySource);
-              }
-            }
-          } catch (exception) {
-            AnalysisEngine.instance.logger.logError2("Invalid URL ('${attribute.text}') in script tag in '${htmlSource.fullName}'", exception);
+          scriptAttribute = attribute;
+        } else if (javaStringEqualsIgnoreCase(attribute.name.lexeme, AnalysisContextImpl._ATTRIBUTE_TYPE)) {
+          if (javaStringEqualsIgnoreCase(attribute.text, AnalysisContextImpl._TYPE_DART)) {
+            isDartScript = true;
           }
         }
       }
+      if (isDartScript && scriptAttribute != null) {
+        try {
+          Uri uri = new Uri(path: scriptAttribute.text);
+          String fileName = uri.path;
+          Source librarySource = AnalysisContextImpl_this._sourceFactory.resolveUri(htmlSource, fileName);
+          if (librarySource.exists()) {
+            libraries.add(librarySource);
+          }
+        } catch (exception) {
+          AnalysisEngine.instance.logger.logError2("Invalid URL ('${scriptAttribute.text}') in script tag in '${htmlSource.fullName}'", exception);
+        }
+      }
     }
     return super.visitXmlTagNode(node);
   }
@@ -3281,23 +3275,22 @@
     result._lineStarts = scanner.lineStarts;
   }
 }
-
 /**
  * Instances of the class {@code AnalysisErrorInfoImpl} represent the analysis errors and line info
  * associated with a source.
  */
 class AnalysisErrorInfoImpl implements AnalysisErrorInfo {
-  
+
   /**
    * The analysis errors associated with a source, or {@code null} if there are no errors.
    */
   List<AnalysisError> _errors;
-  
+
   /**
    * The line information associated with the errors, or {@code null} if there are no errors.
    */
   LineInfo _lineInfo;
-  
+
   /**
    * Initialize an newly created error info with the errors and line information
    * @param errors the errors as a result of analysis
@@ -3307,13 +3300,13 @@
     this._errors = errors;
     this._lineInfo = lineInfo;
   }
-  
+
   /**
    * Return the errors of analysis, or {@code null} if there were no errors.
    * @return the errors as a result of the analysis
    */
   List<AnalysisError> get errors => _errors;
-  
+
   /**
    * Return the line information associated with the errors, or {@code null} if there were no
    * errors.
@@ -3321,26 +3314,25 @@
    */
   LineInfo get lineInfo => _lineInfo;
 }
-
 /**
  * Instances of the class {@code AnalysisOptions} represent a set of analysis options used to
  * control the behavior of an analysis context.
  */
 class AnalysisOptionsImpl implements AnalysisOptions {
-  
+
   /**
    * A flag indicating whether analysis is to use strict mode. In strict mode, error reporting is
    * based exclusively on the static type information.
    */
   bool _strictMode = false;
-  
+
   /**
    * Return {@code true} if analysis is to use strict mode. In strict mode, error reporting is based
    * exclusively on the static type information.
    * @return {@code true} if analysis is to use strict mode
    */
   bool get strictMode => _strictMode;
-  
+
   /**
    * Set whether analysis is to use strict mode to the given value. In strict mode, error reporting
    * is based exclusively on the static type information.
@@ -3350,12 +3342,11 @@
     _strictMode = isStrict;
   }
 }
-
 /**
  * The enumeration {@code CacheState} defines the possible states of cached data.
  */
 class CacheState implements Comparable<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.
@@ -3366,7 +3357,7 @@
    * </ul>
    */
   static final CacheState ERROR = new 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.
@@ -3378,7 +3369,7 @@
    * </ul>
    */
   static final CacheState FLUSHED = new CacheState('FLUSHED', 1);
-  
+
   /**
    * The data might or might not be in the cache but is in the process of being recomputed.
    * <p>
@@ -3389,7 +3380,7 @@
    * </ul>
    */
   static final CacheState IN_PROCESS = new CacheState('IN_PROCESS', 2);
-  
+
   /**
    * The data is not in the cache and needs to be recomputed so that results can be reported.
    * <p>
@@ -3399,7 +3390,7 @@
    * </ul>
    */
   static final CacheState INVALID = new CacheState('INVALID', 3);
-  
+
   /**
    * The data is in the cache and up-to-date.
    * <p>
@@ -3411,10 +3402,10 @@
    */
   static final CacheState VALID = new CacheState('VALID', 4);
   static final List<CacheState> values = [ERROR, FLUSHED, IN_PROCESS, INVALID, VALID];
-  
+
   /// The name of this enum constant, as declared in the enum declaration.
   final String name;
-  
+
   /// The position in the enum declaration.
   final int ordinal;
   CacheState(this.name, this.ordinal) {
@@ -3422,41 +3413,40 @@
   int compareTo(CacheState other) => ordinal - other.ordinal;
   String toString() => name;
 }
-
 /**
  * Instances of the class {@code ChangeNoticeImpl} represent a change to the analysis results
  * associated with a given source.
  * @coverage dart.engine
  */
 class ChangeNoticeImpl implements ChangeNotice {
-  
+
   /**
    * The source for which the result is being reported.
    */
   Source _source;
-  
+
   /**
    * The fully resolved AST that changed as a result of the analysis, or {@code null} if the AST was
    * not changed.
    */
   CompilationUnit _compilationUnit;
-  
+
   /**
    * The errors that changed as a result of the analysis, or {@code null} if errors were not
    * changed.
    */
   List<AnalysisError> _errors;
-  
+
   /**
    * The line information associated with the source, or {@code null} if errors were not changed.
    */
   LineInfo _lineInfo;
-  
+
   /**
    * An empty array of change notices.
    */
   static List<ChangeNoticeImpl> EMPTY_ARRAY = new List<ChangeNoticeImpl>(0);
-  
+
   /**
    * Initialize a newly created notice associated with the given source.
    * @param source the source for which the change is being reported
@@ -3464,34 +3454,34 @@
   ChangeNoticeImpl(Source source) {
     this._source = source;
   }
-  
+
   /**
    * Return the fully resolved AST that changed as a result of the analysis, or {@code null} if the
    * AST was not changed.
    * @return the fully resolved AST that changed as a result of the analysis
    */
   CompilationUnit get compilationUnit => _compilationUnit;
-  
+
   /**
    * Return the errors that changed as a result of the analysis, or {@code null} if errors were not
    * changed.
    * @return the errors that changed as a result of the analysis
    */
   List<AnalysisError> get errors => _errors;
-  
+
   /**
    * Return the line information associated with the source, or {@code null} if errors were not
    * changed.
    * @return the line information associated with the source
    */
   LineInfo get lineInfo => _lineInfo;
-  
+
   /**
    * Return the source for which the result is being reported.
    * @return the source for which the result is being reported
    */
   Source get source => _source;
-  
+
   /**
    * Set the fully resolved AST that changed as a result of the analysis to the given AST.
    * @param compilationUnit the fully resolved AST that changed as a result of the analysis
@@ -3499,7 +3489,7 @@
   void set compilationUnit(CompilationUnit compilationUnit2) {
     this._compilationUnit = compilationUnit2;
   }
-  
+
   /**
    * Set the errors that changed as a result of the analysis to the given errors and set the line
    * information to the given line information.
@@ -3511,14 +3501,13 @@
     this._lineInfo = lineInfo2;
   }
 }
-
 /**
  * Instances of the class {@code DelegatingAnalysisContextImpl} extend {@link AnalysisContextImplanalysis context} to delegate sources to the appropriate analysis context. For instance, if the
  * source is in a system library then the analysis context from the {@link DartSdk} is used.
  * @coverage dart.engine
  */
 class DelegatingAnalysisContextImpl extends AnalysisContextImpl {
-  
+
   /**
    * This references the {@link InternalAnalysisContext} held onto by the {@link DartSdk} which is
    * used (instead of this {@link AnalysisContext}) for SDK sources. This field is set when
@@ -3742,14 +3731,13 @@
     }
   }
 }
-
 /**
  * Instances of the class {@code InstrumentedAnalysisContextImpl} implement an{@link AnalysisContext analysis context} by recording instrumentation data and delegating to
  * another analysis context to do the non-instrumentation work.
  * @coverage dart.engine
  */
 class InstrumentedAnalysisContextImpl implements InternalAnalysisContext {
-  
+
   /**
    * Record an exception that was thrown during analysis.
    * @param instrumentation the instrumentation builder being used to record the exception
@@ -3758,36 +3746,36 @@
   static void recordAnalysisException(InstrumentationBuilder instrumentation, AnalysisException exception) {
     instrumentation.record(exception);
   }
-  
+
   /**
    * The unique identifier used to identify this analysis context in the instrumentation data.
    */
   String _contextId = UUID.randomUUID().toString();
-  
+
   /**
    * The analysis context to which all of the non-instrumentation work is delegated.
    */
   InternalAnalysisContext _basis;
-  
+
   /**
    * Create a new {@link InstrumentedAnalysisContextImpl} which wraps a new{@link AnalysisContextImpl} as the basis context.
    */
   InstrumentedAnalysisContextImpl() {
-    _jtd_constructor_182_impl();
+    _jtd_constructor_183_impl();
   }
-  _jtd_constructor_182_impl() {
-    _jtd_constructor_183_impl(new AnalysisContextImpl());
+  _jtd_constructor_183_impl() {
+    _jtd_constructor_184_impl(new AnalysisContextImpl());
   }
-  
+
   /**
    * Create a new {@link InstrumentedAnalysisContextImpl} with a specified basis context, aka the
    * context to wrap and instrument.
    * @param context some {@link InstrumentedAnalysisContext} to wrap and instrument
    */
   InstrumentedAnalysisContextImpl.con1(InternalAnalysisContext context) {
-    _jtd_constructor_183_impl(context);
+    _jtd_constructor_184_impl(context);
   }
-  _jtd_constructor_183_impl(InternalAnalysisContext context) {
+  _jtd_constructor_184_impl(InternalAnalysisContext context) {
     _basis = context;
   }
   void addSourceInfo(Source source, SourceEntry info) {
@@ -3889,7 +3877,7 @@
       instrumentation.log();
     }
   }
-  
+
   /**
    * @return the underlying {@link AnalysisContext}.
    */
@@ -4215,20 +4203,19 @@
     }
   }
 }
-
 /**
  * The interface {@code InternalAnalysisContext} defines additional behavior for an analysis context
  * that is required by internal users of the context.
  */
 abstract class InternalAnalysisContext implements AnalysisContext {
-  
+
   /**
    * Add the given source with the given information to this context.
    * @param source the source to be added
    * @param info the information about the source
    */
   void addSourceInfo(Source source, SourceEntry info);
-  
+
   /**
    * Return an AST structure corresponding to the given source, but ensure that the structure has
    * not already been resolved and will not be resolved by any other threads or in any other
@@ -4238,7 +4225,7 @@
    * @throws AnalysisException if the analysis could not be performed
    */
   CompilationUnit computeResolvableCompilationUnit(Source source);
-  
+
   /**
    * Initialize the specified context by removing the specified sources from the receiver and adding
    * them to the specified context.
@@ -4248,7 +4235,7 @@
    * @return the analysis context that was initialized
    */
   InternalAnalysisContext extractContextInto(SourceContainer container, InternalAnalysisContext newContext);
-  
+
   /**
    * Return a namespace containing mappings for all of the public names defined by the given
    * library.
@@ -4256,7 +4243,7 @@
    * @return the public namespace of the given library
    */
   Namespace getPublicNamespace(LibraryElement library);
-  
+
   /**
    * Return a namespace containing mappings for all of the public names defined by the library
    * defined by the given source.
@@ -4265,7 +4252,7 @@
    * @throws AnalysisException if the public namespace could not be computed
    */
   Namespace getPublicNamespace2(Source source);
-  
+
   /**
    * Given a table mapping the source for the libraries represented by the corresponding elements to
    * the elements representing the libraries, record those mappings.
@@ -4274,7 +4261,6 @@
    */
   void recordLibraryElements(Map<Source, LibraryElement> elementMap);
 }
-
 /**
  * Instances of the class {@code 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
@@ -4282,12 +4268,12 @@
  * @coverage dart.engine
  */
 class RecordingErrorListener implements AnalysisErrorListener {
-  
+
   /**
    * A HashMap of lists containing the errors that were collected, keyed by each {@link Source}.
    */
   Map<Source, List<AnalysisError>> _errors = new Map<Source, List<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
@@ -4297,7 +4283,7 @@
       onError(error);
     }
   }
-  
+
   /**
    * Answer the errors collected by the listener.
    * @return an array of errors (not {@code null}, contains no {@code null}s)
@@ -4313,7 +4299,7 @@
     }
     return new List.from(resultList);
   }
-  
+
   /**
    * Answer the errors collected by the listener for some passed {@link Source}.
    * @param source some {@link Source} for which the caller wants the set of {@link AnalysisError}s
@@ -4338,7 +4324,6 @@
     errorsForSource.add(event);
   }
 }
-
 /**
  * Instances of the class {@code ResolutionEraser} remove any resolution information from an AST
  * structure when used to visit that structure.
@@ -4410,7 +4395,6 @@
     return super.visitSuperConstructorInvocation(node);
   }
 }
-
 /**
  * The interface {@code Logger} defines the behavior of objects that can be used to receive
  * information about errors within the analysis engine. Implementations usually write this
@@ -4419,34 +4403,34 @@
  * @coverage dart.engine.utilities
  */
 abstract class Logger {
-  static Logger NULL = new Logger_NullLogger();
-  
+  static final Logger NULL = new Logger_NullLogger();
+
   /**
    * Log the given message as an error.
    * @param message an explanation of why the error occurred or what it means
    */
   void logError(String message);
-  
+
   /**
    * 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
    */
   void logError2(String message, Exception exception);
-  
+
   /**
    * Log the given exception as one representing an error.
    * @param exception the exception being logged
    */
   void logError3(Exception exception);
-  
+
   /**
    * Log the given informational message.
    * @param message an explanation of why the error occurred or what it means
    * @param exception the exception being logged
    */
   void logInformation(String message);
-  
+
   /**
    * Log the given exception as one representing an informational message.
    * @param message an explanation of why the error occurred or what it means
@@ -4454,7 +4438,6 @@
    */
   void logInformation2(String message, Exception exception);
 }
-
 /**
  * Implementation of {@link Logger} that does nothing.
  */
diff --git a/pkg/analyzer_experimental/lib/src/generated/error.dart b/pkg/analyzer_experimental/lib/src/generated/error.dart
index 21804c9..56db0bd 100644
--- a/pkg/analyzer_experimental/lib/src/generated/error.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/error.dart
@@ -1,14 +1,10 @@
 // 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.error;
-
 import 'java_core.dart';
 import 'source.dart';
 import 'ast.dart' show ASTNode;
 import 'scanner.dart' show Token;
-
-
 /**
  * Instances of the enumeration {@code ErrorSeverity} represent the severity of an {@link ErrorCode}.
  * @coverage dart.engine.error
@@ -22,16 +18,22 @@
   static final ErrorSeverity NONE = new ErrorSeverity('NONE', 0, " ", "none");
 
   /**
+   * The severity representing a suggestion. Suggestions are not specified in the Dart language
+   * specification, but provide information about best practices.
+   */
+  static final ErrorSeverity SUGGESTION = new ErrorSeverity('SUGGESTION', 1, "S", "suggestion");
+
+  /**
    * The severity representing a warning. Warnings can become errors if the {@code -Werror} command
    * line flag is specified.
    */
-  static final ErrorSeverity WARNING = new ErrorSeverity('WARNING', 1, "W", "warning");
+  static final ErrorSeverity WARNING = new ErrorSeverity('WARNING', 2, "W", "warning");
 
   /**
    * The severity representing an error.
    */
-  static final ErrorSeverity ERROR = new ErrorSeverity('ERROR', 2, "E", "error");
-  static final List<ErrorSeverity> values = [NONE, WARNING, ERROR];
+  static final ErrorSeverity ERROR = new ErrorSeverity('ERROR', 3, "E", "error");
+  static final List<ErrorSeverity> values = [NONE, SUGGESTION, WARNING, ERROR];
 
   /// The name of this enum constant, as declared in the enum declaration.
   final String name;
@@ -80,7 +82,6 @@
   int compareTo(ErrorSeverity other) => ordinal - other.ordinal;
   String toString() => name;
 }
-
 /**
  * Instances of the class {@code AnalysisErrorWithProperties}
  */
@@ -129,7 +130,6 @@
     _propertyMap[property] = value;
   }
 }
-
 /**
  * Instances of the class {@code ErrorReporter} wrap an error listener with utility methods used to
  * create the errors being reported.
@@ -216,7 +216,6 @@
     this._source = source2 == null ? _defaultSource : source2;
   }
 }
-
 /**
  * Instances of the class {@code AnalysisError} represent an error discovered during the analysis of
  * some Dart code.
@@ -380,7 +379,6 @@
     return builder.toString();
   }
 }
-
 /**
  * The enumeration {@code ErrorProperty} defines the properties that can be associated with an{@link AnalysisError}.
  */
@@ -403,7 +401,6 @@
   int compareTo(ErrorProperty other) => ordinal - other.ordinal;
   String toString() => name;
 }
-
 /**
  * The interface {@code ErrorCode} defines the behavior common to objects representing error codes
  * associated with {@link AnalysisError analysis errors}.
@@ -429,7 +426,6 @@
    */
   ErrorType get type;
 }
-
 /**
  * Instances of the enumeration {@code ErrorType} represent the type of an {@link ErrorCode}.
  * @coverage dart.engine.error
@@ -443,22 +439,28 @@
   static final ErrorType COMPILE_TIME_ERROR = new ErrorType('COMPILE_TIME_ERROR', 0, ErrorSeverity.ERROR);
 
   /**
+   * Suggestions made in situations where the user has deviated from recommended pub programming
+   * practices.
+   */
+  static final ErrorType PUB_SUGGESTION = new ErrorType('PUB_SUGGESTION', 1, ErrorSeverity.SUGGESTION);
+
+  /**
    * 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 final ErrorType STATIC_WARNING = new ErrorType('STATIC_WARNING', 1, ErrorSeverity.WARNING);
+  static final ErrorType STATIC_WARNING = new ErrorType('STATIC_WARNING', 2, ErrorSeverity.WARNING);
 
   /**
    * Many, but not all, static warnings relate to types, in which case they are known as static type
    * warnings.
    */
-  static final ErrorType STATIC_TYPE_WARNING = new ErrorType('STATIC_TYPE_WARNING', 2, ErrorSeverity.WARNING);
+  static final ErrorType STATIC_TYPE_WARNING = new ErrorType('STATIC_TYPE_WARNING', 3, ErrorSeverity.WARNING);
 
   /**
    * Syntactic errors are errors produced as a result of input that does not conform to the grammar.
    */
-  static final ErrorType SYNTACTIC_ERROR = new ErrorType('SYNTACTIC_ERROR', 3, ErrorSeverity.ERROR);
-  static final List<ErrorType> values = [COMPILE_TIME_ERROR, STATIC_WARNING, STATIC_TYPE_WARNING, SYNTACTIC_ERROR];
+  static final ErrorType SYNTACTIC_ERROR = new ErrorType('SYNTACTIC_ERROR', 4, ErrorSeverity.ERROR);
+  static final List<ErrorType> values = [COMPILE_TIME_ERROR, PUB_SUGGESTION, STATIC_WARNING, STATIC_TYPE_WARNING, SYNTACTIC_ERROR];
 
   /// The name of this enum constant, as declared in the enum declaration.
   final String name;
@@ -487,7 +489,6 @@
   int compareTo(ErrorType other) => ordinal - other.ordinal;
   String toString() => name;
 }
-
 /**
  * The enumeration {@code 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
@@ -1110,47 +1111,57 @@
   static final CompileTimeErrorCode METHOD_AND_GETTER_WITH_SAME_NAME = new CompileTimeErrorCode('METHOD_AND_GETTER_WITH_SAME_NAME', 77, "'%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 final CompileTimeErrorCode MISSING_CONST_IN_LIST_LITERAL = new CompileTimeErrorCode('MISSING_CONST_IN_LIST_LITERAL', 78, "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 final CompileTimeErrorCode MISSING_CONST_IN_MAP_LITERAL = new CompileTimeErrorCode('MISSING_CONST_IN_MAP_LITERAL', 79, "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 final CompileTimeErrorCode MIXIN_DECLARES_CONSTRUCTOR = new CompileTimeErrorCode('MIXIN_DECLARES_CONSTRUCTOR', 78, "The class '%s' cannot be used as a mixin because it declares a constructor");
+  static final CompileTimeErrorCode MIXIN_DECLARES_CONSTRUCTOR = new CompileTimeErrorCode('MIXIN_DECLARES_CONSTRUCTOR', 80, "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 final CompileTimeErrorCode MIXIN_INHERITS_FROM_NOT_OBJECT = new CompileTimeErrorCode('MIXIN_INHERITS_FROM_NOT_OBJECT', 79, "The class '%s' cannot be used as a mixin because it extends a class other than Object");
+  static final CompileTimeErrorCode MIXIN_INHERITS_FROM_NOT_OBJECT = new CompileTimeErrorCode('MIXIN_INHERITS_FROM_NOT_OBJECT', 81, "The class '%s' cannot be used as a mixin because it extends a class other than Object");
 
   /**
    * 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 final CompileTimeErrorCode MIXIN_OF_NON_CLASS = new CompileTimeErrorCode('MIXIN_OF_NON_CLASS', 80, "Classes can only mixin other classes");
+  static final CompileTimeErrorCode MIXIN_OF_NON_CLASS = new CompileTimeErrorCode('MIXIN_OF_NON_CLASS', 82, "Classes can only mixin other classes");
 
   /**
    * 9 Mixins: It is a compile-time error if a declared or derived mixin refers to super.
    */
-  static final CompileTimeErrorCode MIXIN_REFERENCES_SUPER = new CompileTimeErrorCode('MIXIN_REFERENCES_SUPER', 81, "The class '%s' cannot be used as a mixin because it references 'super'");
+  static final CompileTimeErrorCode MIXIN_REFERENCES_SUPER = new CompileTimeErrorCode('MIXIN_REFERENCES_SUPER', 83, "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 final CompileTimeErrorCode MIXIN_WITH_NON_CLASS_SUPERCLASS = new CompileTimeErrorCode('MIXIN_WITH_NON_CLASS_SUPERCLASS', 82, "Mixin can only be applied to class");
+  static final CompileTimeErrorCode MIXIN_WITH_NON_CLASS_SUPERCLASS = new CompileTimeErrorCode('MIXIN_WITH_NON_CLASS_SUPERCLASS', 84, "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 final CompileTimeErrorCode MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS = new CompileTimeErrorCode('MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS', 83, "Constructor may have at most one 'this' redirection");
+  static final CompileTimeErrorCode MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS = new CompileTimeErrorCode('MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS', 85, "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 final CompileTimeErrorCode MULTIPLE_SUPER_INITIALIZERS = new CompileTimeErrorCode('MULTIPLE_SUPER_INITIALIZERS', 84, "Constructor may have at most one 'super' initializer");
+  static final CompileTimeErrorCode MULTIPLE_SUPER_INITIALIZERS = new CompileTimeErrorCode('MULTIPLE_SUPER_INITIALIZERS', 86, "Constructor may have at most one 'super' initializer");
 
   /**
    * 12.11.1 New: It is a compile time error if <i>S</i> is not a generic type with <i>m</i> type
@@ -1159,13 +1170,13 @@
    * @param parameterCount the number of type parameters that were declared
    * @param argumentCount the number of type arguments provided
    */
-  static final CompileTimeErrorCode NEW_WITH_INVALID_TYPE_PARAMETERS = new CompileTimeErrorCode('NEW_WITH_INVALID_TYPE_PARAMETERS', 85, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
+  static final CompileTimeErrorCode NEW_WITH_INVALID_TYPE_PARAMETERS = new CompileTimeErrorCode('NEW_WITH_INVALID_TYPE_PARAMETERS', 87, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
 
   /**
    * 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 final CompileTimeErrorCode NON_CONST_MAP_AS_EXPRESSION_STATEMENT = new CompileTimeErrorCode('NON_CONST_MAP_AS_EXPRESSION_STATEMENT', 86, "A non-constant map literal without type arguments cannot be used as an expression statement");
+  static final CompileTimeErrorCode NON_CONST_MAP_AS_EXPRESSION_STATEMENT = new CompileTimeErrorCode('NON_CONST_MAP_AS_EXPRESSION_STATEMENT', 88, "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;
@@ -1176,37 +1187,37 @@
    * 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 final CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION = new CompileTimeErrorCode('NON_CONSTANT_CASE_EXPRESSION', 87, "Case expressions must be constant");
+  static final CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION = new CompileTimeErrorCode('NON_CONSTANT_CASE_EXPRESSION', 89, "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 final CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE = new CompileTimeErrorCode('NON_CONSTANT_DEFAULT_VALUE', 88, "Default values of an optional parameter must be constant");
+  static final CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE = new CompileTimeErrorCode('NON_CONSTANT_DEFAULT_VALUE', 90, "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 final CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT = new CompileTimeErrorCode('NON_CONSTANT_LIST_ELEMENT', 89, "'const' lists must have all constant values");
+  static final CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT = new CompileTimeErrorCode('NON_CONSTANT_LIST_ELEMENT', 91, "'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 final CompileTimeErrorCode NON_CONSTANT_MAP_KEY = new CompileTimeErrorCode('NON_CONSTANT_MAP_KEY', 90, "The keys in a map must be constant");
+  static final CompileTimeErrorCode NON_CONSTANT_MAP_KEY = new CompileTimeErrorCode('NON_CONSTANT_MAP_KEY', 92, "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 final CompileTimeErrorCode NON_CONSTANT_MAP_VALUE = new CompileTimeErrorCode('NON_CONSTANT_MAP_VALUE', 91, "The values in a 'const' map must be constant");
+  static final CompileTimeErrorCode NON_CONSTANT_MAP_VALUE = new CompileTimeErrorCode('NON_CONSTANT_MAP_VALUE', 93, "The values in a 'const' map must be constant");
 
   /**
    * 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 final CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER = new CompileTimeErrorCode('NON_CONSTANT_VALUE_IN_INITIALIZER', 92, "Initializer expressions in constant constructors must be constants");
+  static final CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER = new CompileTimeErrorCode('NON_CONSTANT_VALUE_IN_INITIALIZER', 94, "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>.
@@ -1216,7 +1227,7 @@
    * @param requiredCount the expected number of required arguments
    * @param argumentCount the actual number of positional arguments given
    */
-  static final CompileTimeErrorCode NOT_ENOUGH_REQUIRED_ARGUMENTS = new CompileTimeErrorCode('NOT_ENOUGH_REQUIRED_ARGUMENTS', 93, "%d required argument(s) expected, but %d found");
+  static final CompileTimeErrorCode NOT_ENOUGH_REQUIRED_ARGUMENTS = new CompileTimeErrorCode('NOT_ENOUGH_REQUIRED_ARGUMENTS', 95, "%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
@@ -1224,42 +1235,42 @@
    * 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 final CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR = new CompileTimeErrorCode('NON_GENERATIVE_CONSTRUCTOR', 94, "The generative constructor '%s' expected, but factory found");
+  static final CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR = new CompileTimeErrorCode('NON_GENERATIVE_CONSTRUCTOR', 96, "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 final CompileTimeErrorCode OBJECT_CANNOT_EXTEND_ANOTHER_CLASS = new CompileTimeErrorCode('OBJECT_CANNOT_EXTEND_ANOTHER_CLASS', 95, "");
+  static final CompileTimeErrorCode OBJECT_CANNOT_EXTEND_ANOTHER_CLASS = new CompileTimeErrorCode('OBJECT_CANNOT_EXTEND_ANOTHER_CLASS', 97, "");
 
   /**
    * 7.1.1 Operators: It is a compile-time error to declare an optional parameter in an operator.
    */
-  static final CompileTimeErrorCode OPTIONAL_PARAMETER_IN_OPERATOR = new CompileTimeErrorCode('OPTIONAL_PARAMETER_IN_OPERATOR', 96, "Optional parameters are not allowed when defining an operator");
+  static final CompileTimeErrorCode OPTIONAL_PARAMETER_IN_OPERATOR = new CompileTimeErrorCode('OPTIONAL_PARAMETER_IN_OPERATOR', 98, "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 final CompileTimeErrorCode PART_OF_NON_PART = new CompileTimeErrorCode('PART_OF_NON_PART', 97, "The included part '%s' must have a part-of directive");
+  static final CompileTimeErrorCode PART_OF_NON_PART = new CompileTimeErrorCode('PART_OF_NON_PART', 99, "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 final CompileTimeErrorCode PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER = new CompileTimeErrorCode('PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER', 98, "The name '%s' is already used as an import prefix and cannot be used to name a top-level element");
+  static final CompileTimeErrorCode PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER = new CompileTimeErrorCode('PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER', 100, "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 final CompileTimeErrorCode PRIVATE_OPTIONAL_PARAMETER = new CompileTimeErrorCode('PRIVATE_OPTIONAL_PARAMETER', 99, "Named optional parameters cannot start with an underscore");
+  static final CompileTimeErrorCode PRIVATE_OPTIONAL_PARAMETER = new CompileTimeErrorCode('PRIVATE_OPTIONAL_PARAMETER', 101, "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 final CompileTimeErrorCode RECURSIVE_COMPILE_TIME_CONSTANT = new CompileTimeErrorCode('RECURSIVE_COMPILE_TIME_CONSTANT', 100, "");
+  static final CompileTimeErrorCode RECURSIVE_COMPILE_TIME_CONSTANT = new CompileTimeErrorCode('RECURSIVE_COMPILE_TIME_CONSTANT', 102, "");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
@@ -1270,19 +1281,19 @@
    * <p>
    * https://code.google.com/p/dart/issues/detail?id=954
    */
-  static final CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT = new CompileTimeErrorCode('RECURSIVE_CONSTRUCTOR_REDIRECT', 101, "Cycle in redirecting generative constructors");
+  static final CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT = new CompileTimeErrorCode('RECURSIVE_CONSTRUCTOR_REDIRECT', 103, "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 final CompileTimeErrorCode RECURSIVE_FACTORY_REDIRECT = new CompileTimeErrorCode('RECURSIVE_FACTORY_REDIRECT', 102, "Cycle in redirecting factory constructors");
+  static final CompileTimeErrorCode RECURSIVE_FACTORY_REDIRECT = new CompileTimeErrorCode('RECURSIVE_FACTORY_REDIRECT', 104, "Cycle in redirecting factory constructors");
 
   /**
    * 15.3.1 Typedef: It is a compile-time error if a typedef refers to itself via a chain of
    * references that does not include a class type.
    */
-  static final CompileTimeErrorCode RECURSIVE_FUNCTION_TYPE_ALIAS = new CompileTimeErrorCode('RECURSIVE_FUNCTION_TYPE_ALIAS', 103, "");
+  static final CompileTimeErrorCode RECURSIVE_FUNCTION_TYPE_ALIAS = new CompileTimeErrorCode('RECURSIVE_FUNCTION_TYPE_ALIAS', 105, "");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1294,7 +1305,7 @@
    * @param className the name of the class that implements itself recursively
    * @param strImplementsPath a string representation of the implements loop
    */
-  static final CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = new CompileTimeErrorCode('RECURSIVE_INTERFACE_INHERITANCE', 104, "'%s' cannot be a superinterface of itself: %s");
+  static final CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = new CompileTimeErrorCode('RECURSIVE_INTERFACE_INHERITANCE', 106, "'%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
@@ -1305,7 +1316,7 @@
    * 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 final CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS = new CompileTimeErrorCode('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS', 105, "'%s' cannot extend itself");
+  static final CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS = new CompileTimeErrorCode('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS', 107, "'%s' cannot extend itself");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1316,49 +1327,49 @@
    * 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 final CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS = new CompileTimeErrorCode('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS', 106, "'%s' cannot implement itself");
+  static final CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS = new CompileTimeErrorCode('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS', 108, "'%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 final CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR = new CompileTimeErrorCode('REDIRECT_TO_NON_CONST_CONSTRUCTOR', 107, "Constant factory constructor cannot delegate to a non-constant constructor");
+  static final CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR = new CompileTimeErrorCode('REDIRECT_TO_NON_CONST_CONSTRUCTOR', 109, "Constant factory constructor cannot delegate to a non-constant constructor");
 
   /**
    * 13.3 Local Variable Declaration: It is a compile-time error if <i>e</i> refers to the name
    * <i>v</i> or the name <i>v=</i>.
    */
-  static final CompileTimeErrorCode REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER = new CompileTimeErrorCode('REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER', 108, "The name '%s' cannot be referenced in the initializer of a variable with the same name");
+  static final CompileTimeErrorCode REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER = new CompileTimeErrorCode('REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER', 110, "The name '%s' cannot be referenced in the initializer of a variable with the same name");
 
   /**
    * 16.1.1 Reserved Words: A reserved word may not be used as an identifier; it is a compile-time
    * error if a reserved word is used where an identifier is expected.
    */
-  static final CompileTimeErrorCode RESERVED_WORD_AS_IDENTIFIER = new CompileTimeErrorCode('RESERVED_WORD_AS_IDENTIFIER', 109, "");
+  static final CompileTimeErrorCode RESERVED_WORD_AS_IDENTIFIER = new CompileTimeErrorCode('RESERVED_WORD_AS_IDENTIFIER', 111, "");
 
   /**
    * 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 final CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = new CompileTimeErrorCode('RETHROW_OUTSIDE_CATCH', 110, "rethrow must be inside of a catch clause");
+  static final CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = new CompileTimeErrorCode('RETHROW_OUTSIDE_CATCH', 112, "rethrow must be inside of a catch clause");
 
   /**
    * 13.11 Return: It is a compile-time error if a return statement of the form <i>return e;</i>
    * appears in a generative constructor.
    */
-  static final CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = new CompileTimeErrorCode('RETURN_IN_GENERATIVE_CONSTRUCTOR', 111, "Constructors cannot return a value");
+  static final CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = new CompileTimeErrorCode('RETURN_IN_GENERATIVE_CONSTRUCTOR', 113, "Constructors cannot return a value");
 
   /**
    * 6.1 Function Declarations: It is a compile-time error to preface a function declaration with
    * the built-in identifier static.
    */
-  static final CompileTimeErrorCode STATIC_TOP_LEVEL_FUNCTION = new CompileTimeErrorCode('STATIC_TOP_LEVEL_FUNCTION', 112, "");
+  static final CompileTimeErrorCode STATIC_TOP_LEVEL_FUNCTION = new CompileTimeErrorCode('STATIC_TOP_LEVEL_FUNCTION', 114, "");
 
   /**
    * 5 Variables: It is a compile-time error to preface a top level variable declaration with the
    * built-in identifier static.
    */
-  static final CompileTimeErrorCode STATIC_TOP_LEVEL_VARIABLE = new CompileTimeErrorCode('STATIC_TOP_LEVEL_VARIABLE', 113, "");
+  static final CompileTimeErrorCode STATIC_TOP_LEVEL_VARIABLE = new CompileTimeErrorCode('STATIC_TOP_LEVEL_VARIABLE', 115, "");
 
   /**
    * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
@@ -1368,19 +1379,19 @@
    * initializer list, in class Object, in a factory constructor, or in a static method or variable
    * initializer.
    */
-  static final CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = new CompileTimeErrorCode('SUPER_IN_INVALID_CONTEXT', 114, "Invalid context for 'super' invocation");
+  static final CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = new CompileTimeErrorCode('SUPER_IN_INVALID_CONTEXT', 116, "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 final CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = new CompileTimeErrorCode('SUPER_IN_REDIRECTING_CONSTRUCTOR', 115, "The redirecting constructor cannot have a 'super' initializer");
+  static final CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = new CompileTimeErrorCode('SUPER_IN_REDIRECTING_CONSTRUCTOR', 117, "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 final CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = new CompileTimeErrorCode('SUPER_INITIALIZER_IN_OBJECT', 116, "");
+  static final CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = new CompileTimeErrorCode('SUPER_INITIALIZER_IN_OBJECT', 118, "");
 
   /**
    * 12.11 Instance Creation: It is a compile-time error if a constructor of a non-generic type
@@ -1390,13 +1401,13 @@
    * <i>G&lt;T<sub>1</sub>, &hellip;, T<sub>n</sub>&gt;</i> and <i>G</i> is not a generic type with
    * <i>n</i> type parameters.
    */
-  static final CompileTimeErrorCode TYPE_ARGUMENTS_FOR_NON_GENERIC_CLASS = new CompileTimeErrorCode('TYPE_ARGUMENTS_FOR_NON_GENERIC_CLASS', 117, "");
+  static final CompileTimeErrorCode TYPE_ARGUMENTS_FOR_NON_GENERIC_CLASS = new CompileTimeErrorCode('TYPE_ARGUMENTS_FOR_NON_GENERIC_CLASS', 119, "");
 
   /**
    * 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 final CompileTimeErrorCode UNDEFINED_CLASS = new CompileTimeErrorCode('UNDEFINED_CLASS', 118, "Undefined class '%s'");
+  static final CompileTimeErrorCode UNDEFINED_CLASS = new CompileTimeErrorCode('UNDEFINED_CLASS', 120, "Undefined class '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1404,7 +1415,7 @@
    * 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 final CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = new CompileTimeErrorCode('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 119, "The class '%s' does not have a generative constructor '%s'");
+  static final CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = new CompileTimeErrorCode('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 121, "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
@@ -1412,7 +1423,7 @@
    * 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 final CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = new CompileTimeErrorCode('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 120, "The class '%s' does not have a default generative constructor");
+  static final CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = new CompileTimeErrorCode('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 122, "The class '%s' does not have a default generative constructor");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. Each final instance
@@ -1425,7 +1436,7 @@
    * </ol>
    * or a compile-time error occurs.
    */
-  static final CompileTimeErrorCode UNINITIALIZED_FINAL_FIELD = new CompileTimeErrorCode('UNINITIALIZED_FINAL_FIELD', 121, "");
+  static final CompileTimeErrorCode UNINITIALIZED_FINAL_FIELD = new CompileTimeErrorCode('UNINITIALIZED_FINAL_FIELD', 123, "");
 
   /**
    * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
@@ -1436,7 +1447,7 @@
    * uncaught exception being thrown.
    * @param name the name of the requested named parameter
    */
-  static final CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = new CompileTimeErrorCode('UNDEFINED_NAMED_PARAMETER', 122, "The named parameter '%s' is not defined");
+  static final CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = new CompileTimeErrorCode('UNDEFINED_NAMED_PARAMETER', 124, "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
@@ -1450,7 +1461,7 @@
    * @param uri the URI pointing to a non-existent file
    * @see #INVALID_URI
    */
-  static final CompileTimeErrorCode URI_DOES_NOT_EXIST = new CompileTimeErrorCode('URI_DOES_NOT_EXIST', 123, "Target of URI does not exist: '%s'");
+  static final CompileTimeErrorCode URI_DOES_NOT_EXIST = new CompileTimeErrorCode('URI_DOES_NOT_EXIST', 125, "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
@@ -1462,7 +1473,7 @@
    * 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 final CompileTimeErrorCode URI_WITH_INTERPOLATION = new CompileTimeErrorCode('URI_WITH_INTERPOLATION', 124, "URIs cannot use string interpolation");
+  static final CompileTimeErrorCode URI_WITH_INTERPOLATION = new CompileTimeErrorCode('URI_WITH_INTERPOLATION', 126, "URIs cannot use string interpolation");
 
   /**
    * 7.1.1 Operators: It is a compile-time error if the arity of the user-declared operator \[\]= is
@@ -1474,21 +1485,21 @@
    * @param expectedNumberOfParameters the number of parameters expected
    * @param actualNumberOfParameters the number of parameters found in the operator declaration
    */
-  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = new CompileTimeErrorCode('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 125, "Operator '%s' should declare exactly %d parameter(s), but %d found");
+  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = new CompileTimeErrorCode('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 127, "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 final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = new CompileTimeErrorCode('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 126, "Operator '-' should declare 0 or 1 parameter, but %d found");
+  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = new CompileTimeErrorCode('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 128, "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>.
    * @param numberOfParameters the number of parameters found in the setter
    */
-  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = new CompileTimeErrorCode('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 127, "Setters should declare exactly one parameter, %d found");
+  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = new CompileTimeErrorCode('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 129, "Setters should declare exactly one parameter, %d found");
 
   /**
    * 12.11 Instance Creation: It is a compile-time error if a constructor of a generic type with
@@ -1499,8 +1510,8 @@
    * <i>G&lt;T<sub>1</sub>, &hellip;, T<sub>n</sub>&gt;</i> and <i>G</i> is not a generic type with
    * <i>n</i> type parameters.
    */
-  static final CompileTimeErrorCode WRONG_NUMBER_OF_TYPE_ARGUMENTS = new CompileTimeErrorCode('WRONG_NUMBER_OF_TYPE_ARGUMENTS', 128, "");
-  static final List<CompileTimeErrorCode> values = [AMBIGUOUS_EXPORT, AMBIGUOUS_IMPORT, 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_VARIABLE_NAME, CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, COMPILE_TIME_CONSTANT_RAISES_EXCEPTION, CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD, CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD, CONST_CONSTRUCTOR_THROWS_EXCEPTION, CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD, CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE, CONST_FORMAL_PARAMETER, CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, CONST_EVAL_TYPE_BOOL, CONST_EVAL_TYPE_BOOL_NUM_STRING, CONST_EVAL_TYPE_INT, CONST_EVAL_TYPE_NUM, CONST_EVAL_THROWS_EXCEPTION, 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, DUPLICATE_CONSTRUCTOR_DEFAULT, DUPLICATE_CONSTRUCTOR_NAME, DUPLICATE_DEFINITION, DUPLICATE_MEMBER_NAME, DUPLICATE_MEMBER_NAME_INSTANCE_STATIC, DUPLICATE_NAMED_ARGUMENT, EXPORT_INTERNAL_LIBRARY, EXPORT_OF_NON_LIBRARY, EXTENDS_NON_CLASS, EXTENDS_DISALLOWED_CLASS, EXTRA_POSITIONAL_ARGUMENTS, IMPLEMENTS_DISALLOWED_CLASS, FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS, FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION, FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER, FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR, FINAL_INITIALIZED_MULTIPLE_TIMES, FIELD_INITIALIZER_FACTORY_CONSTRUCTOR, FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR, FINAL_NOT_INITIALIZED, GETTER_AND_METHOD_WITH_SAME_NAME, IMPLEMENTS_DYNAMIC, IMPLEMENTS_NON_CLASS, IMPLEMENTS_REPEATED, IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, 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, INVALID_CONSTANT, INVALID_CONSTRUCTOR_NAME, INVALID_FACTORY_NAME_NOT_A_CLASS, INVALID_OVERRIDE_DEFAULT_VALUE, INVALID_OVERRIDE_NAMED, INVALID_OVERRIDE_POSITIONAL, INVALID_OVERRIDE_REQUIRED, INVALID_REFERENCE_TO_THIS, INVALID_TYPE_ARGUMENT_FOR_KEY, INVALID_TYPE_ARGUMENT_IN_CONST_LIST, INVALID_TYPE_ARGUMENT_IN_CONST_MAP, INVALID_URI, LABEL_IN_OUTER_SCOPE, LABEL_UNDEFINED, MEMBER_WITH_CLASS_NAME, METHOD_AND_GETTER_WITH_SAME_NAME, MIXIN_DECLARES_CONSTRUCTOR, MIXIN_INHERITS_FROM_NOT_OBJECT, MIXIN_OF_NON_CLASS, MIXIN_REFERENCES_SUPER, MIXIN_WITH_NON_CLASS_SUPERCLASS, MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS, MULTIPLE_SUPER_INITIALIZERS, NEW_WITH_INVALID_TYPE_PARAMETERS, 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_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_FUNCTION_TYPE_ALIAS, RECURSIVE_INTERFACE_INHERITANCE, RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS, RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS, REDIRECT_TO_NON_CONST_CONSTRUCTOR, REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER, RESERVED_WORD_AS_IDENTIFIER, RETHROW_OUTSIDE_CATCH, RETURN_IN_GENERATIVE_CONSTRUCTOR, STATIC_TOP_LEVEL_FUNCTION, STATIC_TOP_LEVEL_VARIABLE, SUPER_IN_INVALID_CONTEXT, SUPER_IN_REDIRECTING_CONSTRUCTOR, SUPER_INITIALIZER_IN_OBJECT, TYPE_ARGUMENTS_FOR_NON_GENERIC_CLASS, UNDEFINED_CLASS, UNDEFINED_CONSTRUCTOR_IN_INITIALIZER, UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, UNINITIALIZED_FINAL_FIELD, 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, WRONG_NUMBER_OF_TYPE_ARGUMENTS];
+  static final CompileTimeErrorCode WRONG_NUMBER_OF_TYPE_ARGUMENTS = new CompileTimeErrorCode('WRONG_NUMBER_OF_TYPE_ARGUMENTS', 130, "");
+  static final List<CompileTimeErrorCode> values = [AMBIGUOUS_EXPORT, AMBIGUOUS_IMPORT, 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_VARIABLE_NAME, CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, COMPILE_TIME_CONSTANT_RAISES_EXCEPTION, CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD, CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD, CONST_CONSTRUCTOR_THROWS_EXCEPTION, CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD, CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE, CONST_FORMAL_PARAMETER, CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, CONST_EVAL_TYPE_BOOL, CONST_EVAL_TYPE_BOOL_NUM_STRING, CONST_EVAL_TYPE_INT, CONST_EVAL_TYPE_NUM, CONST_EVAL_THROWS_EXCEPTION, 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, DUPLICATE_CONSTRUCTOR_DEFAULT, DUPLICATE_CONSTRUCTOR_NAME, DUPLICATE_DEFINITION, DUPLICATE_MEMBER_NAME, DUPLICATE_MEMBER_NAME_INSTANCE_STATIC, DUPLICATE_NAMED_ARGUMENT, EXPORT_INTERNAL_LIBRARY, EXPORT_OF_NON_LIBRARY, EXTENDS_NON_CLASS, EXTENDS_DISALLOWED_CLASS, EXTRA_POSITIONAL_ARGUMENTS, IMPLEMENTS_DISALLOWED_CLASS, FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS, FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION, FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER, FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR, FINAL_INITIALIZED_MULTIPLE_TIMES, FIELD_INITIALIZER_FACTORY_CONSTRUCTOR, FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR, FINAL_NOT_INITIALIZED, GETTER_AND_METHOD_WITH_SAME_NAME, IMPLEMENTS_DYNAMIC, IMPLEMENTS_NON_CLASS, IMPLEMENTS_REPEATED, IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, 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, INVALID_CONSTANT, INVALID_CONSTRUCTOR_NAME, INVALID_FACTORY_NAME_NOT_A_CLASS, INVALID_OVERRIDE_DEFAULT_VALUE, INVALID_OVERRIDE_NAMED, INVALID_OVERRIDE_POSITIONAL, INVALID_OVERRIDE_REQUIRED, INVALID_REFERENCE_TO_THIS, INVALID_TYPE_ARGUMENT_FOR_KEY, INVALID_TYPE_ARGUMENT_IN_CONST_LIST, INVALID_TYPE_ARGUMENT_IN_CONST_MAP, INVALID_URI, LABEL_IN_OUTER_SCOPE, LABEL_UNDEFINED, 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_NON_CLASS, MIXIN_REFERENCES_SUPER, MIXIN_WITH_NON_CLASS_SUPERCLASS, MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS, MULTIPLE_SUPER_INITIALIZERS, NEW_WITH_INVALID_TYPE_PARAMETERS, 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_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_FUNCTION_TYPE_ALIAS, RECURSIVE_INTERFACE_INHERITANCE, RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS, RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS, REDIRECT_TO_NON_CONST_CONSTRUCTOR, REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER, RESERVED_WORD_AS_IDENTIFIER, RETHROW_OUTSIDE_CATCH, RETURN_IN_GENERATIVE_CONSTRUCTOR, STATIC_TOP_LEVEL_FUNCTION, STATIC_TOP_LEVEL_VARIABLE, SUPER_IN_INVALID_CONTEXT, SUPER_IN_REDIRECTING_CONSTRUCTOR, SUPER_INITIALIZER_IN_OBJECT, TYPE_ARGUMENTS_FOR_NON_GENERIC_CLASS, UNDEFINED_CLASS, UNDEFINED_CONSTRUCTOR_IN_INITIALIZER, UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, UNINITIALIZED_FINAL_FIELD, 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, WRONG_NUMBER_OF_TYPE_ARGUMENTS];
 
   /// The name of this enum constant, as declared in the enum declaration.
   final String name;
@@ -1526,7 +1537,62 @@
   int compareTo(CompileTimeErrorCode other) => ordinal - other.ordinal;
   String toString() => name;
 }
+/**
+ * The enumeration {@code PubSuggestionCode} defines the suggestions used for reporting deviations
+ * from pub best practices. The convention for this class is for the name of the bad practice to
+ * indicate the problem that caused the suggestion to be generated and for the message to explain
+ * what is wrong and, when appropriate, how the situation can be corrected.
+ */
+class PubSuggestionCode implements Comparable<PubSuggestionCode>, ErrorCode {
 
+  /**
+   * It is a bad practice for a source file in a package "lib" directory hierarchy to traverse
+   * outside that directory hierarchy. For example, a source file in the "lib" directory should not
+   * contain a directive such as {@code import '../web/some.dart'} which references a file outside
+   * the lib directory.
+   */
+  static final PubSuggestionCode FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE = new PubSuggestionCode('FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE', 0, "A file in the 'lib' directory hierarchy should not reference a file outside that hierarchy");
+
+  /**
+   * It is a bad practice for a source file ouside a package "lib" directory hierarchy to traverse
+   * into that directory hierarchy. For example, a source file in the "web" directory should not
+   * contain a directive such as {@code import '../lib/some.dart'} which references a file inside
+   * the lib directory.
+   */
+  static final PubSuggestionCode FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE = new PubSuggestionCode('FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE', 1, "A file outside the 'lib' directory hierarchy should not reference a file inside that hierarchy. Use a package: reference instead.");
+
+  /**
+   * It is a bad practice for a package import to reference anything outside the given package, or
+   * more generally, it is bad practice for a package import to contain a "..". For example, a
+   * source file should not contain a directive such as {@code import 'package:foo/../some.dart'}.
+   */
+  static final PubSuggestionCode PACKAGE_IMPORT_CONTAINS_DOT_DOT = new PubSuggestionCode('PACKAGE_IMPORT_CONTAINS_DOT_DOT', 2, "A package import should not contain '..'");
+  static final List<PubSuggestionCode> values = [FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE, FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE, PACKAGE_IMPORT_CONTAINS_DOT_DOT];
+
+  /// The name of this enum constant, as declared in the enum declaration.
+  final String name;
+
+  /// The position in the enum declaration.
+  final int ordinal;
+
+  /**
+   * The message template used to create the message to be displayed for this error.
+   */
+  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
+   */
+  PubSuggestionCode(this.name, this.ordinal, String message) {
+    this._message = message;
+  }
+  ErrorSeverity get errorSeverity => ErrorType.PUB_SUGGESTION.severity;
+  String get message => _message;
+  ErrorType get type => ErrorType.PUB_SUGGESTION;
+  int compareTo(PubSuggestionCode other) => ordinal - other.ordinal;
+  String toString() => name;
+}
 /**
  * The enumeration {@code 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
@@ -2147,7 +2213,6 @@
   int compareTo(StaticWarningCode other) => ordinal - other.ordinal;
   String toString() => name;
 }
-
 /**
  * The interface {@code AnalysisErrorListener} defines the behavior of objects that listen for{@link AnalysisError analysis errors} being produced by the analysis engine.
  * @coverage dart.engine.error
@@ -2157,7 +2222,7 @@
   /**
    * An error listener that ignores errors that are reported to it.
    */
-  static AnalysisErrorListener _NULL_LISTENER = new AnalysisErrorListener_5();
+  static final AnalysisErrorListener _NULL_LISTENER = new AnalysisErrorListener_5();
 
   /**
    * This method is invoked when an error has been found by the analysis engine.
@@ -2169,7 +2234,6 @@
   void onError(AnalysisError event) {
   }
 }
-
 /**
  * The enumeration {@code 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
@@ -2218,7 +2282,6 @@
   int compareTo(HtmlWarningCode other) => ordinal - other.ordinal;
   String toString() => name;
 }
-
 /**
  * The enumeration {@code 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
diff --git a/pkg/analyzer_experimental/lib/src/generated/html.dart b/pkg/analyzer_experimental/lib/src/generated/html.dart
index 0de0d5b..206f552 100644
--- a/pkg/analyzer_experimental/lib/src/generated/html.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/html.dart
@@ -1,8 +1,6 @@
 // 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.html;
-
 import 'dart:collection';
 import 'java_core.dart';
 import 'java_engine.dart';
@@ -10,52 +8,50 @@
 import 'error.dart';
 import 'instrumentation.dart';
 import 'element.dart' show HtmlElementImpl;
-
-
 /**
  * Instances of the class {@code 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.
  * @coverage dart.engine.html
  */
 class Token {
-  
+
   /**
    * The offset from the beginning of the file to the first character in the token.
    */
   int _offset = 0;
-  
+
   /**
    * The previous token in the token stream.
    */
   Token _previous;
-  
+
   /**
    * The next token in the token stream.
    */
   Token _next;
-  
+
   /**
    * The type of the token.
    */
   TokenType _type;
-  
+
   /**
    * The lexeme represented by this token.
    */
   String _value;
-  
+
   /**
    * Initialize a newly created token.
    * @param type the token type (not {@code null})
    * @param offset the offset from the beginning of the file to the first character in the token
    */
   Token.con1(TokenType type, int offset) {
-    _jtd_constructor_154_impl(type, offset);
+    _jtd_constructor_155_impl(type, offset);
   }
-  _jtd_constructor_154_impl(TokenType type, int offset) {
-    _jtd_constructor_155_impl(type, offset, type.lexeme);
+  _jtd_constructor_155_impl(TokenType type, int offset) {
+    _jtd_constructor_156_impl(type, offset, type.lexeme);
   }
-  
+
   /**
    * Initialize a newly created token.
    * @param type the token type (not {@code null})
@@ -63,14 +59,14 @@
    * @param value the lexeme represented by this token (not {@code null})
    */
   Token.con2(TokenType type2, int offset2, String value2) {
-    _jtd_constructor_155_impl(type2, offset2, value2);
+    _jtd_constructor_156_impl(type2, offset2, value2);
   }
-  _jtd_constructor_155_impl(TokenType type2, int offset2, String value2) {
+  _jtd_constructor_156_impl(TokenType type2, int offset2, String value2) {
     this._type = type2;
     this._value = StringUtilities.intern(value2);
     this._offset = offset2;
   }
-  
+
   /**
    * Return the offset from the beginning of the file to the character after last character of the
    * token.
@@ -78,43 +74,43 @@
    * 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 {@code 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 the offset from the beginning of the file to the first character in the token.
    * @return the offset from the beginning of the file to the first character in the token
    */
   int get offset => _offset;
-  
+
   /**
    * Return the previous token in the token stream.
    * @return the previous token in the token stream
    */
   Token get previous => _previous;
-  
+
   /**
    * Answer the token type for the receiver.
    * @return the token type (not {@code null})
    */
   TokenType get type => _type;
-  
+
   /**
    * Return {@code 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
@@ -122,7 +118,7 @@
    * @return {@code true} if this token is a synthetic token
    */
   bool 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.
@@ -135,7 +131,7 @@
     return token;
   }
   String toString() => lexeme;
-  
+
   /**
    * Set the previous token in the token stream to the given token.
    * @param previous the previous token in the token stream
@@ -144,13 +140,12 @@
     this._previous = previous2;
   }
 }
-
 /**
  * Instances of {@code HtmlParseResult} hold the result of parsing an HTML file.
  * @coverage dart.engine.html
  */
 class HtmlParseResult extends HtmlScanResult {
-  
+
   /**
    * The unit containing the parsed information (not {@code null}).
    */
@@ -158,14 +153,13 @@
   HtmlParseResult(int modificationTime, Token token, List<int> lineStarts, HtmlUnit unit) : super(modificationTime, token, lineStarts) {
     this._unit = unit;
   }
-  
+
   /**
    * Answer the unit generated by parsing the source
    * @return the unit (not {@code null})
    */
   HtmlUnit get htmlUnit => _unit;
 }
-
 /**
  * Instances of the class {@code 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
@@ -190,31 +184,30 @@
     return null;
   }
 }
-
 /**
  * The abstract class {@code XmlNode} defines behavior common to all XML/HTML nodes.
  * @coverage dart.engine.html
  */
 abstract class XmlNode {
-  
+
   /**
    * The parent of the node, or {@code null} if the node is the root of an AST structure.
    */
   XmlNode _parent;
-  
+
   /**
    * 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 {@code null} if none
    */
   Token get beginToken;
-  
+
   /**
    * Return the offset of the character immediately following the last character of this node's
    * source range. This is equivalent to {@code node.getOffset() + node.getLength()}. For an html
@@ -222,13 +215,13 @@
    * @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 {@code 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
@@ -241,7 +234,7 @@
     }
     return endToken2.offset + endToken2.length - beginToken2.offset;
   }
-  
+
   /**
    * Return the offset from the beginning of the file to the first character in the node's source
    * range.
@@ -255,7 +248,7 @@
     }
     return beginToken.offset;
   }
-  
+
   /**
    * Return this node's parent node, or {@code null} if this node is the root of an AST structure.
    * <p>
@@ -269,14 +262,14 @@
     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<Object> visitor);
-  
+
   /**
    * Make this node the parent of the given child nodes.
    * @param children the nodes that will become the children of this node
@@ -292,7 +285,7 @@
     }
     return children;
   }
-  
+
   /**
    * Make this node the parent of the given child node.
    * @param child the node that will become a child of this node
@@ -305,7 +298,7 @@
     }
     return child;
   }
-  
+
   /**
    * Set the parent of this node to the given node.
    * @param newParent the node that is to be made the parent of this node
@@ -314,7 +307,6 @@
     _parent = newParent;
   }
 }
-
 /**
  * Instances of the class {@code 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
@@ -326,7 +318,6 @@
   R visitXmlAttributeNode(XmlAttributeNode xmlAttributeNode) => null;
   R visitXmlTagNode(XmlTagNode xmlTagNode) => null;
 }
-
 /**
  * The abstract class {@code AbstractScanner} implements a scanner for HTML code. Subclasses are
  * required to implement the interface used to access the characters being scanned.
@@ -334,32 +325,32 @@
  */
 abstract class AbstractScanner {
   static List<String> _NO_PASS_THROUGH_ELEMENTS = <String> [];
-  
+
   /**
    * The source being scanned.
    */
   Source _source;
-  
+
   /**
    * The token pointing to the head of the linked list of tokens.
    */
   Token _tokens;
-  
+
   /**
    * The last token that was scanned.
    */
   Token _tail;
-  
+
   /**
    * A list containing the offsets of the first character of each line in the source code.
    */
   List<int> _lineStarts = new List<int>();
-  
+
   /**
    * An array of element tags for which the content between tags should be consider a single token.
    */
   List<String> _passThroughElements = _NO_PASS_THROUGH_ELEMENTS;
-  
+
   /**
    * Initialize a newly created scanner.
    * @param source the source being scanned
@@ -371,13 +362,13 @@
     _tail = _tokens;
     recordStartOfLine();
   }
-  
+
   /**
    * Return an array containing the offsets of the first character of each line in the source code.
    * @return an array containing the offsets of the first character of each line in the source code
    */
   List<int> get lineStarts => _lineStarts;
-  
+
   /**
    * Return the current offset relative to the beginning of the file. 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
@@ -385,20 +376,20 @@
    * @return the current offset of the scanner in the source
    */
   int get offset;
-  
+
   /**
    * Answer the source being scanned.
    * @return the source or {@code null} if undefined
    */
   Source get source => _source;
-  
+
   /**
    * Set array of element tags for which the content between tags should be consider a single token.
    */
   void set passThroughElements(List<String> passThroughElements2) {
     this._passThroughElements = passThroughElements2 != null ? passThroughElements2 : _NO_PASS_THROUGH_ELEMENTS;
   }
-  
+
   /**
    * Scan the source code to produce a list of tokens representing the source.
    * @return the first token in the list of tokens that were produced
@@ -408,13 +399,13 @@
     appendEofToken();
     return firstToken();
   }
-  
+
   /**
    * 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 substring of the source code between the start offset and the modified current
    * position. The current position is modified by adding the end delta.
@@ -425,13 +416,13 @@
    * @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();
-  
+
   /**
    * Record the fact that we are at the beginning of a new line in the source.
    */
@@ -601,23 +592,22 @@
     }
   }
 }
-
 /**
  * Instances of {@code HtmlScanResult} hold the result of scanning an HTML file.
  * @coverage dart.engine.html
  */
 class HtmlScanResult {
-  
+
   /**
    * The time at which the contents of the source were last set.
    */
   int _modificationTime = 0;
-  
+
   /**
    * The first token in the token stream (not {@code null}).
    */
   Token _token;
-  
+
   /**
    * The line start information that was produced.
    */
@@ -627,48 +617,47 @@
     this._token = token;
     this._lineStarts = lineStarts;
   }
-  
+
   /**
    * Answer the line start information that was produced.
    * @return an array of line starts (not {@code null})
    */
   List<int> get lineStarts => _lineStarts;
-  
+
   /**
    * Return the time at which the contents of the source were last set.
    * @return the time at which the contents of the source were last set
    */
   int get modificationTime => _modificationTime;
-  
+
   /**
    * Answer the first token in the token stream.
    * @return the token (not {@code null})
    */
   Token get token => _token;
 }
-
 /**
  * Instances of the class {@code StringScanner} implement a scanner that reads from a string. The
  * scanning logic is in the superclass.
  * @coverage dart.engine.html
  */
 class StringScanner extends AbstractScanner {
-  
+
   /**
    * The string from which characters will be read.
    */
   String _string;
-  
+
   /**
    * The number of characters in the string.
    */
   int _stringLength = 0;
-  
+
   /**
    * The index, relative to the string, of the last character that was read.
    */
   int _charOffset = 0;
-  
+
   /**
    * Initialize a newly created scanner to scan the characters in the given string.
    * @param source the source being scanned
@@ -698,29 +687,28 @@
     return -1;
   }
 }
-
 /**
  * Instances of the class {@code CharBufferScanner} implement a scanner that reads from a character
  * buffer. The scanning logic is in the superclass.
  * @coverage dart.engine.html
  */
 class CharBufferScanner extends AbstractScanner {
-  
+
   /**
    * The buffer from which characters will be read.
    */
   CharSequence _buffer;
-  
+
   /**
    * The number of characters in the buffer.
    */
   int _bufferLength = 0;
-  
+
   /**
    * The index of the last character that was read.
    */
   int _charOffset = 0;
-  
+
   /**
    * Initialize a newly created scanner to scan the characters in the given character buffer.
    * @param source the source being scanned
@@ -747,19 +735,18 @@
     return -1;
   }
 }
-
 /**
  * Instances of the class {@code ToSourceVisitor} write a source representation of a visited XML
  * node (and all of it's children) to a writer.
  * @coverage dart.engine.html
  */
 class ToSourceVisitor implements XmlVisitor<Object> {
-  
+
   /**
    * The writer to which the source is to be written.
    */
   PrintWriter _writer;
-  
+
   /**
    * Initialize a newly created visitor to write source code representing the visited nodes to the
    * given writer.
@@ -809,7 +796,7 @@
     }
     return null;
   }
-  
+
   /**
    * Safely visit the given node.
    * @param node the node to be visited
@@ -820,14 +807,13 @@
     }
   }
 }
-
 /**
  * The enumeration {@code TokenType} defines the types of tokens that can be returned by the
  * scanner.
  * @coverage dart.engine.html
  */
 class TokenType implements Comparable<TokenType> {
-  
+
   /**
    * The type of the token that marks the end of the input.
    */
@@ -844,13 +830,13 @@
   static final TokenType TAG = new TokenType('TAG', 10, null);
   static final TokenType TEXT = new TokenType('TEXT', 11, null);
   static final List<TokenType> values = [EOF, EQ, GT, LT_SLASH, LT, SLASH_GT, COMMENT, DECLARATION, DIRECTIVE, STRING, TAG, TEXT];
-  
+
   /// The name of this enum constant, as declared in the enum declaration.
   final String name;
-  
+
   /// The position in the enum declaration.
   final int ordinal;
-  
+
   /**
    * The lexeme that defines this type of token, or {@code null} if there is more than one possible
    * lexeme for this type of token.
@@ -859,7 +845,7 @@
   TokenType(this.name, this.ordinal, String lexeme) {
     this._lexeme = lexeme;
   }
-  
+
   /**
    * Return the lexeme that defines this type of token, or {@code null} if there is more than one
    * possible lexeme for this type of token.
@@ -873,7 +859,6 @@
   TokenType_EOF(String name, int ordinal, String arg0) : super(name, ordinal, arg0);
   String toString() => "-eof-";
 }
-
 /**
  * Instances of {@code XmlAttributeNode} represent name/value pairs owned by an {@link XmlTagNode}.
  * @coverage dart.engine.html
@@ -882,7 +867,7 @@
   Token _name;
   Token _equals;
   Token _value;
-  
+
   /**
    * Construct a new instance representing an XML attribute.
    * @param name the name token (not {@code null}). This may be a zero length token if the attribute
@@ -898,19 +883,19 @@
   accept(XmlVisitor visitor) => visitor.visitXmlAttributeNode(this);
   Token get beginToken => _name;
   Token get endToken => _value;
-  
+
   /**
    * Answer the equals sign token that appears between the name and value tokens. This may be{@code null} if the attribute is badly formed.
    * @return the token or {@code null} if there is no equals sign between the name and value
    */
   Token get equals => _equals;
-  
+
   /**
    * Answer the attribute name. This may be a zero length token if the attribute is badly formed.
    * @return the name (not {@code null})
    */
   Token get name => _name;
-  
+
   /**
    * Answer the lexeme for the value token without the leading and trailing quotes.
    * @return the text or {@code null} if the value is not specified
@@ -938,7 +923,7 @@
     }
     return text;
   }
-  
+
   /**
    * Answer the attribute value. A properly formed value will start and end with matching quote
    * characters, but the value returned may not be properly formed.
@@ -948,7 +933,6 @@
   void visitChildren(XmlVisitor<Object> visitor) {
   }
 }
-
 /**
  * The interface {@code XmlVisitor} defines the behavior of objects that can be used to visit an{@link XmlNode} structure.
  * @coverage dart.engine.html
@@ -958,7 +942,6 @@
   R visitXmlAttributeNode(XmlAttributeNode xmlAttributeNode);
   R visitXmlTagNode(XmlTagNode xmlTagNode);
 }
-
 /**
  * Instances of {@code HtmlScanner} receive and scan HTML content from a {@link Source}.<br/>
  * For example, the following code scans HTML source and returns the result:
@@ -971,27 +954,27 @@
  */
 class HtmlScanner implements Source_ContentReceiver {
   List<String> _SCRIPT_TAG = <String> ["script"];
-  
+
   /**
    * The source being scanned (not {@code null})
    */
   Source _source;
-  
+
   /**
    * The time at which the contents of the source were last set.
    */
   int _modificationTime = 0;
-  
+
   /**
    * The scanner used to scan the source
    */
   AbstractScanner _scanner;
-  
+
   /**
    * The first token in the token stream.
    */
   Token _token;
-  
+
   /**
    * Construct a new instance to scan the specified source.
    * @param source the source to be scanned (not {@code null})
@@ -1011,31 +994,30 @@
     _scanner.passThroughElements = _SCRIPT_TAG;
     _token = _scanner.tokenize();
   }
-  
+
   /**
    * Answer the result of scanning the source
    * @return the result (not {@code null})
    */
   HtmlScanResult get result => new HtmlScanResult(_modificationTime, _token, _scanner.lineStarts);
 }
-
 /**
  * Instances of the class {@code XmlParser} are used to parse tokens into a AST structure comprised
  * of {@link XmlNode}s.
  * @coverage dart.engine.html
  */
 class XmlParser {
-  
+
   /**
    * The source being parsed.
    */
   Source _source;
-  
+
   /**
    * The next token to be parsed.
    */
   Token _currentToken;
-  
+
   /**
    * Construct a parser for the specified source.
    * @param source the source being parsed
@@ -1043,13 +1025,13 @@
   XmlParser(Source source) {
     this._source = source;
   }
-  
+
   /**
    * Answer the source being parsed.
    * @return the source
    */
   Source get source => _source;
-  
+
   /**
    * Answer {@code true} if the specified tag is self closing and thus should never have content or
    * child tag nodes.
@@ -1057,7 +1039,7 @@
    * @return {@code true} if self closing
    */
   bool isSelfClosing(Token tag) => false;
-  
+
   /**
    * Parse the entire token stream and in the process, advance the current token to the end of the
    * token stream.
@@ -1082,13 +1064,13 @@
       }
     }
   }
-  
+
   /**
    * Answer the current token.
    * @return the current token
    */
   Token get currentToken => _currentToken;
-  
+
   /**
    * Insert a synthetic token of the specified type before the current token
    * @param type the type of token to be inserted (not {@code null})
@@ -1100,7 +1082,7 @@
     token.setNext(_currentToken);
     return token;
   }
-  
+
   /**
    * Parse the token stream for an attribute. This method advances the current token over the
    * attribute, but should not be called if the {@link #currentToken} is not {@link TokenType#TAG}.
@@ -1127,7 +1109,7 @@
     }
     return new XmlAttributeNode(name, equals, value);
   }
-  
+
   /**
    * Parse the stream for a sequence of attributes. This method advances the current token to the
    * next {@link TokenType#GT}, {@link TokenType#SLASH_GT}, or {@link TokenType#EOF}.
@@ -1153,7 +1135,7 @@
       }
     }
   }
-  
+
   /**
    * Parse the stream for a sequence of tag nodes existing within a parent tag node. This method
    * advances the current token to the next {@link TokenType#LT_SLASH} or {@link TokenType#EOF}.
@@ -1181,7 +1163,7 @@
       }
     }
   }
-  
+
   /**
    * Parse the token stream for the next tag node. This method advances current token over the
    * parsed tag node, but should only be called if the current token is {@link TokenType#LT}
@@ -1237,55 +1219,54 @@
     }
     return new XmlTagNode(nodeStart, tag, attributes, attributeEnd, tagNodes, contentEnd, closingTag, nodeEnd);
   }
-  
+
   /**
    * Report the current token as unexpected
    */
   void reportUnexpectedToken() {
   }
 }
-
 /**
  * Instances of {@code XmlTagNode} represent XML or HTML elements such as {@code <p>} and{@code <body foo="bar"> ... </body>}.
  * @coverage dart.engine.html
  */
 class XmlTagNode extends XmlNode {
-  
+
   /**
    * Constant representing empty list of attributes.
    */
   static List<XmlAttributeNode> NO_ATTRIBUTES = new UnmodifiableListView(new List<XmlAttributeNode>());
-  
+
   /**
    * Constant representing empty list of tag nodes.
    */
   static List<XmlTagNode> NO_TAG_NODES = new UnmodifiableListView(new List<XmlTagNode>());
-  
+
   /**
    * The starting {@link TokenType#LT} token (not {@code null}).
    */
   Token _nodeStart;
-  
+
   /**
    * The {@link TokenType#TAG} token after the starting '&lt;' (not {@code null}).
    */
   Token _tag;
-  
+
   /**
    * The attributes contained by the receiver (not {@code null}, contains no {@code null}s).
    */
   List<XmlAttributeNode> _attributes;
-  
+
   /**
    * The {@link TokenType#GT} or {@link TokenType#SLASH_GT} token after the attributes (not{@code null}). The token may be the same token as {@link #nodeEnd} if there are no child{@link #tagNodes}.
    */
   Token _attributeEnd;
-  
+
   /**
    * The tag nodes contained in the receiver (not {@code null}, contains no {@code null}s).
    */
   List<XmlTagNode> _tagNodes;
-  
+
   /**
    * The token (not {@code null}) after the content, which may be
    * <ul>
@@ -1298,18 +1279,18 @@
    * </ul>
    */
   Token _contentEnd;
-  
+
   /**
    * The closing {@link TokenType#TAG} after the child elements or {@code null} if there is no
    * content and the attributes ended with {@link TokenType#SLASH_GT}
    */
   Token _closingTag;
-  
+
   /**
    * The ending {@link TokenType#GT} or {@link TokenType#SLASH_GT} token (not {@code null}).
    */
   Token _nodeEnd;
-  
+
   /**
    * Construct a new instance representing an XML or HTML element
    * @param nodeStart the starting {@link TokenType#LT} token (not {@code null})
@@ -1343,7 +1324,7 @@
     this._nodeEnd = nodeEnd;
   }
   accept(XmlVisitor visitor) => visitor.visitXmlTagNode(this);
-  
+
   /**
    * Answer the attribute with the specified name.
    * @param name the attribute name
@@ -1357,20 +1338,20 @@
     }
     return null;
   }
-  
+
   /**
    * The {@link TokenType#GT} or {@link TokenType#SLASH_GT} token after the attributes (not{@code null}). The token may be the same token as {@link #nodeEnd} if there are no child{@link #tagNodes}.
    * @return the token (not {@code null})
    */
   Token get attributeEnd => _attributeEnd;
-  
+
   /**
    * Answer the receiver's attributes. Callers should not manipulate the returned list to edit the
    * AST structure.
    * @return the attributes (not {@code null}, contains no {@code null}s)
    */
   List<XmlAttributeNode> get attributes => _attributes;
-  
+
   /**
    * Find the attribute with the given name (see {@link #getAttribute(String)} and answer the lexeme
    * for the attribute's value token without the leading and trailing quotes (see{@link XmlAttributeNode#getText()}).
@@ -1382,14 +1363,14 @@
     return attribute != null ? attribute.text : null;
   }
   Token get beginToken => _nodeStart;
-  
+
   /**
    * The the closing {@link TokenType#TAG} after the child elements or {@code null} if there is no
    * content and the attributes ended with {@link TokenType#SLASH_GT}
    * @return the closing tag or {@code null}
    */
   Token get closingTag => _closingTag;
-  
+
   /**
    * Answer a string representing the content contained in the receiver. This includes the textual
    * representation of any child tag nodes ({@link #getTagNodes()}). Whitespace between '&lt;',
@@ -1413,7 +1394,7 @@
     }
     return buffer.toString();
   }
-  
+
   /**
    * Answer the token (not {@code null}) after the content, which may be
    * <ul>
@@ -1448,25 +1429,25 @@
     }
     return _tag;
   }
-  
+
   /**
    * Answer the ending {@link TokenType#GT} or {@link TokenType#SLASH_GT} token.
    * @return the token (not {@code null})
    */
   Token get nodeEnd => _nodeEnd;
-  
+
   /**
    * Answer the starting {@link TokenType#LT} token.
    * @return the token (not {@code null})
    */
   Token get nodeStart => _nodeStart;
-  
+
   /**
    * Answer the {@link TokenType#TAG} token after the starting '&lt;'.
    * @return the token (not {@code null})
    */
   Token get tag => _tag;
-  
+
   /**
    * Answer the tag nodes contained in the receiver. Callers should not manipulate the returned list
    * to edit the AST structure.
@@ -1481,7 +1462,7 @@
       node.accept(visitor);
     }
   }
-  
+
   /**
    * Same as {@link #becomeParentOf(List)}, but returns given "ifEmpty" if "children" is empty
    */
@@ -1492,7 +1473,6 @@
     return becomeParentOf(children);
   }
 }
-
 /**
  * Instances of the class {@code HtmlParser} are used to parse tokens into a AST structure comprised
  * of {@link XmlNode}s.
@@ -1500,14 +1480,14 @@
  */
 class HtmlParser extends XmlParser {
   static Set<String> SELF_CLOSING = new Set<String>();
-  
+
   /**
    * Construct a parser for the specified source.
    * @param source the source being parsed
    */
   HtmlParser(Source source) : super(source) {
   }
-  
+
   /**
    * Parse the tokens specified by the given scan result.
    * @param scanResult the result of scanning an HTML source (not {@code null})
@@ -1519,7 +1499,7 @@
     HtmlUnit unit = new HtmlUnit(firstToken, tagNodes, currentToken);
     return new HtmlParseResult(scanResult.modificationTime, firstToken, scanResult.lineStarts, unit);
   }
-  
+
   /**
    * Scan then parse the specified source.
    * @param source the source to be scanned and parsed (not {@code null})
@@ -1532,34 +1512,33 @@
   }
   bool isSelfClosing(Token tag) => SELF_CLOSING.contains(tag.lexeme);
 }
-
 /**
  * Instances of the class {@code HtmlUnit} represent the contents of an HTML file.
  * @coverage dart.engine.html
  */
 class HtmlUnit extends XmlNode {
-  
+
   /**
    * The first token in the token stream that was parsed to form this HTML unit.
    */
   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 {@link TokenType.EOF}.
    */
   Token _endToken;
-  
+
   /**
    * The tag nodes contained in the receiver (not {@code null}, contains no {@code null}s).
    */
   List<XmlTagNode> _tagNodes;
-  
+
   /**
    * The element associated with this HTML unit or {@code null} if the receiver is not resolved.
    */
   HtmlElementImpl _element;
-  
+
   /**
    * Construct a new instance representing the content of an HTML file.
    * @param beginToken the first token in the file (not {@code null})
@@ -1573,21 +1552,21 @@
   }
   accept(XmlVisitor visitor) => visitor.visitHtmlUnit(this);
   Token get beginToken => _beginToken;
-  
+
   /**
    * Return the element associated with this HTML unit.
    * @return the element or {@code null} if the receiver is not resolved
    */
   HtmlElementImpl get element => _element;
   Token get endToken => _endToken;
-  
+
   /**
    * Answer the tag nodes contained in the receiver. Callers should not manipulate the returned list
    * to edit the AST structure.
    * @return the children (not {@code null}, contains no {@code null}s)
    */
   List<XmlTagNode> get tagNodes => _tagNodes;
-  
+
   /**
    * Set the element associated with this HTML unit.
    * @param element the element
diff --git a/pkg/analyzer_experimental/lib/src/generated/instrumentation.dart b/pkg/analyzer_experimental/lib/src/generated/instrumentation.dart
index 8bcdd137..034f718 100644
--- a/pkg/analyzer_experimental/lib/src/generated/instrumentation.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/instrumentation.dart
@@ -1,11 +1,7 @@
 // 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.instrumentation;
-
 import 'java_core.dart';
-
-
 /**
  * The class {@code Instrumentation} implements support for logging instrumentation information.
  * <p>
@@ -32,55 +28,55 @@
  * @coverage dart.engine.utilities
  */
 class Instrumentation {
-  
+
   /**
    * A builder that will silently ignore all data and logging requests.
    */
   static InstrumentationBuilder _NULL_INSTRUMENTATION_BUILDER = new InstrumentationBuilder_13();
-  
+
   /**
    * An instrumentation logger that can be used when no other instrumentation logger has been
    * configured. This logger will silently ignore all data and logging requests.
    */
   static InstrumentationLogger _NULL_LOGGER = new InstrumentationLogger_14();
-  
+
   /**
    * The current instrumentation logger.
    */
   static InstrumentationLogger _CURRENT_LOGGER = _NULL_LOGGER;
-  
+
   /**
    * Create a builder that can collect the data associated with an operation.
    * @param clazz the class performing the operation (not {@code null})
    * @return the builder that was created (not {@code null})
    */
   static InstrumentationBuilder builder(Type clazz) => _CURRENT_LOGGER.createBuilder(clazz.toString());
-  
+
   /**
    * Create a builder that can collect the data associated with an operation.
    * @param name the name used to uniquely identify the operation (not {@code null})
    * @return the builder that was created (not {@code null})
    */
   static InstrumentationBuilder builder2(String name) => _CURRENT_LOGGER.createBuilder(name);
-  
+
   /**
    * Get the currently active instrumentation logger
    */
   static InstrumentationLogger get logger => _CURRENT_LOGGER;
-  
+
   /**
    * Return a builder that will silently ignore all data and logging requests.
    * @return the builder (not {@code null})
    */
   static InstrumentationBuilder get nullBuilder => _NULL_INSTRUMENTATION_BUILDER;
-  
+
   /**
    * Is this instrumentation system currently configured to drop instrumentation data provided to
    * it?
    * @return
    */
   static bool isNullLogger() => identical(_CURRENT_LOGGER, _NULL_LOGGER);
-  
+
   /**
    * Set the logger that should receive instrumentation information to the given logger.
    * @param logger the logger that should receive instrumentation information
@@ -106,7 +102,6 @@
 class InstrumentationLogger_14 implements InstrumentationLogger {
   InstrumentationBuilder createBuilder(String name) => Instrumentation._NULL_INSTRUMENTATION_BUILDER;
 }
-
 /**
  * The interface {@code InstrumentationBuilder} defines the behavior of objects used to collect data
  * about an operation that has occurred and record that data through an instrumentation logger.
@@ -115,7 +110,7 @@
  * @coverage dart.engine.utilities
  */
 abstract class InstrumentationBuilder {
-  
+
   /**
    * Append the given data to the data being collected by this builder. The information is declared
    * to potentially contain data that is either user identifiable or contains user intellectual
@@ -125,7 +120,7 @@
    * @return this builder
    */
   InstrumentationBuilder data(String name, bool value);
-  
+
   /**
    * Append the given data to the data being collected by this builder. The information is declared
    * to potentially contain data that is either user identifiable or contains user intellectual
@@ -135,7 +130,7 @@
    * @return this builder
    */
   InstrumentationBuilder data2(String name, int value);
-  
+
   /**
    * Append the given data to the data being collected by this builder. The information is declared
    * to potentially contain data that is either user identifiable or contains user intellectual
@@ -145,7 +140,7 @@
    * @return this builder
    */
   InstrumentationBuilder data3(String name, String value);
-  
+
   /**
    * Append the given data to the data being collected by this builder. The information is declared
    * to potentially contain data that is either user identifiable or contains user intellectual
@@ -155,20 +150,20 @@
    * @return this builder
    */
   InstrumentationBuilder data4(String name, List<String> value);
-  
+
   /**
    * Answer the {@link InstrumentationLevel} of this {@code InstrumentationBuilder}.
    * @return one of {@link InstrumentationLevel#EVERYTHING}, {@link InstrumentationLevel#METRICS},{@link InstrumentationLevel#OFF}
    */
   InstrumentationLevel get instrumentationLevel;
-  
+
   /**
    * Log the data that has been collected. The instrumentation builder should not be used after this
    * method is invoked. The behavior of any method defined on this interface that is used after this
    * method is invoked is undefined.
    */
   void log();
-  
+
   /**
    * Append the given metric to the data being collected by this builder. The information is
    * declared to contain only metrics data (data that is not user identifiable and does not contain
@@ -178,7 +173,7 @@
    * @return this builder
    */
   InstrumentationBuilder metric(String name, bool value);
-  
+
   /**
    * Append the given metric to the data being collected by this builder. The information is
    * declared to contain only metrics data (data that is not user identifiable and does not contain
@@ -188,7 +183,7 @@
    * @return this builder
    */
   InstrumentationBuilder metric2(String name, int value);
-  
+
   /**
    * Append the given metric to the data being collected by this builder. The information is
    * declared to contain only metrics data (data that is not user identifiable and does not contain
@@ -198,7 +193,7 @@
    * @return this builder
    */
   InstrumentationBuilder metric3(String name, String value);
-  
+
   /**
    * Append the given metric to the data being collected by this builder. The information is
    * declared to contain only metrics data (data that is not user identifiable and does not contain
@@ -208,7 +203,7 @@
    * @return this builder
    */
   InstrumentationBuilder metric4(String name, List<String> value);
-  
+
   /**
    * Append the given exception to the information being collected by this builder. The exception's
    * class name is captured using {@link #metric(String,String)}. Other aspects of the exception
@@ -218,7 +213,6 @@
    */
   InstrumentationBuilder record(Exception exception);
 }
-
 /**
  * The instrumentation recording level representing (1) recording {@link #EVERYTHING} recording of
  * all instrumentation data, (2) recording only {@link #METRICS} information, or (3) recording
@@ -226,26 +220,26 @@
  * @coverage dart.engine.utilities
  */
 class InstrumentationLevel implements Comparable<InstrumentationLevel> {
-  
+
   /**
    * Recording all instrumented information
    */
   static final InstrumentationLevel EVERYTHING = new InstrumentationLevel('EVERYTHING', 0);
-  
+
   /**
    * Recording only metrics
    */
   static final InstrumentationLevel METRICS = new InstrumentationLevel('METRICS', 1);
-  
+
   /**
    * Nothing recorded
    */
   static final InstrumentationLevel OFF = new InstrumentationLevel('OFF', 2);
   static final List<InstrumentationLevel> values = [EVERYTHING, METRICS, OFF];
-  
+
   /// The name of this enum constant, as declared in the enum declaration.
   final String name;
-  
+
   /// The position in the enum declaration.
   final int ordinal;
   static InstrumentationLevel fromString(String str) {
@@ -265,7 +259,6 @@
   int compareTo(InstrumentationLevel other) => ordinal - other.ordinal;
   String toString() => name;
 }
-
 /**
  * The interface {@code InstrumentationLogger} defines the behavior of objects that are used to log
  * instrumentation data.
@@ -274,7 +267,7 @@
  * @coverage dart.engine.utilities
  */
 abstract class InstrumentationLogger {
-  
+
   /**
    * Create a builder that can collect the data associated with an operation identified by the given
    * name.
diff --git a/pkg/analyzer_experimental/lib/src/generated/java_core.dart b/pkg/analyzer_experimental/lib/src/generated/java_core.dart
index c3dd970..18888f7 100644
--- a/pkg/analyzer_experimental/lib/src/generated/java_core.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/java_core.dart
@@ -84,6 +84,9 @@
 class Character {
   static const int MAX_VALUE = 0xffff;
   static const int MAX_CODE_POINT = 0x10ffff;
+  static const int MIN_SUPPLEMENTARY_CODE_POINT = 0x010000;
+  static const int MIN_LOW_SURROGATE  = 0xDC00;
+  static const int MIN_HIGH_SURROGATE = 0xD800;
   static bool isLetter(int c) {
     return c >= 0x41 && c <= 0x5A || c >= 0x61 && c <= 0x7A;
   }
@@ -109,7 +112,16 @@
     return -1;
   }
   static String toChars(int codePoint) {
-    throw new UnsupportedOperationException();
+    if (codePoint < 0 || codePoint > MAX_CODE_POINT) {
+      throw new IllegalArgumentException();
+    }
+    if (codePoint < MIN_SUPPLEMENTARY_CODE_POINT) {
+      return new String.fromCharCode(codePoint);
+    }
+    int offset = codePoint - MIN_SUPPLEMENTARY_CODE_POINT;
+    int c0 = ((offset & 0x7FFFFFFF) >> 10) + MIN_HIGH_SURROGATE;
+    int c1 = (offset & 0x3ff) + MIN_LOW_SURROGATE;
+    return new String.fromCharCodes([c0, c1]);
   }
 }
 
diff --git a/pkg/analyzer_experimental/lib/src/generated/java_io.dart b/pkg/analyzer_experimental/lib/src/generated/java_io.dart
index d0459a0..7799d49 100644
--- a/pkg/analyzer_experimental/lib/src/generated/java_io.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/java_io.dart
@@ -72,8 +72,17 @@
   }
   String getPath() => _path.toNativePath();
   String getName() => _path.filename;
-  String getParent() => _path.directoryPath.toNativePath();
-  JavaFile getParentFile() => new JavaFile(getParent());
+  String getParent() {
+    var result = _path.directoryPath.toNativePath();
+    // "." or  "/" or  "C:\"
+    if (result.length < 4) return null;
+    return result;
+  }
+  JavaFile getParentFile() {
+    var parent = getParent();
+    if (parent == null) return null;
+    return new JavaFile(parent);
+  }
   String getAbsolutePath() => _path.canonicalize().toNativePath();
   String getCanonicalPath() => _path.canonicalize().toNativePath();
   JavaFile getAbsoluteFile() => new JavaFile(getAbsolutePath());
diff --git a/pkg/analyzer_experimental/lib/src/generated/parser.dart b/pkg/analyzer_experimental/lib/src/generated/parser.dart
index 5388c43..0a82fed 100644
--- a/pkg/analyzer_experimental/lib/src/generated/parser.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/parser.dart
@@ -1,8 +1,6 @@
 // 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.parser;
-
 import 'dart:collection';
 import 'java_core.dart';
 import 'java_engine.dart';
@@ -12,25 +10,23 @@
 import 'scanner.dart';
 import 'ast.dart';
 import 'utilities_dart.dart';
-
-
 /**
  * Instances of the class {@code CommentAndMetadata} implement a simple data-holder for a method
  * that needs to return multiple values.
  * @coverage dart.engine.parser
  */
 class CommentAndMetadata {
-  
+
   /**
    * The documentation comment that was parsed, or {@code null} if none was given.
    */
   Comment _comment;
-  
+
   /**
    * The metadata that was parsed.
    */
   List<Annotation> _metadata;
-  
+
   /**
    * Initialize a newly created holder with the given data.
    * @param comment the documentation comment that was parsed
@@ -40,37 +36,36 @@
     this._comment = comment;
     this._metadata = metadata;
   }
-  
+
   /**
    * Return the documentation comment that was parsed, or {@code null} if none was given.
    * @return the documentation comment that was parsed
    */
   Comment get comment => _comment;
-  
+
   /**
    * Return the metadata that was parsed. If there was no metadata, then the list will be empty.
    * @return the metadata that was parsed
    */
   List<Annotation> get metadata => _metadata;
 }
-
 /**
  * Instances of the class {@code FinalConstVarOrType} implement a simple data-holder for a method
  * that needs to return multiple values.
  * @coverage dart.engine.parser
  */
 class FinalConstVarOrType {
-  
+
   /**
    * The 'final', 'const' or 'var' keyword, or {@code null} if none was given.
    */
   Token _keyword;
-  
+
   /**
    * The type, of {@code null} if no type was specified.
    */
   TypeName _type;
-  
+
   /**
    * Initialize a newly created holder with the given data.
    * @param keyword the 'final', 'const' or 'var' keyword
@@ -80,110 +75,109 @@
     this._keyword = keyword;
     this._type = type;
   }
-  
+
   /**
    * Return the 'final', 'const' or 'var' keyword, or {@code null} if none was given.
    * @return the 'final', 'const' or 'var' keyword
    */
   Token get keyword => _keyword;
-  
+
   /**
    * Return the type, of {@code null} if no type was specified.
    * @return the type
    */
   TypeName get type => _type;
 }
-
 /**
  * Instances of the class {@code Modifiers} implement a simple data-holder for a method that needs
  * to return multiple values.
  * @coverage dart.engine.parser
  */
 class Modifiers {
-  
+
   /**
    * The token representing the keyword 'abstract', or {@code null} if the keyword was not found.
    */
   Token _abstractKeyword;
-  
+
   /**
    * The token representing the keyword 'const', or {@code null} if the keyword was not found.
    */
   Token _constKeyword;
-  
+
   /**
    * The token representing the keyword 'external', or {@code null} if the keyword was not found.
    */
   Token _externalKeyword;
-  
+
   /**
    * The token representing the keyword 'factory', or {@code null} if the keyword was not found.
    */
   Token _factoryKeyword;
-  
+
   /**
    * The token representing the keyword 'final', or {@code null} if the keyword was not found.
    */
   Token _finalKeyword;
-  
+
   /**
    * The token representing the keyword 'static', or {@code null} if the keyword was not found.
    */
   Token _staticKeyword;
-  
+
   /**
    * The token representing the keyword 'var', or {@code null} if the keyword was not found.
    */
   Token _varKeyword;
-  
+
   /**
    * Return the token representing the keyword 'abstract', or {@code null} if the keyword was not
    * found.
    * @return the token representing the keyword 'abstract'
    */
   Token get abstractKeyword => _abstractKeyword;
-  
+
   /**
    * Return the token representing the keyword 'const', or {@code null} if the keyword was not
    * found.
    * @return the token representing the keyword 'const'
    */
   Token get constKeyword => _constKeyword;
-  
+
   /**
    * Return the token representing the keyword 'external', or {@code null} if the keyword was not
    * found.
    * @return the token representing the keyword 'external'
    */
   Token get externalKeyword => _externalKeyword;
-  
+
   /**
    * Return the token representing the keyword 'factory', or {@code null} if the keyword was not
    * found.
    * @return the token representing the keyword 'factory'
    */
   Token get factoryKeyword => _factoryKeyword;
-  
+
   /**
    * Return the token representing the keyword 'final', or {@code null} if the keyword was not
    * found.
    * @return the token representing the keyword 'final'
    */
   Token get finalKeyword => _finalKeyword;
-  
+
   /**
    * Return the token representing the keyword 'static', or {@code null} if the keyword was not
    * found.
    * @return the token representing the keyword 'static'
    */
   Token get staticKeyword => _staticKeyword;
-  
+
   /**
    * Return the token representing the keyword 'var', or {@code null} if the keyword was not found.
    * @return the token representing the keyword 'var'
    */
   Token get varKeyword => _varKeyword;
-  
+
   /**
    * Set the token representing the keyword 'abstract' to the given token.
    * @param abstractKeyword the token representing the keyword 'abstract'
@@ -191,7 +185,7 @@
   void set abstractKeyword(Token abstractKeyword2) {
     this._abstractKeyword = abstractKeyword2;
   }
-  
+
   /**
    * Set the token representing the keyword 'const' to the given token.
    * @param constKeyword the token representing the keyword 'const'
@@ -199,7 +193,7 @@
   void set constKeyword(Token constKeyword2) {
     this._constKeyword = constKeyword2;
   }
-  
+
   /**
    * Set the token representing the keyword 'external' to the given token.
    * @param externalKeyword the token representing the keyword 'external'
@@ -207,7 +201,7 @@
   void set externalKeyword(Token externalKeyword2) {
     this._externalKeyword = externalKeyword2;
   }
-  
+
   /**
    * Set the token representing the keyword 'factory' to the given token.
    * @param factoryKeyword the token representing the keyword 'factory'
@@ -215,7 +209,7 @@
   void set factoryKeyword(Token factoryKeyword2) {
     this._factoryKeyword = factoryKeyword2;
   }
-  
+
   /**
    * Set the token representing the keyword 'final' to the given token.
    * @param finalKeyword the token representing the keyword 'final'
@@ -223,7 +217,7 @@
   void set finalKeyword(Token finalKeyword2) {
     this._finalKeyword = finalKeyword2;
   }
-  
+
   /**
    * Set the token representing the keyword 'static' to the given token.
    * @param staticKeyword the token representing the keyword 'static'
@@ -231,7 +225,7 @@
   void set staticKeyword(Token staticKeyword2) {
     this._staticKeyword = staticKeyword2;
   }
-  
+
   /**
    * Set the token representing the keyword 'var' to the given token.
    * @param varKeyword the token representing the keyword 'var'
@@ -250,7 +244,7 @@
     appendKeyword(builder, needsSpace, _varKeyword);
     return builder.toString();
   }
-  
+
   /**
    * If the given keyword is not {@code null}, append it to the given builder, prefixing it with a
    * space if needed.
@@ -270,33 +264,32 @@
     return needsSpace;
   }
 }
-
 /**
  * Instances of the class {@code Parser} are used to parse tokens into an AST structure.
  * @coverage dart.engine.parser
  */
 class Parser {
-  
+
   /**
    * The source being parsed.
    */
   Source _source;
-  
+
   /**
    * The error listener that will be informed of any errors that are found during the parse.
    */
   AnalysisErrorListener _errorListener;
-  
+
   /**
    * The next token to be parsed.
    */
   Token _currentToken;
-  
+
   /**
    * A flag indicating whether the parser is currently in the body of a loop.
    */
   bool _inLoop = false;
-  
+
   /**
    * A flag indicating whether the parser is currently in a switch statement.
    */
@@ -306,7 +299,7 @@
   static String _ON = "on";
   static String _SHOW = "show";
   static String _NATIVE = "native";
-  
+
   /**
    * Initialize a newly created parser.
    * @param source the source being parsed
@@ -317,7 +310,7 @@
     this._source = source;
     this._errorListener = errorListener;
   }
-  
+
   /**
    * Parse a compilation unit, starting with the given token.
    * @param token the first token of the compilation unit
@@ -332,7 +325,7 @@
       instrumentation.log();
     }
   }
-  
+
   /**
    * Parse an expression, starting with the given token.
    * @param token the first token of the expression
@@ -348,7 +341,7 @@
       instrumentation.log();
     }
   }
-  
+
   /**
    * Parse a statement, starting with the given token.
    * @param token the first token of the statement
@@ -364,7 +357,7 @@
       instrumentation.log();
     }
   }
-  
+
   /**
    * Parse a sequence of statements, starting with the given token.
    * @param token the first token of the sequence of statement
@@ -383,14 +376,14 @@
   void set currentToken(Token currentToken2) {
     this._currentToken = currentToken2;
   }
-  
+
   /**
    * Advance to the next token in the token stream.
    */
   void advance() {
     _currentToken = _currentToken.next;
   }
-  
+
   /**
    * Append the character equivalent of the given scalar value to the given builder. Use the start
    * and end indices to report an error, and don't append anything to the builder, if the scalar
@@ -412,7 +405,7 @@
       builder.append(Character.toChars(scalarValue));
     }
   }
-  
+
   /**
    * Compute the content of a string with the given literal representation.
    * @param lexeme the literal representation of the string
@@ -447,7 +440,7 @@
     }
     return builder.toString();
   }
-  
+
   /**
    * Convert the given method declaration into the nearest valid top-level function declaration.
    * @param method the method to be converted
@@ -455,7 +448,7 @@
    * declaration
    */
   FunctionDeclaration convertToFunctionDeclaration(MethodDeclaration method) => new FunctionDeclaration.full(method.documentationComment, method.metadata, method.externalKeyword, method.returnType, method.propertyKeyword, method.name, new FunctionExpression.full(method.parameters, method.body));
-  
+
   /**
    * Return {@code true} if the current token could be the start of a compilation unit member. This
    * method is used for recovery purposes to decide when to stop skipping tokens after finding an
@@ -485,31 +478,31 @@
     }
     return false;
   }
-  
+
   /**
    * Create a synthetic identifier.
    * @return the synthetic identifier that was created
    */
   SimpleIdentifier createSyntheticIdentifier() => new SimpleIdentifier.full(createSyntheticToken2(TokenType.IDENTIFIER));
-  
+
   /**
    * Create a synthetic string literal.
    * @return the synthetic string literal that was created
    */
   SimpleStringLiteral createSyntheticStringLiteral() => new SimpleStringLiteral.full(createSyntheticToken2(TokenType.STRING), "");
-  
+
   /**
    * Create a synthetic token representing the given keyword.
    * @return the synthetic token that was created
    */
   Token createSyntheticToken(Keyword keyword) => new KeywordToken_11(keyword, _currentToken.offset);
-  
+
   /**
    * Create a synthetic token with the given type.
    * @return the synthetic token that was created
    */
   Token createSyntheticToken2(TokenType type) => new StringToken(type, "", _currentToken.offset);
-  
+
   /**
    * Check that the given expression is assignable and report an error if it isn't.
    * <pre>
@@ -528,7 +521,7 @@
       reportError7(ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE, []);
     }
   }
-  
+
   /**
    * If the current token is a keyword matching the given string, return it after advancing to the
    * next token. Otherwise report an error and return the current token without advancing.
@@ -542,7 +535,7 @@
     reportError7(ParserErrorCode.EXPECTED_TOKEN, [keyword.syntax]);
     return _currentToken;
   }
-  
+
   /**
    * If the current token has the expected type, return it after advancing to the next token.
    * Otherwise report an error and return the current token without advancing.
@@ -560,7 +553,7 @@
     }
     return _currentToken;
   }
-  
+
   /**
    * Search the given list of ranges for a range that contains the given index. Return the range
    * that was found, or {@code null} if none of the ranges contain the index.
@@ -578,7 +571,7 @@
     }
     return null;
   }
-  
+
   /**
    * Advance to the next token in the token stream, making it the new current token.
    * @return the token that was current before this method was invoked
@@ -588,7 +581,7 @@
     advance();
     return token;
   }
-  
+
   /**
    * Return a list of the ranges of characters in the given comment string that should be treated as
    * code blocks.
@@ -630,7 +623,7 @@
     }
     return ranges;
   }
-  
+
   /**
    * Return the end token associated with the given begin token, or {@code null} if either the given
    * token is not a begin token or it does not have an end token associated with it.
@@ -643,7 +636,7 @@
     }
     return null;
   }
-  
+
   /**
    * Return {@code true} if the current token is the first token of a return type that is followed
    * by an identifier, possibly followed by a list of type parameters, followed by a
@@ -659,7 +652,7 @@
     }
     return matchesIdentifier2(next);
   }
-  
+
   /**
    * Return {@code true} if the current token appears to be the beginning of a function declaration.
    * @return {@code true} if the current token appears to be the beginning of a function declaration
@@ -681,7 +674,7 @@
     }
     return isFunctionExpression(afterIdentifier);
   }
-  
+
   /**
    * Return {@code true} if the given token appears to be the beginning of a function expression.
    * @param startToken the token that might be the start of a function expression
@@ -694,14 +687,14 @@
     }
     return matchesAny(afterParameters, [TokenType.OPEN_CURLY_BRACKET, TokenType.FUNCTION]);
   }
-  
+
   /**
    * Return {@code true} if the given character is a valid hexadecimal digit.
    * @param character the character being tested
    * @return {@code true} if the character is a valid hexadecimal digit
    */
   bool isHexDigit(int character) => (0x30 <= character && character <= 0x39) || (0x41 <= character && character <= 0x46) || (0x61 <= character && character <= 0x66);
-  
+
   /**
    * Return {@code true} if the current token is the first token in an initialized variable
    * declaration rather than an expression. This method assumes that we have already skipped past
@@ -742,7 +735,7 @@
     TokenType type2 = token.type;
     return identical(type2, TokenType.EQ) || identical(type2, TokenType.COMMA) || identical(type2, TokenType.SEMICOLON) || matches3(token, Keyword.IN);
   }
-  
+
   /**
    * Given that we have just found bracketed text within a comment, look to see whether that text is
    * (a) followed by a parenthesized link address, (b) followed by a colon, or (c) followed by
@@ -773,7 +766,7 @@
     }
     return nextChar == 0x5B;
   }
-  
+
   /**
    * Return {@code true} if the given token appears to be the beginning of an operator declaration.
    * @param startToken the token that might be the start of an operator declaration
@@ -789,7 +782,7 @@
     }
     return false;
   }
-  
+
   /**
    * Return {@code true} if the current token appears to be the beginning of a switch member.
    * @return {@code true} if the current token appears to be the beginning of a switch member
@@ -805,7 +798,7 @@
     }
     return false;
   }
-  
+
   /**
    * Compare the given tokens to find the token that appears first in the source being parsed. That
    * is, return the left-most of all of the tokens. The arguments are allowed to be {@code null}.
@@ -828,21 +821,21 @@
     }
     return first;
   }
-  
+
   /**
    * Return {@code true} if the current token matches the given keyword.
    * @param keyword the keyword that can optionally appear in the current location
    * @return {@code true} if the current token matches the given keyword
    */
   bool matches(Keyword keyword) => matches3(_currentToken, keyword);
-  
+
   /**
    * Return {@code true} if the current token matches the given identifier.
    * @param identifier the identifier that can optionally appear in the current location
    * @return {@code true} if the current token matches the given identifier
    */
   bool matches2(String identifier) => identical(_currentToken.type, TokenType.IDENTIFIER) && _currentToken.lexeme == identifier;
-  
+
   /**
    * Return {@code true} if the given token matches the given keyword.
    * @param token the token being tested
@@ -850,7 +843,7 @@
    * @return {@code true} if the given token matches the given keyword
    */
   bool matches3(Token token, Keyword keyword2) => identical(token.type, TokenType.KEYWORD) && identical(((token as KeywordToken)).keyword, keyword2);
-  
+
   /**
    * Return {@code true} if the given token has the given type.
    * @param token the token being tested
@@ -858,7 +851,7 @@
    * @return {@code true} if the given token has the given type
    */
   bool matches4(Token token, TokenType type2) => identical(token.type, type2);
-  
+
   /**
    * Return {@code true} if the current token has the given type. Note that this method, unlike
    * other variants, will modify the token stream if possible to match a wider range of tokens. In
@@ -906,7 +899,7 @@
     }
     return true;
   }
-  
+
   /**
    * Return {@code true} if the given token has any one of the given types.
    * @param token the token being tested
@@ -922,21 +915,21 @@
     }
     return false;
   }
-  
+
   /**
    * Return {@code true} if the current token is a valid identifier. Valid identifiers include
    * built-in identifiers (pseudo-keywords).
    * @return {@code true} if the current token is a valid identifier
    */
   bool matchesIdentifier() => matchesIdentifier2(_currentToken);
-  
+
   /**
    * Return {@code true} if the given token is a valid identifier. Valid identifiers include
    * built-in identifiers (pseudo-keywords).
    * @return {@code true} if the given token is a valid identifier
    */
   bool matchesIdentifier2(Token token) => matches4(token, TokenType.IDENTIFIER) || (matches4(token, TokenType.KEYWORD) && ((token as KeywordToken)).keyword.isPseudoKeyword());
-  
+
   /**
    * If the current token has the given type, then advance to the next token and return {@code true}. Otherwise, return {@code false} without advancing.
    * @param type the type of token that can optionally appear in the current location
@@ -949,7 +942,7 @@
     }
     return false;
   }
-  
+
   /**
    * Parse an additive expression.
    * <pre>
@@ -972,7 +965,7 @@
     }
     return expression;
   }
-  
+
   /**
    * Parse an annotation.
    * <pre>
@@ -996,7 +989,7 @@
     }
     return new Annotation.full(atSign, name, period, constructorName, arguments);
   }
-  
+
   /**
    * Parse an argument.
    * <pre>
@@ -1017,7 +1010,7 @@
       return parseExpression2();
     }
   }
-  
+
   /**
    * Parse an argument definition test.
    * <pre>
@@ -1031,7 +1024,7 @@
     SimpleIdentifier identifier = parseSimpleIdentifier();
     return new ArgumentDefinitionTest.full(question, identifier);
   }
-  
+
   /**
    * Parse a list of arguments.
    * <pre>
@@ -1068,7 +1061,7 @@
     Token rightParenthesis = expect2(TokenType.CLOSE_PAREN);
     return new ArgumentList.full(leftParenthesis, arguments, rightParenthesis);
   }
-  
+
   /**
    * Parse an assert statement.
    * <pre>
@@ -1085,7 +1078,7 @@
     Token semicolon = expect2(TokenType.SEMICOLON);
     return new AssertStatement.full(keyword, leftParen, expression, rightParen, semicolon);
   }
-  
+
   /**
    * Parse an assignable expression.
    * <pre>
@@ -1134,7 +1127,7 @@
       isOptional = true;
     }
   }
-  
+
   /**
    * Parse an assignable selector.
    * <pre>
@@ -1162,7 +1155,7 @@
       return prefix;
     }
   }
-  
+
   /**
    * Parse a bitwise and expression.
    * <pre>
@@ -1185,7 +1178,7 @@
     }
     return expression;
   }
-  
+
   /**
    * Parse a bitwise or expression.
    * <pre>
@@ -1208,7 +1201,7 @@
     }
     return expression;
   }
-  
+
   /**
    * Parse a bitwise exclusive-or expression.
    * <pre>
@@ -1231,7 +1224,7 @@
     }
     return expression;
   }
-  
+
   /**
    * Parse a block.
    * <pre>
@@ -1258,7 +1251,7 @@
     Token rightBracket = expect2(TokenType.CLOSE_CURLY_BRACKET);
     return new Block.full(leftBracket, statements, rightBracket);
   }
-  
+
   /**
    * Parse a break statement.
    * <pre>
@@ -1279,7 +1272,7 @@
     Token semicolon = expect2(TokenType.SEMICOLON);
     return new BreakStatement.full(breakKeyword, label, semicolon);
   }
-  
+
   /**
    * Parse a cascade section.
    * <pre>
@@ -1344,7 +1337,7 @@
     }
     return expression;
   }
-  
+
   /**
    * Parse a class declaration.
    * <pre>
@@ -1423,7 +1416,7 @@
     }
     return new ClassDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, abstractKeyword, keyword, name, typeParameters, extendsClause, withClause, implementsClause, leftBracket, members, rightBracket);
   }
-  
+
   /**
    * Parse a class member.
    * <pre>
@@ -1532,7 +1525,7 @@
     }
     return parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, validateModifiersForField(modifiers), type);
   }
-  
+
   /**
    * Parse a list of class members.
    * <pre>
@@ -1565,7 +1558,7 @@
     }
     return members;
   }
-  
+
   /**
    * Parse a class type alias.
    * <pre>
@@ -1614,7 +1607,7 @@
     }
     return new ClassTypeAlias.full(commentAndMetadata.comment, commentAndMetadata.metadata, keyword, className, typeParameters, equals, abstractKeyword, superclass, withClause, implementsClause, semicolon);
   }
-  
+
   /**
    * Parse a list of combinators in a directive.
    * <pre>
@@ -1638,7 +1631,7 @@
     }
     return combinators;
   }
-  
+
   /**
    * Parse the documentation comment and metadata preceeding a declaration. This method allows any
    * number of documentation comments to occur before, after or between the metadata, but only
@@ -1661,7 +1654,7 @@
     }
     return new CommentAndMetadata(comment, metadata);
   }
-  
+
   /**
    * Parse a comment reference from the source between square brackets.
    * <pre>
@@ -1714,7 +1707,7 @@
     }
     return null;
   }
-  
+
   /**
    * Parse all of the comment references occurring in the given array of documentation comments.
    * <pre>
@@ -1759,7 +1752,7 @@
     }
     return references;
   }
-  
+
   /**
    * Parse a compilation unit.
    * <p>
@@ -1852,7 +1845,7 @@
     }
     return new CompilationUnit.full(firstToken, scriptTag, directives, declarations, _currentToken);
   }
-  
+
   /**
    * Parse a compilation unit member.
    * <pre>
@@ -1935,7 +1928,7 @@
     }
     return new TopLevelVariableDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, parseVariableDeclarationList2(null, validateModifiersForTopLevelVariable(modifiers), returnType), expect2(TokenType.SEMICOLON));
   }
-  
+
   /**
    * Parse a conditional expression.
    * <pre>
@@ -1955,7 +1948,7 @@
     Expression elseExpression = parseExpressionWithoutCascade();
     return new ConditionalExpression.full(condition, question, thenExpression, colon, elseExpression);
   }
-  
+
   /**
    * Parse a const expression.
    * <pre>
@@ -2026,7 +2019,7 @@
     }
     return new ConstructorDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, externalKeyword, constKeyword, factoryKeyword, returnType, period, name, parameters, separator, initializers, redirectedConstructor, body);
   }
-  
+
   /**
    * Parse a field initializer within a constructor.
    * <pre>
@@ -2059,7 +2052,7 @@
     }
     return new ConstructorFieldInitializer.full(keyword, period, fieldName, equals, expression);
   }
-  
+
   /**
    * Parse the name of a constructor.
    * <pre>
@@ -2078,7 +2071,7 @@
     }
     return new ConstructorName.full(type, period, name);
   }
-  
+
   /**
    * Parse a continue statement.
    * <pre>
@@ -2102,7 +2095,7 @@
     Token semicolon = expect2(TokenType.SEMICOLON);
     return new ContinueStatement.full(continueKeyword, label, semicolon);
   }
-  
+
   /**
    * Parse a directive.
    * <pre>
@@ -2128,7 +2121,7 @@
       throw new IllegalStateException("parseDirective invoked in an invalid state; currentToken = ${_currentToken}");
     }
   }
-  
+
   /**
    * Parse a documentation comment.
    * <pre>
@@ -2164,7 +2157,7 @@
     List<CommentReference> references = parseCommentReferences(tokens);
     return Comment.createDocumentationComment2(tokens, references);
   }
-  
+
   /**
    * Parse a do statement.
    * <pre>
@@ -2189,7 +2182,7 @@
       _inLoop = wasInLoop;
     }
   }
-  
+
   /**
    * Parse an empty statement.
    * <pre>
@@ -2199,7 +2192,7 @@
    * @return the empty statement that was parsed
    */
   Statement parseEmptyStatement() => new EmptyStatement.full(andAdvance);
-  
+
   /**
    * Parse an equality expression.
    * <pre>
@@ -2222,7 +2215,7 @@
     }
     return expression;
   }
-  
+
   /**
    * Parse an export directive.
    * <pre>
@@ -2239,7 +2232,7 @@
     Token semicolon = expect2(TokenType.SEMICOLON);
     return new ExportDirective.full(commentAndMetadata.comment, commentAndMetadata.metadata, exportKeyword, libraryUri, combinators, semicolon);
   }
-  
+
   /**
    * Parse an expression that does not contain any cascades.
    * <pre>
@@ -2275,7 +2268,7 @@
     }
     return expression;
   }
-  
+
   /**
    * Parse a list of expressions.
    * <pre>
@@ -2292,7 +2285,7 @@
     }
     return expressions;
   }
-  
+
   /**
    * Parse an expression that does not contain any cascades.
    * <pre>
@@ -2317,7 +2310,7 @@
     }
     return expression;
   }
-  
+
   /**
    * Parse a class extends clause.
    * <pre>
@@ -2331,7 +2324,7 @@
     TypeName superclass = parseTypeName();
     return new ExtendsClause.full(keyword, superclass);
   }
-  
+
   /**
    * Parse the 'final', 'const', 'var' or type preceding a variable declaration.
    * <pre>
@@ -2363,7 +2356,7 @@
     }
     return new FinalConstVarOrType(keyword, type);
   }
-  
+
   /**
    * Parse a formal parameter. At most one of {@code isOptional} and {@code isNamed} can be{@code true}.
    * <pre>
@@ -2401,7 +2394,7 @@
     }
     return parameter;
   }
-  
+
   /**
    * Parse a list of formal parameters.
    * <pre>
@@ -2524,7 +2517,7 @@
     }
     return new FormalParameterList.full(leftParenthesis, parameters, leftSquareBracket, rightSquareBracket, rightParenthesis);
   }
-  
+
   /**
    * Parse a for statement.
    * <pre>
@@ -2599,7 +2592,7 @@
       _inLoop = wasInLoop;
     }
   }
-  
+
   /**
    * Parse a function body.
    * <pre>
@@ -2653,7 +2646,7 @@
       _inSwitch = wasInSwitch;
     }
   }
-  
+
   /**
    * Parse a function declaration.
    * <pre>
@@ -2698,7 +2691,7 @@
     }
     return new FunctionDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, externalKeyword, returnType, keyword, name, new FunctionExpression.full(parameters, body));
   }
-  
+
   /**
    * Parse a function declaration statement.
    * <pre>
@@ -2708,7 +2701,7 @@
    * @return the function declaration statement that was parsed
    */
   Statement parseFunctionDeclarationStatement() => parseFunctionDeclarationStatement2(parseCommentAndMetadata(), parseOptionalReturnType());
-  
+
   /**
    * Parse a function declaration statement.
    * <pre>
@@ -2721,7 +2714,7 @@
    * @return the function declaration statement that was parsed
    */
   Statement parseFunctionDeclarationStatement2(CommentAndMetadata commentAndMetadata, TypeName returnType) => new FunctionDeclarationStatement.full(parseFunctionDeclaration(commentAndMetadata, null, returnType));
-  
+
   /**
    * Parse a function expression.
    * <pre>
@@ -2736,7 +2729,7 @@
     FunctionBody body = parseFunctionBody(false, ParserErrorCode.MISSING_FUNCTION_BODY, true);
     return new FunctionExpression.full(parameters, body);
   }
-  
+
   /**
    * Parse a function type alias.
    * <pre>
@@ -2773,7 +2766,7 @@
     Token semicolon = expect2(TokenType.SEMICOLON);
     return new FunctionTypeAlias.full(commentAndMetadata.comment, commentAndMetadata.metadata, keyword, returnType, name, typeParameters, parameters, semicolon);
   }
-  
+
   /**
    * Parse a getter.
    * <pre>
@@ -2804,7 +2797,7 @@
     }
     return new MethodDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, externalKeyword, staticKeyword, returnType, propertyKeyword, null, name, null, body);
   }
-  
+
   /**
    * Parse a list of identifiers.
    * <pre>
@@ -2822,7 +2815,7 @@
     }
     return identifiers;
   }
-  
+
   /**
    * Parse an if statement.
    * <pre>
@@ -2845,7 +2838,7 @@
     }
     return new IfStatement.full(ifKeyword, leftParenthesis, condition, rightParenthesis, thenStatement, elseKeyword, elseStatement);
   }
-  
+
   /**
    * Parse an implements clause.
    * <pre>
@@ -2863,7 +2856,7 @@
     }
     return new ImplementsClause.full(keyword, interfaces);
   }
-  
+
   /**
    * Parse an import directive.
    * <pre>
@@ -2886,7 +2879,7 @@
     Token semicolon = expect2(TokenType.SEMICOLON);
     return new ImportDirective.full(commentAndMetadata.comment, commentAndMetadata.metadata, importKeyword, libraryUri, asToken, prefix, combinators, semicolon);
   }
-  
+
   /**
    * Parse a list of initialized identifiers.
    * <pre>
@@ -2910,7 +2903,7 @@
     VariableDeclarationList fieldList = parseVariableDeclarationList2(null, keyword, type);
     return new FieldDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, staticKeyword, fieldList, expect2(TokenType.SEMICOLON));
   }
-  
+
   /**
    * Parse an instance creation expression.
    * <pre>
@@ -2925,7 +2918,7 @@
     ArgumentList argumentList = parseArgumentList();
     return new InstanceCreationExpression.full(keyword, constructorName, argumentList);
   }
-  
+
   /**
    * Parse a library directive.
    * <pre>
@@ -2941,7 +2934,7 @@
     Token semicolon = expect2(TokenType.SEMICOLON);
     return new LibraryDirective.full(commentAndMetadata.comment, commentAndMetadata.metadata, keyword, libraryName, semicolon);
   }
-  
+
   /**
    * Parse a library identifier.
    * <pre>
@@ -2959,7 +2952,7 @@
     }
     return new LibraryIdentifier.full(components);
   }
-  
+
   /**
    * Parse a library name.
    * <pre>
@@ -2984,7 +2977,7 @@
     components.add(createSyntheticIdentifier());
     return new LibraryIdentifier.full(components);
   }
-  
+
   /**
    * Parse a list literal.
    * <pre>
@@ -3023,7 +3016,7 @@
     Token rightBracket = expect2(TokenType.CLOSE_SQUARE_BRACKET);
     return new ListLiteral.full(modifier, typeArguments, leftBracket, elements, rightBracket);
   }
-  
+
   /**
    * Parse a list or map literal.
    * <pre>
@@ -3048,7 +3041,7 @@
     reportError7(ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL, []);
     return new ListLiteral.full(modifier, typeArguments, createSyntheticToken2(TokenType.OPEN_SQUARE_BRACKET), null, createSyntheticToken2(TokenType.CLOSE_SQUARE_BRACKET));
   }
-  
+
   /**
    * Parse a logical and expression.
    * <pre>
@@ -3065,7 +3058,7 @@
     }
     return expression;
   }
-  
+
   /**
    * Parse a logical or expression.
    * <pre>
@@ -3082,7 +3075,7 @@
     }
     return expression;
   }
-  
+
   /**
    * Parse a map literal.
    * <pre>
@@ -3117,7 +3110,7 @@
     Token rightBracket = expect2(TokenType.CLOSE_CURLY_BRACKET);
     return new MapLiteral.full(modifier, typeArguments, leftBracket, entries, rightBracket);
   }
-  
+
   /**
    * Parse a map literal entry.
    * <pre>
@@ -3132,7 +3125,7 @@
     Expression value = parseExpression2();
     return new MapLiteralEntry.full(key, separator, value);
   }
-  
+
   /**
    * Parse a method declaration.
    * <pre>
@@ -3153,7 +3146,7 @@
     validateFormalParameterList(parameters);
     return parseMethodDeclaration2(commentAndMetadata, externalKeyword, staticKeyword, returnType, methodName, parameters);
   }
-  
+
   /**
    * Parse a method declaration.
    * <pre>
@@ -3183,7 +3176,7 @@
     }
     return new MethodDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, externalKeyword, staticKeyword, returnType, null, null, name, parameters, body);
   }
-  
+
   /**
    * Parse the modifiers preceding a declaration. This method allows the modifiers to appear in any
    * order but does generate errors for duplicated modifiers. Checks for other problems, such as
@@ -3254,7 +3247,7 @@
     }
     return modifiers;
   }
-  
+
   /**
    * Parse a multiplicative expression.
    * <pre>
@@ -3277,7 +3270,7 @@
     }
     return expression;
   }
-  
+
   /**
    * Parse a new expression.
    * <pre>
@@ -3287,7 +3280,7 @@
    * @return the new expression that was parsed
    */
   InstanceCreationExpression parseNewExpression() => parseInstanceCreationExpression(expect(Keyword.NEW));
-  
+
   /**
    * Parse a non-labeled statement.
    * <pre>
@@ -3394,7 +3387,7 @@
       return new ExpressionStatement.full(parseExpression2(), expect2(TokenType.SEMICOLON));
     }
   }
-  
+
   /**
    * Parse a normal formal parameter.
    * <pre>
@@ -3437,7 +3430,7 @@
     }
     return new SimpleFormalParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, holder.keyword, holder.type, identifier);
   }
-  
+
   /**
    * Parse an operator declaration.
    * <pre>
@@ -3480,7 +3473,7 @@
     }
     return new MethodDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, externalKeyword, null, returnType, null, operatorKeyword, name, parameters, body);
   }
-  
+
   /**
    * Parse a return type if one is given, otherwise return {@code null} without advancing.
    * @return the return type that was parsed
@@ -3495,7 +3488,7 @@
     }
     return null;
   }
-  
+
   /**
    * Parse a part or part-of directive.
    * <pre>
@@ -3519,7 +3512,7 @@
     Token semicolon = expect2(TokenType.SEMICOLON);
     return new PartDirective.full(commentAndMetadata.comment, commentAndMetadata.metadata, partKeyword, partUri, semicolon);
   }
-  
+
   /**
    * Parse a postfix expression.
    * <pre>
@@ -3559,7 +3552,7 @@
     Token operator = andAdvance;
     return new PostfixExpression.full(operand, operator);
   }
-  
+
   /**
    * Parse a prefixed identifier.
    * <pre>
@@ -3577,7 +3570,7 @@
     SimpleIdentifier qualified = parseSimpleIdentifier();
     return new PrefixedIdentifier.full(qualifier, period, qualified);
   }
-  
+
   /**
    * Parse a primary expression.
    * <pre>
@@ -3617,7 +3610,7 @@
       double value = 0.0;
       try {
         value = double.parse(token.lexeme);
-      } on NumberFormatException catch (exception) {
+      } on FormatException catch (exception) {
       }
       return new DoubleLiteral.full(token, value);
     } else if (matches5(TokenType.HEXADECIMAL)) {
@@ -3625,7 +3618,7 @@
       int value = null;
       try {
         value = int.parse(token.lexeme.substring(2), radix: 16);
-      } on NumberFormatException catch (exception) {
+      } on FormatException catch (exception) {
       }
       return new IntegerLiteral.full(token, value);
     } else if (matches5(TokenType.INT)) {
@@ -3633,7 +3626,7 @@
       int value = null;
       try {
         value = int.parse(token.lexeme);
-      } on NumberFormatException catch (exception) {
+      } on FormatException catch (exception) {
       }
       return new IntegerLiteral.full(token, value);
     } else if (matches5(TokenType.STRING)) {
@@ -3669,7 +3662,7 @@
       return createSyntheticIdentifier();
     }
   }
-  
+
   /**
    * Parse a redirecting constructor invocation.
    * <pre>
@@ -3689,7 +3682,7 @@
     ArgumentList argumentList = parseArgumentList();
     return new RedirectingConstructorInvocation.full(keyword, period, constructorName, argumentList);
   }
-  
+
   /**
    * Parse a relational expression.
    * <pre>
@@ -3723,7 +3716,7 @@
     }
     return expression;
   }
-  
+
   /**
    * Parse a rethrow expression.
    * <pre>
@@ -3733,7 +3726,7 @@
    * @return the rethrow expression that was parsed
    */
   Expression parseRethrowExpression() => new RethrowExpression.full(expect(Keyword.RETHROW));
-  
+
   /**
    * Parse a return statement.
    * <pre>
@@ -3751,7 +3744,7 @@
     Token semicolon = expect2(TokenType.SEMICOLON);
     return new ReturnStatement.full(returnKeyword, expression, semicolon);
   }
-  
+
   /**
    * Parse a return type.
    * <pre>
@@ -3768,7 +3761,7 @@
       return parseTypeName();
     }
   }
-  
+
   /**
    * Parse a setter.
    * <pre>
@@ -3796,7 +3789,7 @@
     }
     return new MethodDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, externalKeyword, staticKeyword, returnType, propertyKeyword, null, name, parameters, body);
   }
-  
+
   /**
    * Parse a shift expression.
    * <pre>
@@ -3819,7 +3812,7 @@
     }
     return expression;
   }
-  
+
   /**
    * Parse a simple identifier.
    * <pre>
@@ -3835,7 +3828,7 @@
     reportError7(ParserErrorCode.MISSING_IDENTIFIER, []);
     return createSyntheticIdentifier();
   }
-  
+
   /**
    * Parse a statement.
    * <pre>
@@ -3857,7 +3850,7 @@
     }
     return new LabeledStatement.full(labels, statement);
   }
-  
+
   /**
    * Parse a list of statements within a switch statement.
    * <pre>
@@ -3879,7 +3872,7 @@
     }
     return statements;
   }
-  
+
   /**
    * Parse a string literal that contains interpolations.
    * @return the string literal that was parsed
@@ -3910,7 +3903,7 @@
     }
     return new StringInterpolation.full(elements);
   }
-  
+
   /**
    * Parse a string literal.
    * <pre>
@@ -3939,7 +3932,7 @@
       return new AdjacentStrings.full(strings);
     }
   }
-  
+
   /**
    * Parse a super constructor invocation.
    * <pre>
@@ -3959,7 +3952,7 @@
     ArgumentList argumentList = parseArgumentList();
     return new SuperConstructorInvocation.full(keyword, period, constructorName, argumentList);
   }
-  
+
   /**
    * Parse a switch statement.
    * <pre>
@@ -4025,7 +4018,7 @@
       _inSwitch = wasInSwitch;
     }
   }
-  
+
   /**
    * Parse a throw expression.
    * <pre>
@@ -4043,7 +4036,7 @@
     Expression expression = parseExpression2();
     return new ThrowExpression.full(keyword, expression);
   }
-  
+
   /**
    * Parse a throw expression.
    * <pre>
@@ -4061,7 +4054,7 @@
     Expression expression = parseExpressionWithoutCascade();
     return new ThrowExpression.full(keyword, expression);
   }
-  
+
   /**
    * Parse a try statement.
    * <pre>
@@ -4119,7 +4112,7 @@
     }
     return new TryStatement.full(tryKeyword, body, catchClauses, finallyKeyword, finallyClause);
   }
-  
+
   /**
    * Parse a type alias.
    * <pre>
@@ -4155,7 +4148,7 @@
     }
     return parseFunctionTypeAlias(commentAndMetadata, keyword);
   }
-  
+
   /**
    * Parse a list of type arguments.
    * <pre>
@@ -4176,7 +4169,7 @@
     Token rightBracket = expect2(TokenType.GT);
     return new TypeArgumentList.full(leftBracket, arguments, rightBracket);
   }
-  
+
   /**
    * Parse a type name.
    * <pre>
@@ -4202,7 +4195,7 @@
     }
     return new TypeName.full(typeName, typeArguments);
   }
-  
+
   /**
    * Parse a type parameter.
    * <pre>
@@ -4221,7 +4214,7 @@
     }
     return new TypeParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, name, null, null);
   }
-  
+
   /**
    * Parse a list of type parameters.
    * <pre>
@@ -4240,7 +4233,7 @@
     Token rightBracket = expect2(TokenType.GT);
     return new TypeParameterList.full(leftBracket, typeParameters, rightBracket);
   }
-  
+
   /**
    * Parse a unary expression.
    * <pre>
@@ -4289,7 +4282,7 @@
     }
     return parsePostfixExpression();
   }
-  
+
   /**
    * Parse a variable declaration.
    * <pre>
@@ -4309,7 +4302,7 @@
     }
     return new VariableDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, name, equals, initializer);
   }
-  
+
   /**
    * Parse a variable declaration list.
    * <pre>
@@ -4323,7 +4316,7 @@
     FinalConstVarOrType holder = parseFinalConstVarOrType(false);
     return parseVariableDeclarationList2(commentAndMetadata, holder.keyword, holder.type);
   }
-  
+
   /**
    * Parse a variable declaration list.
    * <pre>
@@ -4345,7 +4338,7 @@
     }
     return new VariableDeclarationList.full(commentAndMetadata != null ? commentAndMetadata.comment : null, commentAndMetadata != null ? commentAndMetadata.metadata : null, keyword, type, variables);
   }
-  
+
   /**
    * Parse a variable declaration statement.
    * <pre>
@@ -4361,7 +4354,7 @@
     Token semicolon = expect2(TokenType.SEMICOLON);
     return new VariableDeclarationStatement.full(variableList, semicolon);
   }
-  
+
   /**
    * Parse a variable declaration statement.
    * <pre>
@@ -4380,7 +4373,7 @@
     Token semicolon = expect2(TokenType.SEMICOLON);
     return new VariableDeclarationStatement.full(variableList, semicolon);
   }
-  
+
   /**
    * Parse a while statement.
    * <pre>
@@ -4403,7 +4396,7 @@
       _inLoop = wasInLoop;
     }
   }
-  
+
   /**
    * Parse a with clause.
    * <pre>
@@ -4421,13 +4414,13 @@
     }
     return new WithClause.full(with2, types);
   }
-  
+
   /**
    * Return the token that is immediately after the current token. This is equivalent to{@link #peek(int) peek(1)}.
    * @return the token that is immediately after the current token
    */
   Token peek() => _currentToken.next;
-  
+
   /**
    * Return the token that is the given distance after the current token.
    * @param distance the number of tokens to look ahead, where {@code 0} is the current token,{@code 1} is the next token, etc.
@@ -4440,7 +4433,7 @@
     }
     return token;
   }
-  
+
   /**
    * Report an error with the given error code and arguments.
    * @param errorCode the error code of the error to be reported
@@ -4450,7 +4443,7 @@
   void reportError(ParserErrorCode errorCode, ASTNode node, List<Object> arguments) {
     _errorListener.onError(new AnalysisError.con2(_source, node.offset, node.length, errorCode, arguments));
   }
-  
+
   /**
    * Report an error with the given error code and arguments.
    * @param errorCode the error code of the error to be reported
@@ -4459,7 +4452,7 @@
   void reportError7(ParserErrorCode errorCode, List<Object> arguments) {
     reportError8(errorCode, _currentToken, arguments);
   }
-  
+
   /**
    * Report an error with the given error code and arguments.
    * @param errorCode the error code of the error to be reported
@@ -4469,7 +4462,7 @@
   void reportError8(ParserErrorCode errorCode, Token token, List<Object> arguments) {
     _errorListener.onError(new AnalysisError.con2(_source, token.offset, token.length, errorCode, arguments));
   }
-  
+
   /**
    * Parse the 'final', 'const', 'var' or type preceding a variable declaration, starting at the
    * given token, without actually creating a type or changing the current token. Return the token
@@ -4501,7 +4494,7 @@
     }
     return null;
   }
-  
+
   /**
    * Parse a list of formal parameters, starting at the given token, without actually creating a
    * formal parameter list or changing the current token. Return the token following the formal
@@ -4559,7 +4552,7 @@
     }
     return skipPastMatchingToken(startToken);
   }
-  
+
   /**
    * If the given token is a begin token with an associated end token, then return the token
    * following the end token. Otherwise, return {@code null}.
@@ -4576,7 +4569,7 @@
     }
     return closeParen.next;
   }
-  
+
   /**
    * Parse a prefixed identifier, starting at the given token, without actually creating a prefixed
    * identifier or changing the current token. Return the token following the prefixed identifier
@@ -4600,7 +4593,7 @@
     }
     return skipSimpleIdentifier(token.next);
   }
-  
+
   /**
    * Parse a return type, starting at the given token, without actually creating a return type or
    * changing the current token. Return the token following the return type that was parsed, or{@code null} if the given token is not the first token in a valid return type.
@@ -4621,7 +4614,7 @@
       return skipTypeName(startToken);
     }
   }
-  
+
   /**
    * Parse a simple identifier, starting at the given token, without actually creating a simple
    * identifier or changing the current token. Return the token following the simple identifier that
@@ -4642,7 +4635,7 @@
     }
     return null;
   }
-  
+
   /**
    * Parse a string literal that contains interpolations, starting at the given token, without
    * actually creating a string literal or changing the current token. Return the token following
@@ -4695,7 +4688,7 @@
     }
     return token;
   }
-  
+
   /**
    * Parse a string literal, starting at the given token, without actually creating a string literal
    * or changing the current token. Return the token following the string literal that was parsed,
@@ -4724,7 +4717,7 @@
     }
     return token;
   }
-  
+
   /**
    * Parse a list of type arguments, starting at the given token, without actually creating a type argument list
    * or changing the current token. Return the token following the type argument list that was parsed,
@@ -4764,7 +4757,7 @@
     }
     return null;
   }
-  
+
   /**
    * Parse a type name, starting at the given token, without actually creating a type name or
    * changing the current token. Return the token following the type name that was parsed, or{@code null} if the given token is not the first token in a valid type name.
@@ -4787,7 +4780,7 @@
     }
     return token;
   }
-  
+
   /**
    * Parse a list of type parameters, starting at the given token, without actually creating a type
    * parameter list or changing the current token. Return the token following the type parameter
@@ -4838,7 +4831,7 @@
     }
     return next2;
   }
-  
+
   /**
    * Translate the characters at the given index in the given string, appending the translated
    * character to the given builder. The index is assumed to be valid.
@@ -4944,7 +4937,7 @@
     }
     return currentIndex + 1;
   }
-  
+
   /**
    * Validate that the given parameter list does not contain any field initializers.
    * @param parameterList the parameter list to be validated
@@ -4956,7 +4949,7 @@
       }
     }
   }
-  
+
   /**
    * Validate that the given set of modifiers is appropriate for a class and return the 'abstract'
    * keyword if there is one.
@@ -4978,7 +4971,7 @@
     }
     return modifiers.abstractKeyword;
   }
-  
+
   /**
    * Validate that the given set of modifiers is appropriate for a constructor and return the
    * 'const' keyword if there is one.
@@ -5009,7 +5002,7 @@
     }
     return constKeyword2;
   }
-  
+
   /**
    * Validate that the given set of modifiers is appropriate for a field and return the 'final',
    * 'const' or 'var' keyword if there is one.
@@ -5052,7 +5045,7 @@
     }
     return lexicallyFirst([constKeyword2, finalKeyword2, varKeyword2]);
   }
-  
+
   /**
    * Validate that the given set of modifiers is appropriate for a getter, setter, or method.
    * @param modifiers the modifiers being validated
@@ -5079,7 +5072,7 @@
       reportError8(ParserErrorCode.EXTERNAL_AFTER_STATIC, externalKeyword2, []);
     }
   }
-  
+
   /**
    * Validate that the given set of modifiers is appropriate for a getter, setter, or method.
    * @param modifiers the modifiers being validated
@@ -5104,7 +5097,7 @@
       reportError8(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword, []);
     }
   }
-  
+
   /**
    * Validate that the given set of modifiers is appropriate for a top-level declaration.
    * @param modifiers the modifiers being validated
@@ -5117,7 +5110,7 @@
       reportError8(ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION, modifiers.staticKeyword, []);
     }
   }
-  
+
   /**
    * Validate that the given set of modifiers is appropriate for a top-level function.
    * @param modifiers the modifiers being validated
@@ -5137,7 +5130,7 @@
       reportError8(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword, []);
     }
   }
-  
+
   /**
    * Validate that the given set of modifiers is appropriate for a field and return the 'final',
    * 'const' or 'var' keyword if there is one.
@@ -5169,7 +5162,7 @@
     }
     return lexicallyFirst([constKeyword2, finalKeyword2, varKeyword2]);
   }
-  
+
   /**
    * Validate that the given set of modifiers is appropriate for a class and return the 'abstract'
    * keyword if there is one.
@@ -5205,7 +5198,6 @@
     errorFound[0] = true;
   }
 }
-
 /**
  * The enumeration {@code 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
@@ -5334,45 +5326,45 @@
   static final ParserErrorCode VOID_PARAMETER = new ParserErrorCode.con2('VOID_PARAMETER', 117, "Parameters cannot have a type of 'void'");
   static final ParserErrorCode VOID_VARIABLE = new ParserErrorCode.con2('VOID_VARIABLE', 118, "Variables cannot have a type of 'void'");
   static final List<ParserErrorCode> values = [ABSTRACT_CLASS_MEMBER, ABSTRACT_STATIC_METHOD, ABSTRACT_TOP_LEVEL_FUNCTION, ABSTRACT_TOP_LEVEL_VARIABLE, ABSTRACT_TYPEDEF, BREAK_OUTSIDE_OF_LOOP, CONST_AND_FINAL, CONST_AND_VAR, CONST_CLASS, CONST_CONSTRUCTOR_WITH_BODY, CONST_FACTORY, CONST_METHOD, CONST_TYPEDEF, CONSTRUCTOR_WITH_RETURN_TYPE, CONTINUE_OUTSIDE_OF_LOOP, CONTINUE_WITHOUT_LABEL_IN_CASE, DEPRECATED_ARGUMENT_DEFINITION_TEST, DIRECTIVE_AFTER_DECLARATION, DUPLICATE_LABEL_IN_SWITCH_STATEMENT, DUPLICATED_MODIFIER, EXPECTED_CASE_OR_DEFAULT, EXPECTED_CLASS_MEMBER, EXPECTED_EXECUTABLE, EXPECTED_LIST_OR_MAP_LITERAL, EXPECTED_STRING_LITERAL, EXPECTED_TOKEN, EXPECTED_TWO_MAP_TYPE_ARGUMENTS, EXPECTED_TYPE_NAME, EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE, EXTERNAL_AFTER_CONST, EXTERNAL_AFTER_FACTORY, EXTERNAL_AFTER_STATIC, EXTERNAL_CLASS, EXTERNAL_CONSTRUCTOR_WITH_BODY, EXTERNAL_FIELD, EXTERNAL_GETTER_WITH_BODY, EXTERNAL_METHOD_WITH_BODY, EXTERNAL_OPERATOR_WITH_BODY, EXTERNAL_SETTER_WITH_BODY, EXTERNAL_TYPEDEF, FACTORY_TOP_LEVEL_DECLARATION, FACTORY_WITHOUT_BODY, FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, FINAL_AND_VAR, FINAL_CLASS, FINAL_CONSTRUCTOR, FINAL_METHOD, FINAL_TYPEDEF, GETTER_WITH_PARAMETERS, ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE, IMPLEMENTS_BEFORE_EXTENDS, IMPLEMENTS_BEFORE_WITH, IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE, INITIALIZED_VARIABLE_IN_FOR_EACH, INVALID_CODE_POINT, INVALID_COMMENT_REFERENCE, INVALID_HEX_ESCAPE, INVALID_OPERATOR, INVALID_OPERATOR_FOR_SUPER, INVALID_UNICODE_ESCAPE, LIBRARY_DIRECTIVE_NOT_FIRST, MISSING_ASSIGNABLE_SELECTOR, MISSING_CATCH_OR_FINALLY, MISSING_CLASS_BODY, MISSING_CLOSING_PARENTHESIS, MISSING_CONST_FINAL_VAR_OR_TYPE, MISSING_EXPRESSION_IN_THROW, MISSING_FUNCTION_BODY, MISSING_FUNCTION_PARAMETERS, MISSING_IDENTIFIER, MISSING_KEYWORD_OPERATOR, MISSING_NAME_IN_LIBRARY_DIRECTIVE, MISSING_NAME_IN_PART_OF_DIRECTIVE, MISSING_STATEMENT, MISSING_TERMINATOR_FOR_PARAMETER_GROUP, MISSING_TYPEDEF_PARAMETERS, MISSING_VARIABLE_IN_FOR_EACH, MIXED_PARAMETER_GROUPS, MULTIPLE_EXTENDS_CLAUSES, MULTIPLE_IMPLEMENTS_CLAUSES, MULTIPLE_LIBRARY_DIRECTIVES, MULTIPLE_NAMED_PARAMETER_GROUPS, MULTIPLE_PART_OF_DIRECTIVES, MULTIPLE_POSITIONAL_PARAMETER_GROUPS, MULTIPLE_VARIABLES_IN_FOR_EACH, MULTIPLE_WITH_CLAUSES, NAMED_FUNCTION_EXPRESSION, NAMED_PARAMETER_OUTSIDE_GROUP, NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE, NON_CONSTRUCTOR_FACTORY, NON_IDENTIFIER_LIBRARY_NAME, NON_PART_OF_DIRECTIVE_IN_PART, NON_USER_DEFINABLE_OPERATOR, POSITIONAL_AFTER_NAMED_ARGUMENT, POSITIONAL_PARAMETER_OUTSIDE_GROUP, STATIC_AFTER_CONST, STATIC_AFTER_FINAL, STATIC_AFTER_VAR, STATIC_CONSTRUCTOR, STATIC_GETTER_WITHOUT_BODY, STATIC_OPERATOR, STATIC_SETTER_WITHOUT_BODY, STATIC_TOP_LEVEL_DECLARATION, SWITCH_HAS_CASE_AFTER_DEFAULT_CASE, SWITCH_HAS_MULTIPLE_DEFAULT_CASES, TOP_LEVEL_OPERATOR, UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, UNEXPECTED_TOKEN, WITH_BEFORE_EXTENDS, WITH_WITHOUT_EXTENDS, WRONG_SEPARATOR_FOR_NAMED_PARAMETER, WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER, WRONG_TERMINATOR_FOR_PARAMETER_GROUP, VAR_AS_TYPE_NAME, VAR_CLASS, VAR_RETURN_TYPE, VAR_TYPEDEF, VOID_PARAMETER, VOID_VARIABLE];
-  
+
   /// The name of this enum constant, as declared in the enum declaration.
   final String name;
-  
+
   /// The position in the enum declaration.
   final int ordinal;
-  
+
   /**
    * The severity of this error.
    */
   ErrorSeverity _severity;
-  
+
   /**
    * The message template used to create the message to be displayed for this error.
    */
   String _message;
-  
+
   /**
    * Initialize a newly created error code to have the given severity and message.
    * @param severity the severity of the error
    * @param message the message template used to create the message to be displayed for the error
    */
   ParserErrorCode.con1(this.name, this.ordinal, ErrorSeverity severity2, String message2) {
-    _jtd_constructor_309_impl(severity2, message2);
+    _jtd_constructor_311_impl(severity2, message2);
   }
-  _jtd_constructor_309_impl(ErrorSeverity severity2, String message2) {
+  _jtd_constructor_311_impl(ErrorSeverity severity2, String message2) {
     this._severity = severity2;
     this._message = message2;
   }
-  
+
   /**
    * Initialize a newly created error code to have the given message and a severity of ERROR.
    * @param message the message template used to create the message to be displayed for the error
    */
   ParserErrorCode.con2(this.name, this.ordinal, String message) {
-    _jtd_constructor_310_impl(message);
+    _jtd_constructor_312_impl(message);
   }
-  _jtd_constructor_310_impl(String message) {
-    _jtd_constructor_309_impl(ErrorSeverity.ERROR, message);
+  _jtd_constructor_312_impl(String message) {
+    _jtd_constructor_311_impl(ErrorSeverity.ERROR, message);
   }
   ErrorSeverity get errorSeverity => _severity;
   String get message => _message;
@@ -5380,20 +5372,19 @@
   int compareTo(ParserErrorCode other) => ordinal - other.ordinal;
   String toString() => name;
 }
-
 /**
  * Instances of the class {link ToFormattedSourceVisitor} write a source representation of a visited
  * AST node (and all of it's children) to a writer.
  */
 class ToFormattedSourceVisitor implements ASTVisitor<Object> {
-  
+
   /**
    * The writer to which the source is to be written.
    */
   PrintWriter _writer;
   int _indentLevel = 0;
   String _indentString = "";
-  
+
   /**
    * Initialize a newly created visitor to write source code representing the visited nodes to the
    * given writer.
@@ -6158,7 +6149,7 @@
     nl();
     indent();
   }
-  
+
   /**
    * Safely visit the given node.
    * @param node the node to be visited
@@ -6168,7 +6159,7 @@
       node.accept(this);
     }
   }
-  
+
   /**
    * Safely visit the given node, printing the suffix after the node if it is non-<code>null</code>.
    * @param suffix the suffix to be printed if there is a node to visit
@@ -6180,7 +6171,7 @@
       _writer.print(suffix);
     }
   }
-  
+
   /**
    * Safely visit the given node, printing the prefix before the node if it is non-<code>null</code>
    * .
@@ -6193,7 +6184,7 @@
       node.accept(this);
     }
   }
-  
+
   /**
    * Safely visit the given node, printing the suffix after the node if it is non-<code>null</code>.
    * @param suffix the suffix to be printed if there is a node to visit
@@ -6205,7 +6196,7 @@
       _writer.print(suffix);
     }
   }
-  
+
   /**
    * Print a list of nodes without any separation.
    * @param nodes the nodes to be printed
@@ -6214,7 +6205,7 @@
   void visitList(NodeList<ASTNode> nodes) {
     visitList5(nodes, "");
   }
-  
+
   /**
    * Print a list of nodes, separated by the given separator.
    * @param nodes the nodes to be printed
@@ -6234,7 +6225,7 @@
       }
     }
   }
-  
+
   /**
    * Print a list of nodes, separated by the given separator.
    * @param nodes the nodes to be printed
@@ -6255,7 +6246,7 @@
       }
     }
   }
-  
+
   /**
    * Print a list of nodes, separated by the given separator.
    * @param prefix the prefix to be printed if the list is not empty
diff --git a/pkg/analyzer_experimental/lib/src/generated/resolver.dart b/pkg/analyzer_experimental/lib/src/generated/resolver.dart
index b87c5af..4ff1d00 100644
--- a/pkg/analyzer_experimental/lib/src/generated/resolver.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/resolver.dart
@@ -1,8 +1,6 @@
 // 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.resolver;
-
 import 'dart:collection';
 import 'java_core.dart';
 import 'java_engine.dart';
@@ -19,15 +17,13 @@
 import 'engine.dart';
 import 'constant.dart';
 import 'element.dart' as __imp_combi show HideCombinator, ShowCombinator;
-
-
 /**
  * Instances of the class {@code CompilationUnitBuilder} build an element model for a single
  * compilation unit.
  * @coverage dart.engine.resolver
  */
 class CompilationUnitBuilder {
-  
+
   /**
    * Build the compilation unit element for the given source.
    * @param source the source describing the compilation unit
@@ -53,34 +49,33 @@
     return element;
   }
 }
-
 /**
  * Instances of the class {@code ElementBuilder} traverse an AST structure and build the element
  * model representing the AST structure.
  * @coverage dart.engine.resolver
  */
 class ElementBuilder extends RecursiveASTVisitor<Object> {
-  
+
   /**
    * The element holder associated with the element that is currently being built.
    */
   ElementHolder _currentHolder;
-  
+
   /**
    * A flag indicating whether a variable declaration is in the context of a field declaration.
    */
   bool _inFieldContext = false;
-  
+
   /**
    * A flag indicating whether a variable declaration is within the body of a method or function.
    */
   bool _inFunction = false;
-  
+
   /**
    * A flag indicating whether the class currently being visited can be used as a mixin.
    */
   bool _isValidMixin = false;
-  
+
   /**
    * Initialize a newly created element builder to build the elements for a compilation unit.
    * @param initialHolder the element holder associated with the compilation unit being built
@@ -577,7 +572,7 @@
     }
     return null;
   }
-  
+
   /**
    * Creates the {@link ConstructorElement}s array with the single default constructor element.
    * @param interfaceType the interface type for which to create a default constructor
@@ -602,7 +597,7 @@
     }
     return typeArguments;
   }
-  
+
   /**
    * Return the body of the function that contains the given parameter, or {@code null} if no
    * function body could be found.
@@ -621,7 +616,7 @@
     }
     return null;
   }
-  
+
   /**
    * Return {@code true} if the given token is a token for the given keyword.
    * @param token the token being tested
@@ -629,7 +624,7 @@
    * @return {@code true} if the given token is a token for the given keyword
    */
   bool matches(sc.Token token, sc.Keyword keyword2) => token != null && identical(token.type, sc.TokenType.KEYWORD) && identical(((token as sc.KeywordToken)).keyword, keyword2);
-  
+
   /**
    * Make the given holder be the current holder while visiting the given node.
    * @param holder the holder that will gather elements that are built while visiting the children
@@ -646,7 +641,7 @@
       }
     }
   }
-  
+
   /**
    * Make the given holder be the current holder while visiting the children of the given node.
    * @param holder the holder that will gather elements that are built while visiting the children
@@ -664,7 +659,6 @@
     }
   }
 }
-
 /**
  * Instances of the class {@code ElementHolder} hold on to elements created while traversing an AST
  * structure so that they can be accessed when creating their enclosing element.
@@ -800,7 +794,6 @@
     return new List.from(_typeVariables);
   }
 }
-
 /**
  * Instances of the class {@code HtmlUnitBuilder} build an element model for a single HTML unit.
  */
@@ -810,42 +803,42 @@
   static String _SCRIPT = "script";
   static String _SRC = "src";
   static String _TYPE = "type";
-  
+
   /**
    * The analysis context in which the element model will be built.
    */
   InternalAnalysisContext _context;
-  
+
   /**
    * The error listener to which errors will be reported.
    */
   RecordingErrorListener _errorListener;
-  
+
   /**
    * The line information associated with the source for which an element is being built, or{@code null} if we are not building an element.
    */
   LineInfo _lineInfo;
-  
+
   /**
    * 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
@@ -854,7 +847,7 @@
     this._context = context;
     this._errorListener = new RecordingErrorListener();
   }
-  
+
   /**
    * Build the HTML element for the given source.
    * @param source the source describing the compilation unit
@@ -862,7 +855,7 @@
    * @throws AnalysisException if the analysis could not be performed
    */
   HtmlElementImpl buildHtmlElement(Source source) => buildHtmlElement2(source, _context.parseHtmlUnit(source));
-  
+
   /**
    * Build the HTML element for the given source.
    * @param source the source describing the compilation unit
@@ -879,13 +872,13 @@
     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
@@ -979,7 +972,7 @@
     }
     return null;
   }
-  
+
   /**
    * Return the first source attribute for the given tag node, or {@code null} if it does not exist.
    * @param node the node containing attributes
@@ -993,7 +986,7 @@
     }
     return null;
   }
-  
+
   /**
    * Determine if the specified node is a Dart script.
    * @param node the node to be tested (not {@code null})
@@ -1016,7 +1009,7 @@
     }
     return false;
   }
-  
+
   /**
    * Report an error with the given error code at the given location. Use the given arguments to
    * compose the error message.
@@ -1029,42 +1022,41 @@
     _errorListener.onError(new AnalysisError.con2(_htmlElement.source, offset, length, errorCode, arguments));
   }
 }
-
 /**
  * Instances of the class {@code 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 {@code null} if we are not
    * in the scope of a function type alias.
    */
   FunctionTypeAliasElement _enclosingAlias;
-  
+
   /**
    * The class containing the AST nodes being visited, or {@code null} if we are not in the scope of
    * a class.
    */
   ClassElement _enclosingClass;
-  
+
   /**
    * The method or function containing the AST nodes being visited, or {@code null} if we are not in
    * the scope of a method or function.
    */
   ExecutableElement _enclosingExecutable;
-  
+
   /**
    * The parameter containing the AST nodes being visited, or {@code 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.
@@ -1385,7 +1377,7 @@
     }
     return super.visitVariableDeclaration(node);
   }
-  
+
   /**
    * Append the value of the given string literal to the given string builder.
    * @param builder the builder to which the string's value is to be appended
@@ -1404,7 +1396,7 @@
       throw new IllegalArgumentException();
     }
   }
-  
+
   /**
    * Return the element for the part with the given source, or {@code null} if there is no element
    * for the given source.
@@ -1420,7 +1412,7 @@
     }
     return null;
   }
-  
+
   /**
    * 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
@@ -1429,7 +1421,7 @@
    * @return the element at the given offset
    */
   Element find2(List<Element> elements, int offset) => find4(elements, "", offset);
-  
+
   /**
    * Return the element in the given array of elements that was created for the declaration with the
    * given name.
@@ -1442,7 +1434,7 @@
     identifier.element = element;
     return element;
   }
-  
+
   /**
    * Return the element in the given array of elements that was created for the declaration with the
    * given name at the given offset.
@@ -1459,7 +1451,7 @@
     }
     return null;
   }
-  
+
   /**
    * Return the export element from the given array whose library has the given source, or{@code null} if there is no such export.
    * @param exports the export elements being searched
@@ -1475,7 +1467,7 @@
     }
     return null;
   }
-  
+
   /**
    * Return the import element from the given array whose library has the given source and that has
    * the given prefix, or {@code null} if there is no such import.
@@ -1502,7 +1494,7 @@
     }
     return null;
   }
-  
+
   /**
    * Return the value of the given string literal, or {@code null} if the string is not a constant
    * string without any string interpolation.
@@ -1522,7 +1514,6 @@
     return builder.toString().trim();
   }
 }
-
 /**
  * Instances of the class {@code ElementResolver} are used by instances of {@link ResolverVisitor}to resolve references within the AST structure to the elements being referenced. The requirements
  * for the element resolver are:
@@ -1571,7 +1562,7 @@
  * @coverage dart.engine.resolver
  */
 class ElementResolver extends SimpleASTVisitor<Object> {
-  
+
   /**
    * @return {@code true} if the given identifier is the return type of a constructor declaration.
    */
@@ -1583,7 +1574,7 @@
     }
     return false;
   }
-  
+
   /**
    * @return {@code true} if the given identifier is the return type of a factory constructor
    * declaration.
@@ -1596,7 +1587,7 @@
     }
     return false;
   }
-  
+
   /**
    * Checks if the given 'super' expression is used in the valid context.
    * @param node the 'super' expression to analyze
@@ -1621,30 +1612,37 @@
     }
     return false;
   }
-  
+
   /**
    * The resolver driving this participant.
    */
   ResolverVisitor _resolver;
-  
+
+  /**
+   * A flag indicating whether we are running in strict mode. In strict mode, error reporting is
+   * based exclusively on the static type information.
+   */
+  bool _strictMode = false;
+
   /**
    * The name of the method that can be implemented by a class to allow its instances to be invoked
    * as if they were a function.
    */
   static String CALL_METHOD_NAME = "call";
-  
+
   /**
    * The name of the method that will be invoked if an attempt is made to invoke an undefined method
    * on an object.
    */
   static String _NO_SUCH_METHOD_METHOD_NAME = "noSuchMethod";
-  
+
   /**
    * Initialize a newly created visitor to resolve the nodes in a compilation unit.
    * @param resolver the resolver driving this participant
    */
   ElementResolver(ResolverVisitor resolver) {
     this._resolver = resolver;
+    _strictMode = resolver.definingLibrary.context.analysisOptions.strictMode;
   }
   Object visitAssignmentExpression(AssignmentExpression node) {
     sc.Token operator2 = node.operator;
@@ -1660,7 +1658,7 @@
         Type2 propagatedType = getPropagatedType(leftHandSide2);
         MethodElement propagatedMethod = lookUpMethod(leftHandSide2, propagatedType, methodName);
         node.element = select3(staticMethod, propagatedMethod);
-        if (shouldReportMissingMember(staticType, staticMethod) && (propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
+        if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
           _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_METHOD, operator2, [methodName, staticType.displayName]);
         }
       }
@@ -1679,7 +1677,7 @@
         Type2 propagatedType = getPropagatedType(leftOperand2);
         MethodElement propagatedMethod = lookUpMethod(leftOperand2, propagatedType, methodName);
         node.element = select3(staticMethod, propagatedMethod);
-        if (shouldReportMissingMember(staticType, staticMethod) && (propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
+        if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
           _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_OPERATOR, operator2, [methodName, staticType.displayName]);
         }
       }
@@ -1945,7 +1943,11 @@
     ConstructorElement invokedConstructor = node.constructorName.element;
     node.staticElement = invokedConstructor;
     node.element = invokedConstructor;
-    resolveArgumentsToParameters(node.isConst(), node.argumentList, invokedConstructor);
+    ArgumentList argumentList2 = node.argumentList;
+    List<ParameterElement> parameters = resolveArgumentsToParameters(node.isConst(), argumentList2, invokedConstructor);
+    if (parameters != null) {
+      argumentList2.correspondingStaticParameters = parameters;
+    }
     return null;
   }
   Object visitLibraryDirective(LibraryDirective node) {
@@ -1974,38 +1976,18 @@
     }
     staticElement = convertSetterToGetter(staticElement);
     propagatedElement = convertSetterToGetter(propagatedElement);
-    Element recordedElement = recordResolution2(methodName2, staticElement, propagatedElement);
-    if (recordedElement is PropertyAccessorElement) {
-      FunctionType getterType = ((recordedElement as PropertyAccessorElement)).type;
-      if (getterType != null) {
-        Type2 getterReturnType = getterType.returnType;
-        if (getterReturnType is InterfaceType) {
-          MethodElement callMethod = ((getterReturnType as InterfaceType)).lookUpMethod(CALL_METHOD_NAME, _resolver.definingLibrary);
-          if (callMethod != null) {
-            resolveArgumentsToParameters(false, node.argumentList, callMethod);
-          }
-        } else if (getterReturnType is FunctionType) {
-          Element functionElement = ((getterReturnType as FunctionType)).element;
-          if (functionElement is ExecutableElement) {
-            resolveArgumentsToParameters(false, node.argumentList, (functionElement as ExecutableElement));
-          }
-        }
+    recordResolution2(methodName2, staticElement, propagatedElement);
+    ArgumentList argumentList2 = node.argumentList;
+    if (staticElement != null) {
+      List<ParameterElement> parameters = computePropagatedParameters(argumentList2, staticElement);
+      if (parameters != null) {
+        argumentList2.correspondingStaticParameters = parameters;
       }
-    } else if (recordedElement is ExecutableElement) {
-      resolveArgumentsToParameters(false, node.argumentList, (recordedElement as ExecutableElement));
-    } else if (recordedElement is VariableElement) {
-      VariableElement variable = recordedElement as VariableElement;
-      Type2 type2 = variable.type;
-      if (type2 is FunctionType) {
-        FunctionType functionType = type2 as FunctionType;
-        List<ParameterElement> parameters2 = functionType.parameters;
-        resolveArgumentsToParameters2(false, node.argumentList, parameters2);
-      } else if (type2 is InterfaceType) {
-        MethodElement callMethod = ((type2 as InterfaceType)).lookUpMethod(CALL_METHOD_NAME, _resolver.definingLibrary);
-        if (callMethod != null) {
-          List<ParameterElement> parameters3 = callMethod.parameters;
-          resolveArgumentsToParameters2(false, node.argumentList, parameters3);
-        }
+    }
+    if (propagatedElement != null) {
+      List<ParameterElement> parameters = computePropagatedParameters(argumentList2, propagatedElement);
+      if (parameters != null) {
+        argumentList2.correspondingParameters = parameters;
       }
     }
     ErrorCode errorCode;
@@ -2066,7 +2048,7 @@
     Type2 propagatedType = getPropagatedType(operand2);
     MethodElement propagatedMethod = lookUpMethod(operand2, propagatedType, methodName);
     node.element = select3(staticMethod, propagatedMethod);
-    if (shouldReportMissingMember(staticType, staticMethod) && (propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
+    if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
       _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_OPERATOR, node.operator, [methodName, staticType.displayName]);
     }
     return null;
@@ -2107,7 +2089,7 @@
       Type2 propagatedType = getPropagatedType(operand2);
       MethodElement propagatedMethod = lookUpMethod(operand2, propagatedType, methodName);
       node.element = select3(staticMethod, propagatedMethod);
-      if (shouldReportMissingMember(staticType, staticMethod) && (propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
+      if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
         _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_OPERATOR, operator2, [methodName, staticType.displayName]);
       }
     }
@@ -2142,7 +2124,11 @@
     }
     node.staticElement = element;
     node.element = element;
-    resolveArgumentsToParameters(false, node.argumentList, element);
+    ArgumentList argumentList2 = node.argumentList;
+    List<ParameterElement> parameters = resolveArgumentsToParameters(false, argumentList2, element);
+    if (parameters != null) {
+      argumentList2.correspondingStaticParameters = parameters;
+    }
     return null;
   }
   Object visitSimpleIdentifier(SimpleIdentifier node) {
@@ -2195,7 +2181,11 @@
     }
     node.staticElement = element;
     node.element = element;
-    resolveArgumentsToParameters(false, node.argumentList, element);
+    ArgumentList argumentList2 = node.argumentList;
+    List<ParameterElement> parameters = resolveArgumentsToParameters(false, argumentList2, element);
+    if (parameters != null) {
+      argumentList2.correspondingStaticParameters = parameters;
+    }
     return null;
   }
   Object visitSuperExpression(SuperExpression node) {
@@ -2219,7 +2209,7 @@
     setMetadata(node.element, node);
     return null;
   }
-  
+
   /**
    * Generate annotation elements for each of the annotations in the given node list and add them to
    * the given list of elements.
@@ -2234,7 +2224,7 @@
       }
     }
   }
-  
+
   /**
    * Given that we have found code to invoke the given element, return the error code that should be
    * reported, or {@code null} if no error should be reported.
@@ -2297,7 +2287,7 @@
     }
     return null;
   }
-  
+
   /**
    * Return {@code true} if the given class declares a method named "noSuchMethod" and is not the
    * class 'Object'.
@@ -2311,7 +2301,7 @@
     MethodElement methodElement = classElement.lookUpMethod(_NO_SUCH_METHOD_METHOD_NAME, _resolver.definingLibrary);
     return methodElement != null && methodElement.enclosingElement.supertype != null;
   }
-  
+
   /**
    * Return {@code true} if the given element represents a class that declares a method named
    * "noSuchMethod" and is not the class 'Object'.
@@ -2325,7 +2315,52 @@
     }
     return false;
   }
-  
+
+  /**
+   * Given a list of arguments and the element that will be invoked using those argument, compute
+   * the list of parameters that correspond to the list of arguments. Return the parameters that
+   * correspond to the arguments, or {@code null} if no correspondence could be computed.
+   * @param argumentList the list of arguments being passed to the element
+   * @param executableElement the element that will be invoked with the arguments
+   * @return the parameters that correspond to the arguments
+   */
+  List<ParameterElement> computePropagatedParameters(ArgumentList argumentList, Element element2) {
+    if (element2 is PropertyAccessorElement) {
+      FunctionType getterType = ((element2 as PropertyAccessorElement)).type;
+      if (getterType != null) {
+        Type2 getterReturnType = getterType.returnType;
+        if (getterReturnType is InterfaceType) {
+          MethodElement callMethod = ((getterReturnType as InterfaceType)).lookUpMethod(CALL_METHOD_NAME, _resolver.definingLibrary);
+          if (callMethod != null) {
+            return resolveArgumentsToParameters(false, argumentList, callMethod);
+          }
+        } else if (getterReturnType is FunctionType) {
+          Element functionElement = ((getterReturnType as FunctionType)).element;
+          if (functionElement is ExecutableElement) {
+            return resolveArgumentsToParameters(false, argumentList, (functionElement as ExecutableElement));
+          }
+        }
+      }
+    } else if (element2 is ExecutableElement) {
+      return resolveArgumentsToParameters(false, argumentList, (element2 as ExecutableElement));
+    } else if (element2 is VariableElement) {
+      VariableElement variable = element2 as VariableElement;
+      Type2 type2 = variable.type;
+      if (type2 is FunctionType) {
+        FunctionType functionType = type2 as FunctionType;
+        List<ParameterElement> parameters2 = functionType.parameters;
+        return resolveArgumentsToParameters2(false, argumentList, parameters2);
+      } else if (type2 is InterfaceType) {
+        MethodElement callMethod = ((type2 as InterfaceType)).lookUpMethod(CALL_METHOD_NAME, _resolver.definingLibrary);
+        if (callMethod != null) {
+          List<ParameterElement> parameters3 = callMethod.parameters;
+          return resolveArgumentsToParameters2(false, argumentList, parameters3);
+        }
+      }
+    }
+    return null;
+  }
+
   /**
    * If the given element is a setter, return the getter associated with it. Otherwise, return the
    * element unchanged.
@@ -2338,7 +2373,7 @@
     }
     return element;
   }
-  
+
   /**
    * Look for any declarations of the given identifier that are imported using a prefix. Return the
    * element that was found, or {@code null} if the name is not imported using a prefix.
@@ -2365,14 +2400,14 @@
     }
     return element;
   }
-  
+
   /**
    * Return the name of the method invoked by the given postfix expression.
    * @param node the postfix expression being invoked
    * @return the name of the method invoked by the expression
    */
   String getPostfixOperator(PostfixExpression node) => (identical(node.operator.type, sc.TokenType.PLUS_PLUS)) ? sc.TokenType.PLUS.lexeme : sc.TokenType.MINUS.lexeme;
-  
+
   /**
    * Return the name of the method invoked by the given postfix expression.
    * @param node the postfix expression being invoked
@@ -2391,7 +2426,7 @@
       return operator2.lexeme;
     }
   }
-  
+
   /**
    * Return the propagated type of the given expression that is to be used for type analysis.
    * @param expression the expression whose type is to be returned
@@ -2404,7 +2439,7 @@
     }
     return propagatedType2;
   }
-  
+
   /**
    * 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
@@ -2420,7 +2455,7 @@
     }
     return staticType2;
   }
-  
+
   /**
    * Return the element representing the superclass of the given class.
    * @param targetClass the class whose superclass is to be returned
@@ -2433,7 +2468,7 @@
     }
     return superType.element;
   }
-  
+
   /**
    * Return {@code true} if the given type represents an object that could be invoked using the call
    * operator '()'.
@@ -2450,7 +2485,7 @@
     }
     return false;
   }
-  
+
   /**
    * Return {@code true} if the given element is a static element.
    * @param element the element being tested
@@ -2464,7 +2499,7 @@
     }
     return false;
   }
-  
+
   /**
    * Looks up the method element with the given name for index expression, reports{@link StaticWarningCode#UNDEFINED_OPERATOR} if not found.
    * @param node the index expression to resolve
@@ -2478,7 +2513,7 @@
     MethodElement propagatedMethod = lookUpMethod(target, propagatedType, methodName);
     node.staticElement = staticMethod;
     node.element = select3(staticMethod, propagatedMethod);
-    if (shouldReportMissingMember(staticType, staticMethod) && (propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
+    if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
       sc.Token leftBracket2 = node.leftBracket;
       sc.Token rightBracket2 = node.rightBracket;
       if (leftBracket2 == null || rightBracket2 == null) {
@@ -2493,7 +2528,7 @@
     }
     return false;
   }
-  
+
   /**
    * Look up the getter with the given name in the given type. Return the element representing the
    * getter that was found, or {@code null} if there is no getter with the given name.
@@ -2519,7 +2554,7 @@
     }
     return null;
   }
-  
+
   /**
    * Look up the getter with the given name in the interfaces implemented by the given type, either
    * directly or indirectly. Return the element representing the getter that was found, or{@code null} if there is no getter with the given name.
@@ -2548,13 +2583,19 @@
         return getter;
       }
     }
+    for (InterfaceType mixinType in targetType.mixins) {
+      PropertyAccessorElement getter = lookUpGetterInInterfaces(mixinType, true, getterName, visitedInterfaces);
+      if (getter != null) {
+        return getter;
+      }
+    }
     InterfaceType superclass2 = targetType.superclass;
     if (superclass2 == null) {
       return null;
     }
     return lookUpGetterInInterfaces(superclass2, true, getterName, visitedInterfaces);
   }
-  
+
   /**
    * Look up the method or getter with the given name in the given type. Return the element
    * representing the method or getter that was found, or {@code null} if there is no method or
@@ -2579,7 +2620,7 @@
     }
     return null;
   }
-  
+
   /**
    * Look up the method or getter with the given name in the interfaces implemented by the given
    * type, either directly or indirectly. Return the element representing the method or getter that
@@ -2613,13 +2654,19 @@
         return member;
       }
     }
+    for (InterfaceType mixinType in targetType.mixins) {
+      ExecutableElement member = lookUpGetterOrMethodInInterfaces(mixinType, true, memberName, visitedInterfaces);
+      if (member != null) {
+        return member;
+      }
+    }
     InterfaceType superclass2 = targetType.superclass;
     if (superclass2 == null) {
       return null;
     }
     return lookUpGetterOrMethodInInterfaces(superclass2, true, memberName, visitedInterfaces);
   }
-  
+
   /**
    * Find the element corresponding to the given label node in the current label scope.
    * @param parentNode the node containing the given label
@@ -2658,7 +2705,7 @@
     }
     return labelElement;
   }
-  
+
   /**
    * Look up the method with the given name in the given type. Return the element representing the
    * method that was found, or {@code null} if there is no method with the given name.
@@ -2684,7 +2731,7 @@
     }
     return null;
   }
-  
+
   /**
    * Look up the method with the given name in the interfaces implemented by the given type, either
    * directly or indirectly. Return the element representing the method that was found, or{@code null} if there is no method with the given name.
@@ -2713,13 +2760,19 @@
         return method;
       }
     }
+    for (InterfaceType mixinType in targetType.mixins) {
+      MethodElement method = lookUpMethodInInterfaces(mixinType, true, methodName, visitedInterfaces);
+      if (method != null) {
+        return method;
+      }
+    }
     InterfaceType superclass2 = targetType.superclass;
     if (superclass2 == null) {
       return null;
     }
     return lookUpMethodInInterfaces(superclass2, true, methodName, visitedInterfaces);
   }
-  
+
   /**
    * Look up the setter with the given name in the given type. Return the element representing the
    * setter that was found, or {@code null} if there is no setter with the given name.
@@ -2745,7 +2798,7 @@
     }
     return null;
   }
-  
+
   /**
    * Look up the setter with the given name in the interfaces implemented by the given type, either
    * directly or indirectly. Return the element representing the setter that was found, or{@code null} if there is no setter with the given name.
@@ -2774,13 +2827,19 @@
         return setter;
       }
     }
+    for (InterfaceType mixinType in targetType.mixins) {
+      PropertyAccessorElement setter = lookUpSetterInInterfaces(mixinType, true, setterName, visitedInterfaces);
+      if (setter != null) {
+        return setter;
+      }
+    }
     InterfaceType superclass2 = targetType.superclass;
     if (superclass2 == null) {
       return null;
     }
     return lookUpSetterInInterfaces(superclass2, true, setterName, visitedInterfaces);
   }
-  
+
   /**
    * Return the binary operator that is invoked by the given compound assignment operator.
    * @param operator the assignment operator being mapped
@@ -2816,7 +2875,7 @@
     AnalysisEngine.instance.logger.logError("Failed to map ${operator.lexeme} to it's corresponding operator");
     return operator;
   }
-  
+
   /**
    * Record the fact that the given AST node was resolved to the given element.
    * @param node the AST node that was resolved
@@ -2826,7 +2885,7 @@
     node.staticElement = element2;
     node.element = element2;
   }
-  
+
   /**
    * Record the fact that the given AST node was resolved to the given elements.
    * @param node the AST node that was resolved
@@ -2836,36 +2895,38 @@
    * information
    * @return the element that was associated with the node
    */
-  Element recordResolution2(SimpleIdentifier node, Element staticElement2, Element propagatedElement) {
+  void recordResolution2(SimpleIdentifier node, Element staticElement2, Element propagatedElement) {
     node.staticElement = staticElement2;
-    Element element = propagatedElement == null ? staticElement2 : propagatedElement;
-    node.element = element;
-    return element;
+    node.element = propagatedElement == null ? staticElement2 : propagatedElement;
   }
-  
+
   /**
    * Given a list of arguments and the element that will be invoked using those argument, compute
-   * the list of parameters that correspond to the list of arguments.
+   * the list of parameters that correspond to the list of arguments. Return the parameters that
+   * correspond to the arguments, or {@code null} if no correspondence could be computed.
    * @param reportError if {@code true} then compile-time error should be reported; if {@code false}then compile-time warning
    * @param argumentList the list of arguments being passed to the element
    * @param executableElement the element that will be invoked with the arguments
+   * @return the parameters that correspond to the arguments
    */
-  void resolveArgumentsToParameters(bool reportError, ArgumentList argumentList, ExecutableElement executableElement) {
+  List<ParameterElement> resolveArgumentsToParameters(bool reportError, ArgumentList argumentList, ExecutableElement executableElement) {
     if (executableElement == null) {
-      return;
+      return null;
     }
     List<ParameterElement> parameters2 = executableElement.parameters;
-    resolveArgumentsToParameters2(reportError, argumentList, parameters2);
+    return resolveArgumentsToParameters2(reportError, argumentList, parameters2);
   }
-  
+
   /**
-   * Given a list of arguments and the element that will be invoked using those argument, compute
-   * the list of parameters that correspond to the list of arguments.
+   * Given a list of arguments and the parameters related to the element that will be invoked using
+   * those argument, compute the list of parameters that correspond to the list of arguments. Return
+   * the parameters that correspond to the arguments.
    * @param reportError if {@code true} then compile-time error should be reported; if {@code false}then compile-time warning
    * @param argumentList the list of arguments being passed to the element
    * @param parameters the of the function that will be invoked with the arguments
+   * @return the parameters that correspond to the arguments
    */
-  void resolveArgumentsToParameters2(bool reportError2, ArgumentList argumentList, List<ParameterElement> parameters) {
+  List<ParameterElement> resolveArgumentsToParameters2(bool reportError2, ArgumentList argumentList, List<ParameterElement> parameters) {
     List<ParameterElement> requiredParameters = new List<ParameterElement>();
     List<ParameterElement> positionalParameters = new List<ParameterElement>();
     Map<String, ParameterElement> namedParameters = new Map<String, ParameterElement>();
@@ -2918,9 +2979,9 @@
       ErrorCode errorCode = reportError2 ? CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS : StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS;
       _resolver.reportError(errorCode, argumentList, [unnamedParameterCount, positionalArgumentCount]);
     }
-    argumentList.correspondingParameters = resolvedParameters;
+    return resolvedParameters;
   }
-  
+
   /**
    * Resolve the names in the given combinators in the scope of the given library.
    * @param library the library that defines the names
@@ -2946,7 +3007,7 @@
       }
     }
   }
-  
+
   /**
    * Given an invocation of the form 'e.m(a1, ..., an)', resolve 'e.m' to the element being invoked.
    * If the returned element is a method, then the method will be invoked. If the returned element
@@ -2978,7 +3039,7 @@
     }
     return null;
   }
-  
+
   /**
    * Given an invocation of the form 'm(a1, ..., an)', resolve 'm' to the element being invoked. If
    * the returned element is a method, then the method will be invoked. If the returned element is a
@@ -3001,7 +3062,7 @@
     }
     return element;
   }
-  
+
   /**
    * Given that we are accessing a property of the given type with the given name, return the
    * element that represents the property.
@@ -3031,10 +3092,10 @@
     ExecutableElement propagatedElement = resolveProperty(target, propagatedType, propertyName);
     Element selectedElement = select2(staticElement, propagatedElement);
     propertyName.element = selectedElement;
-    if (shouldReportMissingMember(staticType, staticElement) && (propagatedType == null || shouldReportMissingMember(propagatedType, propagatedElement))) {
+    if (shouldReportMissingMember(staticType, staticElement) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagatedElement))) {
       bool staticNoSuchMethod = staticType != null && classDeclaresNoSuchMethod2(staticType.element);
       bool propagatedNoSuchMethod = propagatedType != null && classDeclaresNoSuchMethod2(propagatedType.element);
-      if (!staticNoSuchMethod && !propagatedNoSuchMethod) {
+      if (!staticNoSuchMethod && (_strictMode || !propagatedNoSuchMethod)) {
         bool isStaticProperty = isStatic(selectedElement);
         if (propertyName.inSetterContext()) {
           if (isStaticProperty) {
@@ -3054,7 +3115,7 @@
       }
     }
   }
-  
+
   /**
    * Resolve the given simple identifier if possible. Return the element to which it could be
    * resolved, or {@code null} if it could not be resolved. This does not record the results of the
@@ -3096,7 +3157,7 @@
     }
     return element;
   }
-  
+
   /**
    * If the given type is a type variable, resolve it to the type that should be used when looking
    * up members. Otherwise, return the original type.
@@ -3114,7 +3175,7 @@
     }
     return type;
   }
-  
+
   /**
    * Given two possible error codes for the same piece of code, one computed using static type
    * information and the other using propagated type information, return the error code that should
@@ -3129,7 +3190,7 @@
     }
     return propagatedError;
   }
-  
+
   /**
    * Return the propagated element if it is not {@code null}, or the static element if it is.
    * @param staticElement the element computed using static type information
@@ -3137,7 +3198,7 @@
    * @return the more specific of the two elements
    */
   ExecutableElement select2(ExecutableElement staticElement, ExecutableElement propagatedElement) => propagatedElement != null ? propagatedElement : staticElement;
-  
+
   /**
    * Return the propagated method if it is not {@code null}, or the static method if it is.
    * @param staticMethod the method computed using static type information
@@ -3145,7 +3206,7 @@
    * @return the more specific of the two methods
    */
   MethodElement select3(MethodElement staticMethod, MethodElement propagatedMethod) => propagatedMethod != null ? propagatedMethod : staticMethod;
-  
+
   /**
    * Given a node that can have annotations associated with it and the element to which that node
    * has been resolved, create the annotations in the element model representing the annotations on
@@ -3174,7 +3235,7 @@
       ((element as ElementImpl)).metadata = new List.from(annotationList);
     }
   }
-  
+
   /**
    * Return {@code true} if we should report an error as a result of looking up a member in the
    * given type and not finding any member.
@@ -3192,7 +3253,6 @@
     return true;
   }
 }
-
 /**
  * Instances of the class {@code SyntheticIdentifier} implement an identifier that can be used to
  * look up names in the lexical scope when there is no identifier in the AST structure. There is
@@ -3200,12 +3260,12 @@
  * an invocation of a top-level function imported with a prefix.
  */
 class ElementResolver_SyntheticIdentifier extends Identifier {
-  
+
   /**
    * The name of the synthetic identifier.
    */
   String _name;
-  
+
   /**
    * Initialize a newly created synthetic identifier to have the given name.
    * @param name the name of the synthetic identifier
@@ -3222,37 +3282,36 @@
   void visitChildren(ASTVisitor<Object> visitor) {
   }
 }
-
 /**
  * Instances of the class {@code InheritanceManager} manage the knowledge of where class members
  * (methods, getters & setters) are inherited from.
  * @coverage dart.engine.resolver
  */
 class InheritanceManager {
-  
+
   /**
    * The {@link LibraryElement} that is managed by this manager.
    */
   LibraryElement _library;
-  
+
   /**
    * This is a mapping between each {@link ClassElement} and a map between the {@link String} member
    * names and the associated {@link ExecutableElement} in the mixin and superclass chain.
    */
   Map<ClassElement, Map<String, ExecutableElement>> _classLookup;
-  
+
   /**
    * This is a mapping between each {@link ClassElement} and a map between the {@link String} member
    * names and the associated {@link ExecutableElement} in the interface set.
    */
   Map<ClassElement, Map<String, ExecutableElement>> _interfaceLookup;
-  
+
   /**
    * A map between each visited {@link ClassElement} and the set of {@link AnalysisError}s found on
    * the class element.
    */
   Map<ClassElement, Set<AnalysisError>> _errorsInClassElement = new Map<ClassElement, Set<AnalysisError>>();
-  
+
   /**
    * Initialize a newly created inheritance manager.
    * @param library the library element context that the inheritance mappings are being generated
@@ -3262,14 +3321,14 @@
     _classLookup = new Map<ClassElement, Map<String, ExecutableElement>>();
     _interfaceLookup = new Map<ClassElement, Map<String, ExecutableElement>>();
   }
-  
+
   /**
    * Return the set of {@link AnalysisError}s found on the passed {@link ClassElement}, or{@code null} if there are none.
    * @param classElt the class element to query
    * @return the set of {@link AnalysisError}s found on the passed {@link ClassElement}, or{@code null} if there are none
    */
   Set<AnalysisError> getErrors(ClassElement classElt) => _errorsInClassElement[classElt];
-  
+
   /**
    * Get and return a mapping between the set of all string names of the members inherited from the
    * passed {@link ClassElement} superclass hierarchy, and the associated {@link ExecutableElement}.
@@ -3277,7 +3336,7 @@
    * @return a mapping between the set of all members inherited from the passed {@link ClassElement}superclass hierarchy, and the associated {@link ExecutableElement}
    */
   Map<String, ExecutableElement> getMapOfMembersInheritedFromClasses(ClassElement classElt) => computeClassChainLookupMap(classElt, new Set<ClassElement>());
-  
+
   /**
    * Get and return a mapping between the set of all string names of the members inherited from the
    * passed {@link ClassElement} interface hierarchy, and the associated {@link ExecutableElement}.
@@ -3285,7 +3344,7 @@
    * @return a mapping between the set of all string names of the members inherited from the passed{@link ClassElement} interface hierarchy, and the associated {@link ExecutableElement}.
    */
   Map<String, ExecutableElement> getMapOfMembersInheritedFromInterfaces(ClassElement classElt) => computeInterfaceLookupMap(classElt, new Set<ClassElement>());
-  
+
   /**
    * Given some {@link ClassElement class element} and some member name, this returns the{@link ExecutableElement executable element} that the class inherits from the mixins,
    * superclasses or interfaces, that has the member name, if no member is inherited {@code null} is
@@ -3305,7 +3364,7 @@
     }
     return executable;
   }
-  
+
   /**
    * Given some {@link ClassElement class element} and some member name, this returns the{@link ExecutableElement executable element} that the class either declares itself, or
    * inherits, that has the member name, if no member is inherited {@code null} is returned.
@@ -3321,7 +3380,7 @@
     }
     return lookupInheritance(classElt, memberName);
   }
-  
+
   /**
    * Set the new library element context.
    * @param library the new library element
@@ -3329,7 +3388,7 @@
   void set libraryElement(LibraryElement library2) {
     this._library = library2;
   }
-  
+
   /**
    * This method takes some inherited {@link FunctionType}, and resolves all the parameterized types
    * in the function type, dependent on the class in which it is being overridden.
@@ -3358,7 +3417,7 @@
     }
     return functionTypeToReturn;
   }
-  
+
   /**
    * Compute and return a mapping between the set of all string names of the members inherited from
    * the passed {@link ClassElement} superclass hierarchy, and the associated{@link ExecutableElement}.
@@ -3402,7 +3461,7 @@
     _classLookup[classElt] = resultMap;
     return resultMap;
   }
-  
+
   /**
    * Compute and return the inheritance path given the context of a type and a member that is
    * overridden in the inheritance path (for which the type is in the path).
@@ -3448,7 +3507,7 @@
       }
     }
   }
-  
+
   /**
    * Compute and return a mapping between the set of all string names of the members inherited from
    * the passed {@link ClassElement} interface hierarchy, and the associated{@link ExecutableElement}.
@@ -3599,7 +3658,7 @@
     _interfaceLookup[classElt] = resultMap;
     return resultMap;
   }
-  
+
   /**
    * Given some {@link ClassElement}, this method finds and returns the {@link ExecutableElement} of
    * the passed name in the class element. Static members, members in super types and members not
@@ -3623,7 +3682,7 @@
     }
     return null;
   }
-  
+
   /**
    * Record the passed map with the set of all members (methods, getters and setters) in the class
    * into the passed map.
@@ -3644,7 +3703,7 @@
       }
     }
   }
-  
+
   /**
    * This method is used to report errors on when they are found computing inheritance information.
    * See {@link ErrorVerifier#checkForInconsistentMethodInheritance()} to see where these generated
@@ -3664,7 +3723,6 @@
     javaSetAdd(errorSet, new AnalysisError.con2(classElt.source, offset, length, errorCode, arguments));
   }
 }
-
 /**
  * Instances of the class {@code 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
@@ -3672,63 +3730,63 @@
  * @coverage dart.engine.resolver
  */
 class Library {
-  
+
   /**
    * The analysis context in which this library is being analyzed.
    */
   InternalAnalysisContext _analysisContext;
-  
+
   /**
    * The inheritance manager which is used for this member lookups in this library.
    */
   InheritanceManager _inheritanceManager;
-  
+
   /**
    * The listener to which analysis errors will be reported.
    */
   AnalysisErrorListener _errorListener;
-  
+
   /**
    * The source specifying the defining compilation unit of this library.
    */
   Source _librarySource;
-  
+
   /**
    * The library element representing this library.
    */
   LibraryElementImpl _libraryElement;
-  
+
   /**
    * A list containing all of the libraries that are imported into this library.
    */
   Map<ImportDirective, Library> _importedLibraries = new Map<ImportDirective, Library>();
-  
+
   /**
    * A table mapping URI-based directive to the actual URI value.
    */
   Map<UriBasedDirective, String> _directiveUris = new Map<UriBasedDirective, String>();
-  
+
   /**
    * A flag indicating whether this library explicitly imports core.
    */
   bool _explicitlyImportsCore = false;
-  
+
   /**
    * A list containing all of the libraries that are exported from this library.
    */
   Map<ExportDirective, Library> _exportedLibraries = new Map<ExportDirective, Library>();
-  
+
   /**
    * A table mapping the sources for the compilation units in this library to their corresponding
    * AST structures.
    */
   Map<Source, CompilationUnit> _astMap = new Map<Source, CompilationUnit>();
-  
+
   /**
    * The library scope used when resolving elements within this library's compilation units.
    */
   LibraryScope _libraryScope;
-  
+
   /**
    * Initialize a newly created data holder that can maintain the data associated with a library.
    * @param analysisContext the analysis context in which this library is being analyzed
@@ -3741,7 +3799,7 @@
     this._librarySource = librarySource;
     this._libraryElement = analysisContext.getLibraryElement(librarySource) as LibraryElementImpl;
   }
-  
+
   /**
    * Record that the given library is exported from this library.
    * @param importLibrary the library that is exported from this library
@@ -3749,7 +3807,7 @@
   void addExport(ExportDirective directive, Library exportLibrary) {
     _exportedLibraries[directive] = exportLibrary;
   }
-  
+
   /**
    * Record that the given library is imported into this library.
    * @param importLibrary the library that is imported into this library
@@ -3757,7 +3815,7 @@
   void addImport(ImportDirective directive, Library importLibrary) {
     _importedLibraries[directive] = importLibrary;
   }
-  
+
   /**
    * Return the AST structure associated with the given source.
    * @param source the source representing the compilation unit whose AST is to be returned
@@ -3772,14 +3830,14 @@
     }
     return unit;
   }
-  
+
   /**
    * Return a collection containing the sources for the compilation units in this library, including
    * the defining compilation unit.
    * @return the sources for the compilation units in this library
    */
   Set<Source> get compilationUnitSources => _astMap.keys.toSet();
-  
+
   /**
    * Return the AST structure associated with the defining compilation unit for this library.
    * @return the AST structure associated with the defining compilation unit for this library
@@ -3787,20 +3845,20 @@
    * unit
    */
   CompilationUnit get definingCompilationUnit => getAST(librarySource);
-  
+
   /**
    * Return {@code true} if this library explicitly imports core.
    * @return {@code true} if this library explicitly imports core
    */
   bool get explicitlyImportsCore => _explicitlyImportsCore;
-  
+
   /**
    * Return the library exported by the given directive.
    * @param directive the directive that exports the library to be returned
    * @return the library exported by the given directive
    */
   Library getExport(ExportDirective directive) => _exportedLibraries[directive];
-  
+
   /**
    * Return an array containing the libraries that are exported from this library.
    * @return an array containing the libraries that are exported from this library
@@ -3810,14 +3868,14 @@
     libraries.addAll(_exportedLibraries.values);
     return new List.from(libraries);
   }
-  
+
   /**
    * Return the library imported by the given directive.
    * @param directive the directive that imports the library to be returned
    * @return the library imported by the given directive
    */
   Library getImport(ImportDirective directive) => _importedLibraries[directive];
-  
+
   /**
    * Return an array containing the libraries that are imported into this library.
    * @return an array containing the libraries that are imported into this library
@@ -3827,7 +3885,7 @@
     libraries.addAll(_importedLibraries.values);
     return new List.from(libraries);
   }
-  
+
   /**
    * Return an array containing the libraries that are either imported or exported from this
    * library.
@@ -3839,7 +3897,7 @@
     libraries.addAll(_exportedLibraries.values);
     return new List.from(libraries);
   }
-  
+
   /**
    * Return the inheritance manager for this library.
    * @return the inheritance manager for this library
@@ -3850,7 +3908,7 @@
     }
     return _inheritanceManager;
   }
-  
+
   /**
    * Return the library element representing this library, creating it if necessary.
    * @return the library element representing this library
@@ -3865,7 +3923,7 @@
     }
     return _libraryElement;
   }
-  
+
   /**
    * Return the library scope used when resolving elements within this library's compilation units.
    * @return the library scope used when resolving elements within this library's compilation units
@@ -3876,13 +3934,13 @@
     }
     return _libraryScope;
   }
-  
+
   /**
    * Return the source specifying the defining compilation unit of this library.
    * @return the source specifying the defining compilation unit of this library
    */
   Source get librarySource => _librarySource;
-  
+
   /**
    * Return the result of resolving the URI of the given URI-based directive against the URI of the
    * library, or {@code null} if the URI is not valid. If the URI is not valid, report the error.
@@ -3909,12 +3967,12 @@
     }
     return null;
   }
-  
+
   /**
    * Returns the URI value of the given directive.
    */
   String getUri(UriBasedDirective directive) => _directiveUris[directive];
-  
+
   /**
    * Set the AST structure associated with the defining compilation unit for this library to the
    * given AST structure.
@@ -3923,7 +3981,7 @@
   void set definingCompilationUnit(CompilationUnit unit) {
     _astMap[librarySource] = unit;
   }
-  
+
   /**
    * Set whether this library explicitly imports core to match the given value.
    * @param explicitlyImportsCore {@code true} if this library explicitly imports core
@@ -3931,7 +3989,7 @@
   void set explicitlyImportsCore(bool explicitlyImportsCore2) {
     this._explicitlyImportsCore = explicitlyImportsCore2;
   }
-  
+
   /**
    * Set the library element representing this library to the given library element.
    * @param libraryElement the library element representing this library
@@ -3943,7 +4001,7 @@
     }
   }
   String toString() => _librarySource.shortName;
-  
+
   /**
    * Return the result of resolving the given URI against the URI of the library, or {@code null} if
    * the URI is not valid.
@@ -3957,28 +4015,27 @@
     return _analysisContext.sourceFactory.resolveUri(_librarySource, uri);
   }
 }
-
 /**
  * Instances of the class {@code LibraryElementBuilder} build an element model for a single library.
  * @coverage dart.engine.resolver
  */
 class LibraryElementBuilder {
-  
+
   /**
    * The analysis context in which the element model will be built.
    */
   InternalAnalysisContext _analysisContext;
-  
+
   /**
    * The listener to which errors will be reported.
    */
   AnalysisErrorListener _errorListener;
-  
+
   /**
    * The name of the function used as an entry point.
    */
   static String _ENTRY_POINT_NAME = "main";
-  
+
   /**
    * Initialize a newly created library element builder.
    * @param resolver the resolver for which the element model is being built
@@ -3987,7 +4044,7 @@
     this._analysisContext = resolver.analysisContext;
     this._errorListener = resolver.errorListener;
   }
-  
+
   /**
    * Build the library element for the given library.
    * @param library the library for which an element model is to be built
@@ -4053,7 +4110,7 @@
     }
     return libraryElement;
   }
-  
+
   /**
    * Add all of the non-synthetic getters and setters defined in the given compilation unit that
    * have no corresponding accessor to one of the given collections.
@@ -4074,7 +4131,7 @@
       }
     }
   }
-  
+
   /**
    * Search the top-level functions defined in the given compilation unit for the entry point.
    * @param element the compilation unit to be searched
@@ -4089,7 +4146,7 @@
     }
     return null;
   }
-  
+
   /**
    * Return the name of the library that the given part is declared to be a part of, or {@code null}if the part does not contain a part-of directive.
    * @param library the library containing the part
@@ -4114,7 +4171,7 @@
     }
     return null;
   }
-  
+
   /**
    * Look through all of the compilation units defined for the given library, looking for getters
    * and setters that are defined in different compilation units but that have the same names. If
@@ -4138,50 +4195,49 @@
     }
   }
 }
-
 /**
  * Instances of the class {@code LibraryResolver} are used to resolve one or more mutually dependent
  * libraries within a single context.
  * @coverage dart.engine.resolver
  */
 class LibraryResolver {
-  
+
   /**
    * The analysis context in which the libraries are being analyzed.
    */
   InternalAnalysisContext _analysisContext;
-  
+
   /**
    * The listener to which analysis errors will be reported, this error listener is either
    * references {@link #recordingErrorListener}, or it unions the passed{@link AnalysisErrorListener} with the {@link #recordingErrorListener}.
    */
   RecordingErrorListener _errorListener;
-  
+
   /**
    * A source object representing the core library (dart:core).
    */
   Source _coreLibrarySource;
-  
+
   /**
    * The object representing the core library.
    */
   Library _coreLibrary;
-  
+
   /**
    * The object used to access the types from the core library.
    */
   TypeProvider _typeProvider;
-  
+
   /**
    * A table mapping library sources to the information being maintained for those libraries.
    */
   Map<Source, Library> _libraryMap = new Map<Source, Library>();
-  
+
   /**
    * A collection containing the libraries that are being resolved together.
    */
   Set<Library> _librariesInCycles;
-  
+
   /**
    * Initialize a newly created library resolver to resolve libraries within the given context.
    * @param analysisContext the analysis context in which the library is being analyzed
@@ -4191,25 +4247,25 @@
     this._errorListener = new RecordingErrorListener();
     _coreLibrarySource = analysisContext.sourceFactory.forUri(DartSdk.DART_CORE);
   }
-  
+
   /**
    * Return the analysis context in which the libraries are being analyzed.
    * @return the analysis context in which the libraries are being analyzed
    */
   InternalAnalysisContext get analysisContext => _analysisContext;
-  
+
   /**
    * 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 => _librariesInCycles;
-  
+
   /**
    * Resolve the library specified by the given source in the given context. The library is assumed
    * to be embedded in the given source.
@@ -4257,7 +4313,7 @@
       instrumentation.log();
     }
   }
-  
+
   /**
    * Resolve the library specified by the given source in the given context.
    * <p>
@@ -4311,7 +4367,7 @@
       instrumentation.log();
     }
   }
-  
+
   /**
    * Add a dependency to the given map from the referencing library to the referenced library.
    * @param dependencyMap the map to which the dependency is to be added
@@ -4326,7 +4382,7 @@
     }
     dependentLibraries.add(referencingLibrary);
   }
-  
+
   /**
    * Given a library that is part of a cycle that includes the root library, add to the given set of
    * libraries all of the libraries reachable from the root library that are also included in the
@@ -4346,7 +4402,7 @@
       }
     }
   }
-  
+
   /**
    * Add the given library, and all libraries reachable from it that have not already been visited,
    * to the given dependency map.
@@ -4366,7 +4422,7 @@
       }
     }
   }
-  
+
   /**
    * Build the element model representing the combinators declared by the given directive.
    * @param directive the directive that declares the combinators
@@ -4387,7 +4443,7 @@
     }
     return new List.from(combinators);
   }
-  
+
   /**
    * Every library now has a corresponding {@link LibraryElement}, so it is now possible to resolve
    * the import and export directives.
@@ -4452,7 +4508,7 @@
       libraryElement2.exports = new List.from(exports);
     }
   }
-  
+
   /**
    * Build element models for all of the libraries in the current cycle.
    * @throws AnalysisException if any of the element models cannot be built
@@ -4464,7 +4520,7 @@
       library.libraryElement = libraryElement;
     }
   }
-  
+
   /**
    * Resolve the type hierarchy across all of the types declared in the libraries in the current
    * cycle.
@@ -4478,7 +4534,7 @@
       }
     }
   }
-  
+
   /**
    * Compute a dependency map of libraries reachable from the given library. A dependency map is a
    * table that maps individual libraries to a list of the libraries that either import or export
@@ -4494,7 +4550,7 @@
     addToDependencyMap(library, dependencyMap, new Set<Library>());
     return dependencyMap;
   }
-  
+
   /**
    * Return a collection containing all of the libraries reachable from the given library that are
    * contained in a cycle that includes the given library.
@@ -4508,7 +4564,7 @@
     addLibrariesInCycle(library, librariesInCycle, dependencyMap);
     return librariesInCycle;
   }
-  
+
   /**
    * Recursively traverse the libraries reachable from the given library, creating instances of the
    * class {@link Library} to represent them, and record the references in the library objects.
@@ -4573,7 +4629,7 @@
       }
     }
   }
-  
+
   /**
    * Create an object to represent the information about the library defined by the compilation unit
    * with the given source.
@@ -4587,7 +4643,7 @@
     _libraryMap[librarySource] = library;
     return library;
   }
-  
+
   /**
    * Create an object to represent the information about the library defined by the compilation unit
    * with the given source.
@@ -4601,7 +4657,7 @@
     _libraryMap[librarySource] = library;
     return library;
   }
-  
+
   /**
    * Create an object to represent the information about the library defined by the compilation unit
    * with the given source. Return the library object that was created, or {@code null} if the
@@ -4622,7 +4678,7 @@
     _libraryMap[librarySource] = library;
     return library;
   }
-  
+
   /**
    * Return {@code true} if and only if the passed {@link CompilationUnit} has a part-of directive.
    * @param node the {@link CompilationUnit} to test
@@ -4637,7 +4693,7 @@
     }
     return false;
   }
-  
+
   /**
    * Return an array containing the lexical identifiers associated with the nodes in the given list.
    * @param names the AST nodes representing the identifiers
@@ -4651,7 +4707,7 @@
     }
     return identifiers;
   }
-  
+
   /**
    * Compute a value for all of the constants in the libraries being analyzed.
    */
@@ -4671,7 +4727,7 @@
     }
     computer.computeValues();
   }
-  
+
   /**
    * Resolve the identifiers and perform type analysis in the libraries in the current cycle.
    * @throws AnalysisException if any of the identifiers could not be resolved or if any of the
@@ -4682,7 +4738,7 @@
       resolveReferencesAndTypes2(library);
     }
   }
-  
+
   /**
    * Resolve the identifiers and perform type analysis in the given library.
    * @param library the library to be resolved
@@ -4695,7 +4751,7 @@
       library.getAST(source).accept(visitor);
     }
   }
-  
+
   /**
    * Run additional analyses, such as the {@link ConstantVerifier} and {@link ErrorVerifier}analysis in the current cycle.
    * @throws AnalysisException if any of the identifiers could not be resolved or if the types in
@@ -4706,7 +4762,7 @@
       runAdditionalAnalyses2(library);
     }
   }
-  
+
   /**
    * Run additional analyses, such as the {@link ConstantVerifier} and {@link ErrorVerifier}analysis in the given library.
    * @param library the library to have the extra analyses processes run
@@ -4719,46 +4775,46 @@
       CompilationUnit unit = library.getAST(source);
       ErrorVerifier errorVerifier = new ErrorVerifier(errorReporter, library.libraryElement, _typeProvider, library.inheritanceManager);
       unit.accept(errorVerifier);
+      unit.accept(new PubVerifier(errorReporter));
       ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter, _typeProvider);
       unit.accept(constantVerifier);
     }
   }
 }
-
 /**
  * Instances of the class {@code ResolverVisitor} are used to resolve the nodes within a single
  * compilation unit.
  * @coverage dart.engine.resolver
  */
 class ResolverVisitor extends ScopedVisitor {
-  
+
   /**
    * The object used to resolve the element associated with the current node.
    */
   ElementResolver _elementResolver;
-  
+
   /**
    * The object used to compute the type associated with the current node.
    */
   StaticTypeAnalyzer _typeAnalyzer;
-  
+
   /**
    * The class element representing the class containing the current node, or {@code null} if the
    * current node is not contained in a class.
    */
   ClassElement _enclosingClass = null;
-  
+
   /**
    * The element representing the function containing the current node, or {@code null} if the
    * current node is not contained in a function.
    */
   ExecutableElement _enclosingFunction = null;
-  
+
   /**
    * The object keeping track of which elements have had their types overridden.
    */
   TypeOverrideManager _overrideManager = new TypeOverrideManager();
-  
+
   /**
    * Initialize a newly created visitor to resolve the nodes in a compilation unit.
    * @param library the library containing the compilation unit being resolved
@@ -4766,13 +4822,13 @@
    * @param typeProvider the object used to access the types from the core library
    */
   ResolverVisitor.con1(Library library, Source source, TypeProvider typeProvider) : super.con1(library, source, typeProvider) {
-    _jtd_constructor_272_impl(library, source, typeProvider);
+    _jtd_constructor_273_impl(library, source, typeProvider);
   }
-  _jtd_constructor_272_impl(Library library, Source source, TypeProvider typeProvider) {
+  _jtd_constructor_273_impl(Library library, Source source, TypeProvider typeProvider) {
     this._elementResolver = new ElementResolver(this);
     this._typeAnalyzer = new StaticTypeAnalyzer(this);
   }
-  
+
   /**
    * Initialize a newly created visitor to resolve the nodes in a compilation unit.
    * @param definingLibrary the element for the library containing the compilation unit being
@@ -4783,13 +4839,13 @@
    * during resolution
    */
   ResolverVisitor.con2(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, AnalysisErrorListener errorListener) : super.con2(definingLibrary, source, typeProvider, errorListener) {
-    _jtd_constructor_273_impl(definingLibrary, source, typeProvider, errorListener);
+    _jtd_constructor_274_impl(definingLibrary, source, typeProvider, errorListener);
   }
-  _jtd_constructor_273_impl(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, AnalysisErrorListener errorListener) {
+  _jtd_constructor_274_impl(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, AnalysisErrorListener errorListener) {
     this._elementResolver = new ElementResolver(this);
     this._typeAnalyzer = new StaticTypeAnalyzer(this);
   }
-  
+
   /**
    * Return the object keeping track of which elements have had their types overridden.
    * @return the object keeping track of which elements have had their types overridden
@@ -5162,21 +5218,21 @@
     node.accept(_typeAnalyzer);
     return null;
   }
-  
+
   /**
    * Return the class element representing the class containing the current node, or {@code null} if
    * the current node is not contained in a class.
    * @return the class element representing the class containing the current node
    */
   ClassElement get enclosingClass => _enclosingClass;
-  
+
   /**
    * Return the element representing the function containing the current node, or {@code null} if
    * the current node is not contained in a function.
    * @return the element representing the function containing the current node
    */
   ExecutableElement get enclosingFunction => _enclosingFunction;
-  
+
   /**
    * Return the element associated with the given expression whose type can be overridden, or{@code null} if there is no element whose type can be overridden.
    * @param expression the expression with which the element is associated
@@ -5196,7 +5252,7 @@
     }
     return null;
   }
-  
+
   /**
    * If it is appropriate to do so, override the current type of the given element with the given
    * type. Generally speaking, it is appropriate if the given type is more specific than the current
@@ -5255,7 +5311,7 @@
       _overrideManager.exitScope();
     }
   }
-  
+
   /**
    * Return the best type information available for the given element. If the type of the element
    * has been overridden, then return the overriding type. Otherwise, return the static type.
@@ -5273,7 +5329,7 @@
     }
     return bestType;
   }
-  
+
   /**
    * The given expression is the expression used to compute the iterator for a for-each statement.
    * Attempt to compute the type of objects that will be assigned to the loop variable and return
@@ -5299,7 +5355,7 @@
     }
     return null;
   }
-  
+
   /**
    * Return {@code true} if the given expression terminates abruptly (that is, if any expression
    * following the given expression will not be reached).
@@ -5312,7 +5368,7 @@
     }
     return expression2 is ThrowExpression || expression2 is RethrowExpression;
   }
-  
+
   /**
    * Return {@code true} if the given statement terminates abruptly (that is, if any statement
    * following the given statement will not be reached).
@@ -5334,7 +5390,7 @@
     }
     return false;
   }
-  
+
   /**
    * Propagate any type information that results from knowing that the given condition will have
    * been evaluated to 'false'.
@@ -5364,7 +5420,7 @@
       propagateFalseState(((condition as ParenthesizedExpression)).expression);
     }
   }
-  
+
   /**
    * Propagate any type information that results from knowing that the given expression will have
    * been evaluated without altering the flow of execution.
@@ -5372,7 +5428,7 @@
    */
   void propagateState(Expression expression) {
   }
-  
+
   /**
    * Propagate any type information that results from knowing that the given condition will have
    * been evaluated to 'true'.
@@ -5413,44 +5469,43 @@
   get enclosingClass_J2DAccessor => _enclosingClass;
   set enclosingClass_J2DAccessor(__v) => _enclosingClass = __v;
 }
-
 /**
  * The abstract class {@code ScopedVisitor} maintains name and label scopes as an AST structure is
  * being visited.
  * @coverage dart.engine.resolver
  */
 abstract class ScopedVisitor extends GeneralizingASTVisitor<Object> {
-  
+
   /**
    * The element for the library containing the compilation unit being visited.
    */
   LibraryElement _definingLibrary;
-  
+
   /**
    * The source representing the compilation unit being visited.
    */
   Source _source;
-  
+
   /**
    * The error listener that will be informed of any errors that are found during resolution.
    */
   AnalysisErrorListener _errorListener;
-  
+
   /**
    * The scope used to resolve identifiers.
    */
   Scope _nameScope;
-  
+
   /**
    * The object used to access the types from the core library.
    */
   TypeProvider _typeProvider;
-  
+
   /**
    * The scope used to resolve labels for {@code break} and {@code continue} statements, or{@code null} if no labels have been defined in the current context.
    */
   LabelScope _labelScope;
-  
+
   /**
    * Initialize a newly created visitor to resolve the nodes in a compilation unit.
    * @param library the library containing the compilation unit being resolved
@@ -5458,9 +5513,9 @@
    * @param typeProvider the object used to access the types from the core library
    */
   ScopedVisitor.con1(Library library, Source source2, TypeProvider typeProvider2) {
-    _jtd_constructor_274_impl(library, source2, typeProvider2);
+    _jtd_constructor_275_impl(library, source2, typeProvider2);
   }
-  _jtd_constructor_274_impl(Library library, Source source2, TypeProvider typeProvider2) {
+  _jtd_constructor_275_impl(Library library, Source source2, TypeProvider typeProvider2) {
     this._definingLibrary = library.libraryElement;
     this._source = source2;
     LibraryScope libraryScope2 = library.libraryScope;
@@ -5468,7 +5523,7 @@
     this._nameScope = libraryScope2;
     this._typeProvider = typeProvider2;
   }
-  
+
   /**
    * Initialize a newly created visitor to resolve the nodes in a compilation unit.
    * @param definingLibrary the element for the library containing the compilation unit being
@@ -5479,22 +5534,22 @@
    * during resolution
    */
   ScopedVisitor.con2(LibraryElement definingLibrary2, Source source2, TypeProvider typeProvider2, AnalysisErrorListener errorListener2) {
-    _jtd_constructor_275_impl(definingLibrary2, source2, typeProvider2, errorListener2);
+    _jtd_constructor_276_impl(definingLibrary2, source2, typeProvider2, errorListener2);
   }
-  _jtd_constructor_275_impl(LibraryElement definingLibrary2, Source source2, TypeProvider typeProvider2, AnalysisErrorListener errorListener2) {
+  _jtd_constructor_276_impl(LibraryElement definingLibrary2, Source source2, TypeProvider typeProvider2, AnalysisErrorListener errorListener2) {
     this._definingLibrary = definingLibrary2;
     this._source = source2;
     this._errorListener = errorListener2;
     this._nameScope = new LibraryScope(definingLibrary2, errorListener2);
     this._typeProvider = typeProvider2;
   }
-  
+
   /**
    * Return the library element for the library containing the compilation unit being resolved.
    * @return the library element for the library containing the compilation unit being resolved
    */
   LibraryElement get definingLibrary => _definingLibrary;
-  
+
   /**
    * Return the object used to access the types from the core library.
    * @return the object used to access the types from the core library
@@ -5721,19 +5776,19 @@
     }
     return null;
   }
-  
+
   /**
    * Return the label scope in which the current node is being resolved.
    * @return the label scope in which the current node is being resolved
    */
   LabelScope get labelScope => _labelScope;
-  
+
   /**
    * Return the name scope in which the current node is being resolved.
    * @return the name scope in which the current node is being resolved
    */
   Scope get nameScope => _nameScope;
-  
+
   /**
    * Report an error with the given error code and arguments.
    * @param errorCode the error code of the error to be reported
@@ -5743,7 +5798,7 @@
   void reportError(ErrorCode errorCode, ASTNode node, List<Object> arguments) {
     _errorListener.onError(new AnalysisError.con2(_source, node.offset, node.length, errorCode, arguments));
   }
-  
+
   /**
    * Report an error with the given error code and arguments.
    * @param errorCode the error code of the error to be reported
@@ -5754,7 +5809,7 @@
   void reportError5(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
@@ -5764,7 +5819,7 @@
   void reportError6(ErrorCode errorCode, sc.Token token, List<Object> arguments) {
     _errorListener.onError(new AnalysisError.con2(_source, token.offset, token.length, errorCode, arguments));
   }
-  
+
   /**
    * Visit the given AST node if it is not null.
    * @param node the node to be visited
@@ -5774,7 +5829,7 @@
       node.accept(this);
     }
   }
-  
+
   /**
    * Visit the given statement after it's scope has been created. This replaces the normal call to
    * the inherited visit method so that ResolverVisitor can intervene when type propagation is
@@ -5786,7 +5841,7 @@
     safelyVisit(node.loopVariable);
     safelyVisit(node.body);
   }
-  
+
   /**
    * Visit the given statement after it's scope has been created. This replaces the normal call to
    * the inherited visit method so that ResolverVisitor can intervene when type propagation is
@@ -5796,7 +5851,7 @@
   void visitForStatementInScope(ForStatement node) {
     super.visitForStatement(node);
   }
-  
+
   /**
    * Add scopes for each of the given labels.
    * @param labels the labels for which new scopes are to be added
@@ -5813,7 +5868,6 @@
     return outerScope;
   }
 }
-
 /**
  * Instances of the class {@code StaticTypeAnalyzer} perform two type-related tasks. First, they
  * compute the static type of every expression. Second, they look for any static type errors or
@@ -5825,7 +5879,7 @@
  * @coverage dart.engine.resolver
  */
 class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
-  
+
   /**
    * Create a table mapping HTML tag names to the names of the classes (in 'dart:html') that
    * implement those tags.
@@ -5893,39 +5947,39 @@
     map["video"] = "VideoElement";
     return map;
   }
-  
+
   /**
    * The resolver driving the resolution and type analysis.
    */
   ResolverVisitor _resolver;
-  
+
   /**
    * The object providing access to the types defined by the language.
    */
   TypeProvider _typeProvider;
-  
+
   /**
    * The type representing the type 'dynamic'.
    */
   Type2 _dynamicType;
-  
+
   /**
    * The type representing the class containing the nodes being analyzed, or {@code null} if the
    * nodes are not within a class.
    */
   InterfaceType _thisType;
-  
+
   /**
    * The object keeping track of which elements have had their types overridden.
    */
   TypeOverrideManager _overrideManager;
-  
+
   /**
    * A table mapping HTML tag names to the names of the classes (in 'dart:html') that implement
    * those tags.
    */
   static Map<String, String> _HTML_ELEMENT_TO_CLASS_MAP = createHtmlTagToClassMap();
-  
+
   /**
    * Initialize a newly created type analyzer.
    * @param resolver the resolver driving this participant
@@ -5936,7 +5990,7 @@
     _dynamicType = _typeProvider.dynamicType;
     _overrideManager = resolver.overrideManager;
   }
-  
+
   /**
    * Set the type of the class being analyzed to the given type.
    * @param thisType the type representing the class containing the nodes being analyzed
@@ -5944,7 +5998,7 @@
   void set thisType(InterfaceType thisType2) {
     this._thisType = thisType2;
   }
-  
+
   /**
    * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is{@code String}.</blockquote>
    */
@@ -5952,7 +6006,7 @@
     recordStaticType(node, _typeProvider.stringType);
     return null;
   }
-  
+
   /**
    * The Dart Language Specification, 12.33: <blockquote>The static type of an argument definition
    * test is {@code bool}.</blockquote>
@@ -5961,7 +6015,7 @@
     recordStaticType(node, _typeProvider.boolType);
     return null;
   }
-  
+
   /**
    * The Dart Language Specification, 12.32: <blockquote>... the cast expression <i>e as T</i> ...
    * <p>
@@ -5974,7 +6028,7 @@
     recordStaticType(node, getType2(node.type));
     return null;
   }
-  
+
   /**
    * The Dart Language Specification, 12.18: <blockquote>... an assignment <i>a</i> of the form <i>v
    * = e</i> ...
@@ -6046,7 +6100,7 @@
     }
     return null;
   }
-  
+
   /**
    * The Dart Language Specification, 12.20: <blockquote>The static type of a logical boolean
    * expression is {@code bool}.</blockquote>
@@ -6098,7 +6152,7 @@
     }
     return null;
   }
-  
+
   /**
    * The Dart Language Specification, 12.4: <blockquote>The static type of a boolean literal is
    * bool.</blockquote>
@@ -6107,7 +6161,7 @@
     recordStaticType(node, _typeProvider.boolType);
     return null;
   }
-  
+
   /**
    * The Dart Language Specification, 12.15.2: <blockquote>A cascaded method invocation expression
    * of the form <i>e..suffix</i> is equivalent to the expression <i>(t) {t.suffix; return
@@ -6118,7 +6172,7 @@
     recordPropagatedType(node, getPropagatedType(node.target));
     return null;
   }
-  
+
   /**
    * The Dart Language Specification, 12.19: <blockquote> ... a conditional expression <i>c</i> of
    * the form <i>e<sub>1</sub> ? e<sub>2</sub> : e<sub>3</sub></i> ...
@@ -6158,7 +6212,7 @@
     }
     return null;
   }
-  
+
   /**
    * The Dart Language Specification, 12.3: <blockquote>The static type of a literal double is
    * double.</blockquote>
@@ -6174,7 +6228,7 @@
     recordStaticType(function, functionType);
     return null;
   }
-  
+
   /**
    * The Dart Language Specification, 12.9: <blockquote>The static type of a function literal of the
    * form <i>(T<sub>1</sub> a<sub>1</sub>, &hellip;, T<sub>n</sub> a<sub>n</sub>, \[T<sub>n+1</sub>
@@ -6214,7 +6268,7 @@
     recordStaticType(node, functionType);
     return null;
   }
-  
+
   /**
    * The Dart Language Specification, 12.14.4: <blockquote>A function expression invocation <i>i</i>
    * has the form <i>e<sub>f</sub>(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>:
@@ -6240,7 +6294,7 @@
     }
     return null;
   }
-  
+
   /**
    * The Dart Language Specification, 12.29: <blockquote>An assignable expression of the form
    * <i>e<sub>1</sub>\[e<sub>2</sub>\]</i> is evaluated as a method invocation of the operator method
@@ -6272,7 +6326,7 @@
     }
     return null;
   }
-  
+
   /**
    * The Dart Language Specification, 12.11.1: <blockquote>The static type of a new expression of
    * either the form <i>new T.id(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> or the form <i>new
@@ -6296,7 +6350,7 @@
     }
     return null;
   }
-  
+
   /**
    * The Dart Language Specification, 12.3: <blockquote>The static type of an integer literal is{@code int}.</blockquote>
    */
@@ -6304,7 +6358,7 @@
     recordStaticType(node, _typeProvider.intType);
     return null;
   }
-  
+
   /**
    * The Dart Language Specification, 12.31: <blockquote>It is a static warning if <i>T</i> does not
    * denote a type available in the current lexical scope.
@@ -6315,7 +6369,7 @@
     recordStaticType(node, _typeProvider.boolType);
     return null;
   }
-  
+
   /**
    * The Dart Language Specification, 12.6: <blockquote>The static type of a list literal of the
    * form <i><b>const</b> &lt;E&gt;\[e<sub>1</sub>, &hellip;, e<sub>n</sub>\]</i> or the form
@@ -6358,7 +6412,7 @@
     }
     return null;
   }
-  
+
   /**
    * The Dart Language Specification, 12.7: <blockquote>The static type of a map literal of the form
    * <i><b>const</b> &lt;String, V&gt; {k<sub>1</sub>:e<sub>1</sub>, &hellip;,
@@ -6432,7 +6486,7 @@
     }
     return null;
   }
-  
+
   /**
    * The Dart Language Specification, 12.15.1: <blockquote>An ordinary method invocation <i>i</i>
    * has the form <i>o.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>,
@@ -6551,7 +6605,7 @@
     recordPropagatedType(node, getPropagatedType(expression2));
     return null;
   }
-  
+
   /**
    * The Dart Language Specification, 12.2: <blockquote>The static type of {@code null} is bottom.
    * </blockquote>
@@ -6566,7 +6620,7 @@
     recordPropagatedType(node, getPropagatedType(expression2));
     return null;
   }
-  
+
   /**
    * The Dart Language Specification, 12.28: <blockquote>A postfix expression of the form
    * <i>v++</i>, where <i>v</i> is an identifier, is equivalent to <i>(){var r = v; v = r + 1;
@@ -6607,7 +6661,7 @@
     recordPropagatedType(node, getPropagatedType(operand2));
     return null;
   }
-  
+
   /**
    * See {@link #visitSimpleIdentifier(SimpleIdentifier)}.
    */
@@ -6643,7 +6697,7 @@
     }
     return null;
   }
-  
+
   /**
    * The Dart Language Specification, 12.27: <blockquote>A unary expression <i>u</i> of the form
    * <i>op e</i> is equivalent to a method invocation <i>expression e.op()</i>. An expression of the
@@ -6673,7 +6727,7 @@
     }
     return null;
   }
-  
+
   /**
    * The Dart Language Specification, 12.13: <blockquote> Property extraction allows for a member of
    * an object to be concisely extracted from the object. If <i>o</i> is an object, and if <i>m</i>
@@ -6735,7 +6789,7 @@
     }
     return null;
   }
-  
+
   /**
    * The Dart Language Specification, 12.9: <blockquote>The static type of a rethrow expression is
    * bottom.</blockquote>
@@ -6744,7 +6798,7 @@
     recordStaticType(node, _typeProvider.bottomType);
     return null;
   }
-  
+
   /**
    * The Dart Language Specification, 12.30: <blockquote>Evaluation of an identifier expression
    * <i>e</i> of the form <i>id</i> proceeds as follows:
@@ -6820,7 +6874,7 @@
     }
     return null;
   }
-  
+
   /**
    * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is{@code String}.</blockquote>
    */
@@ -6828,7 +6882,7 @@
     recordStaticType(node, _typeProvider.stringType);
     return null;
   }
-  
+
   /**
    * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is{@code String}.</blockquote>
    */
@@ -6844,7 +6898,7 @@
     }
     return null;
   }
-  
+
   /**
    * The Dart Language Specification, 12.10: <blockquote>The static type of {@code this} is the
    * interface of the immediately enclosing class.</blockquote>
@@ -6857,7 +6911,7 @@
     }
     return null;
   }
-  
+
   /**
    * The Dart Language Specification, 12.8: <blockquote>The static type of a throw expression is
    * bottom.</blockquote>
@@ -6877,7 +6931,7 @@
     }
     return null;
   }
-  
+
   /**
    * Record that the static type of the given node is the type of the second argument to the method
    * represented by the given element.
@@ -6892,7 +6946,7 @@
     }
     return _dynamicType;
   }
-  
+
   /**
    * Compute the return type of the method or function represented by the given element.
    * @param element the element representing the method or function invoked by the given node
@@ -6936,7 +6990,7 @@
     }
     return _dynamicType;
   }
-  
+
   /**
    * Given a function declaration, compute the return type of the function. The return type of
    * functions with a block body is {@code dynamicType}, with an expression body it is the type of
@@ -6951,7 +7005,7 @@
     }
     return returnType2.type;
   }
-  
+
   /**
    * Given a function expression, compute the return type of the function. The return type of
    * functions with a block body is {@code dynamicType}, with an expression body it is the type of
@@ -6966,7 +7020,7 @@
     }
     return _dynamicType;
   }
-  
+
   /**
    * Return the propagated type of the given expression if it is available, or the static type if
    * there is no propagated type.
@@ -6983,7 +7037,7 @@
     }
     return type;
   }
-  
+
   /**
    * If the given argument list contains at least one argument, and if the argument is a simple
    * string literal, then parse that argument as a query string and return the type specified by the
@@ -7011,7 +7065,7 @@
     }
     return null;
   }
-  
+
   /**
    * If the given argument list contains at least one argument, and if the argument is a simple
    * string literal, return the String value of the argument.
@@ -7028,7 +7082,7 @@
     }
     return null;
   }
-  
+
   /**
    * If the given argument list contains at least one argument, and if the argument is a simple
    * string literal, and if the value of the argument is the name of a class defined within the
@@ -7038,7 +7092,7 @@
    * @return the type specified by the first argument in the argument list
    */
   Type2 getFirstArgumentAsType(LibraryElement library, ArgumentList argumentList) => getFirstArgumentAsType2(library, argumentList, null);
-  
+
   /**
    * If the given argument list contains at least one argument, and if the argument is a simple
    * string literal, and if the value of the argument is the name of a class defined within the
@@ -7060,7 +7114,7 @@
     }
     return null;
   }
-  
+
   /**
    * Return the propagated type of the given expression.
    * @param expression the expression whose type is to be returned
@@ -7070,7 +7124,7 @@
     Type2 type = expression.propagatedType;
     return type;
   }
-  
+
   /**
    * Return the static type of the given expression.
    * @param expression the expression whose type is to be returned
@@ -7083,7 +7137,7 @@
     }
     return type;
   }
-  
+
   /**
    * Return the type that should be recorded for a node that resolved to the given accessor.
    * @param accessor the accessor that the node resolved to
@@ -7126,7 +7180,7 @@
     }
     return returnType2;
   }
-  
+
   /**
    * Return the type represented by the given type name.
    * @param typeName the type name representing the type to be returned
@@ -7139,14 +7193,14 @@
     }
     return type2;
   }
-  
+
   /**
    * Return {@code true} if the given library is the 'dart:html' library.
    * @param library the library being tested
    * @return {@code true} if the library is 'dart:html'
    */
   bool isHtmlLibrary(LibraryElement library) => library.name == "dart.dom.html";
-  
+
   /**
    * Return {@code true} if the given node is not a type literal.
    * @param node the node being tested
@@ -7156,7 +7210,7 @@
     ASTNode parent2 = node.parent;
     return parent2 is TypeName || (parent2 is PrefixedIdentifier && (parent2.parent is TypeName || identical(((parent2 as PrefixedIdentifier)).prefix, node))) || (parent2 is PropertyAccess && identical(((parent2 as PropertyAccess)).target, node)) || (parent2 is MethodInvocation && identical(node, ((parent2 as MethodInvocation)).target));
   }
-  
+
   /**
    * Record that the propagated type of the given node is the given type.
    * @param expression the node whose type is to be recorded
@@ -7167,7 +7221,7 @@
       expression.propagatedType = type;
     }
   }
-  
+
   /**
    * Record that the static type of the given node is the given type.
    * @param expression the node whose type is to be recorded
@@ -7180,7 +7234,7 @@
       expression.staticType = type;
     }
   }
-  
+
   /**
    * Attempts to make a better guess for the static type of the given binary expression.
    * @param node the binary expression to analyze
@@ -7206,7 +7260,7 @@
     }
     return staticType;
   }
-  
+
   /**
    * Set the return type and parameter type information for the given function type based on the
    * given return type and parameter elements.
@@ -7240,18 +7294,17 @@
   get thisType_J2DAccessor => _thisType;
   set thisType_J2DAccessor(__v) => _thisType = __v;
 }
-
 /**
  * Instances of the class {@code TypeOverrideManager} manage the ability to override the type of an
  * element within a given context.
  */
 class TypeOverrideManager {
-  
+
   /**
    * The current override scope, or {@code null} if no scope has been entered.
    */
   TypeOverrideManager_TypeOverrideScope _currentScope;
-  
+
   /**
    * Apply a set of overrides that were previously captured.
    * @param overrides the overrides to be applied
@@ -7262,7 +7315,7 @@
     }
     _currentScope.applyOverrides(overrides);
   }
-  
+
   /**
    * Return a table mapping the elements whose type is overridden in the current scope to the
    * overriding type.
@@ -7274,7 +7327,7 @@
     }
     return _currentScope.captureLocalOverrides();
   }
-  
+
   /**
    * Return a map from the elements for the variables in the given list that have their types
    * overridden to the overriding type.
@@ -7287,14 +7340,14 @@
     }
     return _currentScope.captureOverrides(variableList);
   }
-  
+
   /**
    * Enter a new override scope.
    */
   void enterScope() {
     _currentScope = new TypeOverrideManager_TypeOverrideScope(_currentScope);
   }
-  
+
   /**
    * Exit the current override scope.
    */
@@ -7304,7 +7357,7 @@
     }
     _currentScope = _currentScope._outerScope;
   }
-  
+
   /**
    * Return the overridden type of the given element, or {@code null} if the type of the element has
    * not been overridden.
@@ -7317,7 +7370,7 @@
     }
     return _currentScope.getType(element);
   }
-  
+
   /**
    * Set the overridden type of the given element to the given type
    * @param element the element whose type might have been overridden
@@ -7330,23 +7383,22 @@
     _currentScope.setType(element, type);
   }
 }
-
 /**
  * Instances of the class {@code TypeOverrideScope} represent a scope in which the types of
  * elements can be overridden.
  */
 class TypeOverrideManager_TypeOverrideScope {
-  
+
   /**
    * The outer scope in which types might be overridden.
    */
   TypeOverrideManager_TypeOverrideScope _outerScope;
-  
+
   /**
    * A table mapping elements to the overridden type of that element.
    */
   Map<Element, Type2> _overridenTypes = new Map<Element, Type2>();
-  
+
   /**
    * Initialize a newly created scope to be an empty child of the given scope.
    * @param outerScope the outer scope in which types might be overridden
@@ -7354,7 +7406,7 @@
   TypeOverrideManager_TypeOverrideScope(TypeOverrideManager_TypeOverrideScope outerScope) {
     this._outerScope = outerScope;
   }
-  
+
   /**
    * Apply a set of overrides that were previously captured.
    * @param overrides the overrides to be applied
@@ -7364,14 +7416,14 @@
       _overridenTypes[entry.getKey()] = entry.getValue();
     }
   }
-  
+
   /**
    * Return a table mapping the elements whose type is overridden in the current scope to the
    * overriding type.
    * @return the overrides in the current scope
    */
   Map<Element, Type2> captureLocalOverrides() => _overridenTypes;
-  
+
   /**
    * Return a map from the elements for the variables in the given list that have their types
    * overridden to the overriding type.
@@ -7393,7 +7445,7 @@
     }
     return overrides;
   }
-  
+
   /**
    * Return the overridden type of the given element, or {@code null} if the type of the element
    * has not been overridden.
@@ -7412,7 +7464,7 @@
     }
     return null;
   }
-  
+
   /**
    * Set the overridden type of the given element to the given type
    * @param element the element whose type might have been overridden
@@ -7422,165 +7474,163 @@
     _overridenTypes[element] = type;
   }
 }
-
 /**
  * The interface {@code TypeProvider} defines the behavior of objects that provide access to types
  * defined by the language.
  * @coverage dart.engine.resolver
  */
 abstract class TypeProvider {
-  
+
   /**
    * Return the type representing the built-in type 'bool'.
    * @return the type representing the built-in type 'bool'
    */
   InterfaceType get boolType;
-  
+
   /**
    * Return the type representing the type 'bottom'.
    * @return the type representing the type 'bottom'
    */
   Type2 get bottomType;
-  
+
   /**
    * Return the type representing the built-in type 'double'.
    * @return the type representing the built-in type 'double'
    */
   InterfaceType get doubleType;
-  
+
   /**
    * Return the type representing the built-in type 'dynamic'.
    * @return the type representing the built-in type 'dynamic'
    */
   Type2 get dynamicType;
-  
+
   /**
    * Return the type representing the built-in type 'Function'.
    * @return the type representing the built-in type 'Function'
    */
   InterfaceType get functionType;
-  
+
   /**
    * Return the type representing the built-in type 'int'.
    * @return the type representing the built-in type 'int'
    */
   InterfaceType get intType;
-  
+
   /**
    * Return the type representing the built-in type 'List'.
    * @return the type representing the built-in type 'List'
    */
   InterfaceType get listType;
-  
+
   /**
    * Return the type representing the built-in type 'Map'.
    * @return the type representing the built-in type 'Map'
    */
   InterfaceType get mapType;
-  
+
   /**
    * Return the type representing the built-in type 'num'.
    * @return the type representing the built-in type 'num'
    */
   InterfaceType get numType;
-  
+
   /**
    * Return the type representing the built-in type 'Object'.
    * @return the type representing the built-in type 'Object'
    */
   InterfaceType get objectType;
-  
+
   /**
    * Return the type representing the built-in type 'StackTrace'.
    * @return the type representing the built-in type 'StackTrace'
    */
   InterfaceType get stackTraceType;
-  
+
   /**
    * Return the type representing the built-in type 'String'.
    * @return the type representing the built-in type 'String'
    */
   InterfaceType get stringType;
-  
+
   /**
    * Return the type representing the built-in type 'Type'.
    * @return the type representing the built-in type 'Type'
    */
   InterfaceType get typeType;
 }
-
 /**
  * Instances of the class {@code TypeProviderImpl} provide access to types defined by the language
  * by looking for those types in the element model for the core library.
  * @coverage dart.engine.resolver
  */
 class TypeProviderImpl implements TypeProvider {
-  
+
   /**
    * The type representing the built-in type 'bool'.
    */
   InterfaceType _boolType;
-  
+
   /**
    * The type representing the type 'bottom'.
    */
   Type2 _bottomType;
-  
+
   /**
    * The type representing the built-in type 'double'.
    */
   InterfaceType _doubleType;
-  
+
   /**
    * The type representing the built-in type 'dynamic'.
    */
   Type2 _dynamicType;
-  
+
   /**
    * The type representing the built-in type 'Function'.
    */
   InterfaceType _functionType;
-  
+
   /**
    * The type representing the built-in type 'int'.
    */
   InterfaceType _intType;
-  
+
   /**
    * The type representing the built-in type 'List'.
    */
   InterfaceType _listType;
-  
+
   /**
    * The type representing the built-in type 'Map'.
    */
   InterfaceType _mapType;
-  
+
   /**
    * The type representing the built-in type 'num'.
    */
   InterfaceType _numType;
-  
+
   /**
    * The type representing the built-in type 'Object'.
    */
   InterfaceType _objectType;
-  
+
   /**
    * The type representing the built-in type 'StackTrace'.
    */
   InterfaceType _stackTraceType;
-  
+
   /**
    * The type representing the built-in type 'String'.
    */
   InterfaceType _stringType;
-  
+
   /**
    * The type representing the built-in type 'Type'.
    */
   InterfaceType _typeType;
-  
+
   /**
    * Initialize a newly created type provider to provide the types defined in the given library.
    * @param coreLibrary the element representing the core library (dart:core).
@@ -7601,7 +7651,7 @@
   InterfaceType get stackTraceType => _stackTraceType;
   InterfaceType get stringType => _stringType;
   InterfaceType get typeType => _typeType;
-  
+
   /**
    * Return the type with the given name from the given namespace, or {@code null} if there is no
    * class with the given name.
@@ -7617,7 +7667,7 @@
     }
     return ((element as ClassElement)).type;
   }
-  
+
   /**
    * Initialize the types provided by this type provider from the given library.
    * @param library the library containing the definitions of the core types
@@ -7639,7 +7689,6 @@
     _typeType = getType(namespace, "Type");
   }
 }
-
 /**
  * Instances of the class {@code TypeResolverVisitor} are used to resolve the types associated with
  * the elements in the element model. This includes the types of superclasses, mixins, interfaces,
@@ -7648,17 +7697,17 @@
  * @coverage dart.engine.resolver
  */
 class TypeResolverVisitor extends ScopedVisitor {
-  
+
   /**
    * The type representing the type 'dynamic'.
    */
   Type2 _dynamicType;
-  
+
   /**
    * The flag specifying if currently visited class references 'super' expression.
    */
   bool _hasReferenceToSuper = false;
-  
+
   /**
    * Initialize a newly created visitor to resolve the nodes in a compilation unit.
    * @param library the library containing the compilation unit being resolved
@@ -7666,12 +7715,12 @@
    * @param typeProvider the object used to access the types from the core library
    */
   TypeResolverVisitor.con1(Library library, Source source, TypeProvider typeProvider) : super.con1(library, source, typeProvider) {
-    _jtd_constructor_280_impl(library, source, typeProvider);
+    _jtd_constructor_281_impl(library, source, typeProvider);
   }
-  _jtd_constructor_280_impl(Library library, Source source, TypeProvider typeProvider) {
+  _jtd_constructor_281_impl(Library library, Source source, TypeProvider typeProvider) {
     _dynamicType = typeProvider.dynamicType;
   }
-  
+
   /**
    * Initialize a newly created visitor to resolve the nodes in a compilation unit.
    * @param definingLibrary the element for the library containing the compilation unit being
@@ -7682,9 +7731,9 @@
    * during resolution
    */
   TypeResolverVisitor.con2(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, AnalysisErrorListener errorListener) : super.con2(definingLibrary, source, typeProvider, errorListener) {
-    _jtd_constructor_281_impl(definingLibrary, source, typeProvider, errorListener);
+    _jtd_constructor_282_impl(definingLibrary, source, typeProvider, errorListener);
   }
-  _jtd_constructor_281_impl(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, AnalysisErrorListener errorListener) {
+  _jtd_constructor_282_impl(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, AnalysisErrorListener errorListener) {
     _dynamicType = typeProvider.dynamicType;
   }
   Object visitCatchClause(CatchClause node) {
@@ -8035,7 +8084,7 @@
     }
     return null;
   }
-  
+
   /**
    * Return the class element that represents the class whose name was provided.
    * @param identifier the name from the declaration of a class
@@ -8051,7 +8100,7 @@
     }
     return element2 as ClassElementImpl;
   }
-  
+
   /**
    * Return an array containing all of the elements associated with the parameters in the given
    * list.
@@ -8068,7 +8117,7 @@
     }
     return new List.from(elements);
   }
-  
+
   /**
    * The number of type arguments in the given type name does not match the number of parameters in
    * the corresponding class element. Return the error code that should be used to report this
@@ -8091,7 +8140,7 @@
     }
     return StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS;
   }
-  
+
   /**
    * Given the multiple elements to which a single name could potentially be resolved, return the
    * single interface type that should be used, or {@code null} if there is no clear choice.
@@ -8110,7 +8159,7 @@
     }
     return type;
   }
-  
+
   /**
    * Return the type represented by the given type name.
    * @param typeName the type name representing the type to be returned
@@ -8123,7 +8172,7 @@
     }
     return type2;
   }
-  
+
   /**
    * Return the type arguments associated with the given type.
    * @param type the type whole type arguments are to be returned
@@ -8137,7 +8186,7 @@
     }
     return TypeImpl.EMPTY_ARRAY;
   }
-  
+
   /**
    * Returns the simple identifier of the given (may be qualified) type name.
    * @param typeName the (may be qualified) qualified type name
@@ -8150,7 +8199,7 @@
       return ((typeName as PrefixedIdentifier)).identifier;
     }
   }
-  
+
   /**
    * Checks if the given type name is used as the exception type in the catch clause.
    * @param typeName the type name to analyzer
@@ -8164,7 +8213,7 @@
     }
     return false;
   }
-  
+
   /**
    * Checks if the given type name is used as the type in the instance creation expression.
    * @param typeName the type name to analyzer
@@ -8179,7 +8228,7 @@
     }
     return false;
   }
-  
+
   /**
    * Record that the static type of the given node is the given type.
    * @param expression the node whose type is to be recorded
@@ -8193,7 +8242,7 @@
     }
     return null;
   }
-  
+
   /**
    * Resolve the types in the given with and implements clauses and associate those types with the
    * given class element.
@@ -8243,7 +8292,7 @@
       }
     }
   }
-  
+
   /**
    * Return the type specified by the given name.
    * @param typeName the type name specifying the type to be returned
@@ -8262,7 +8311,7 @@
     }
     return null;
   }
-  
+
   /**
    * Resolve the types in the given list of type names.
    * @param typeNames the type names to be resolved
@@ -8295,7 +8344,7 @@
       }
     }
   }
-  
+
   /**
    * Set the return type and parameter type information for the given function type based on the
    * given return type and parameter elements.
@@ -8335,13 +8384,12 @@
     }
   }
 }
-
 /**
  * Instances of the class {@code ClassScope} implement the scope defined by a class.
  * @coverage dart.engine.resolver
  */
 class ClassScope extends EnclosedScope {
-  
+
   /**
    * Initialize a newly created scope enclosed within another scope.
    * @param enclosingScope the scope in which this scope is lexically enclosed
@@ -8361,7 +8409,7 @@
     }
     return super.getErrorForDuplicate(existing, duplicate);
   }
-  
+
   /**
    * Define the instance members defined by the class.
    * @param typeElement the element representing the type represented by this scope
@@ -8374,7 +8422,7 @@
       define(method);
     }
   }
-  
+
   /**
    * Define the type parameters for the class.
    * @param typeElement the element representing the type represented by this scope
@@ -8386,19 +8434,18 @@
     }
   }
 }
-
 /**
  * Instances of the class {@code EnclosedScope} implement a scope that is lexically enclosed in
  * another scope.
  * @coverage dart.engine.resolver
  */
 class EnclosedScope extends Scope {
-  
+
   /**
    * The scope in which this scope is lexically enclosed.
    */
   Scope _enclosingScope;
-  
+
   /**
    * Initialize a newly created scope enclosed within another scope.
    * @param enclosingScope the scope in which this scope is lexically enclosed
@@ -8408,7 +8455,7 @@
   }
   LibraryElement get definingLibrary => _enclosingScope.definingLibrary;
   AnalysisErrorListener get errorListener => _enclosingScope.errorListener;
-  
+
   /**
    * Return the scope in which this scope is lexically enclosed.
    * @return the scope in which this scope is lexically enclosed
@@ -8422,13 +8469,12 @@
     return _enclosingScope.lookup3(identifier, name, referencingLibrary);
   }
 }
-
 /**
  * Instances of the class {@code FunctionScope} implement the scope defined by a function.
  * @coverage dart.engine.resolver
  */
 class FunctionScope extends EnclosedScope {
-  
+
   /**
    * Initialize a newly created scope enclosed within another scope.
    * @param enclosingScope the scope in which this scope is lexically enclosed
@@ -8437,7 +8483,7 @@
   FunctionScope(Scope enclosingScope, ExecutableElement functionElement) : super(new EnclosedScope(enclosingScope)) {
     defineParameters(functionElement);
   }
-  
+
   /**
    * Define the parameters for the given function in the scope that encloses this function.
    * @param functionElement the element representing the function represented by this scope
@@ -8457,14 +8503,13 @@
     }
   }
 }
-
 /**
  * Instances of the class {@code FunctionTypeScope} implement the scope defined by a function type
  * alias.
  * @coverage dart.engine.resolver
  */
 class FunctionTypeScope extends EnclosedScope {
-  
+
   /**
    * Initialize a newly created scope enclosed within another scope.
    * @param enclosingScope the scope in which this scope is lexically enclosed
@@ -8474,7 +8519,7 @@
     defineTypeVariables(typeElement);
     defineParameters(typeElement);
   }
-  
+
   /**
    * Define the parameters for the function type alias.
    * @param typeElement the element representing the type represented by this scope
@@ -8484,7 +8529,7 @@
       define(parameter);
     }
   }
-  
+
   /**
    * Define the type variables for the function type alias.
    * @param typeElement the element representing the type represented by this scope
@@ -8496,38 +8541,37 @@
     }
   }
 }
-
 /**
  * Instances of the class {@code LabelScope} represent a scope in which a single label is defined.
  * @coverage dart.engine.resolver
  */
 class LabelScope {
-  
+
   /**
    * The label scope enclosing this label scope.
    */
   LabelScope _outerScope;
-  
+
   /**
    * The label defined in this scope.
    */
   String _label;
-  
+
   /**
    * The element to which the label resolves.
    */
   LabelElement _element;
-  
+
   /**
    * The marker used to look up a label element for an unlabeled {@code break} or {@code continue}.
    */
   static String EMPTY_LABEL = "";
-  
+
   /**
    * The label element returned for scopes that can be the target of an unlabeled {@code break} or{@code continue}.
    */
   static SimpleIdentifier _EMPTY_LABEL_IDENTIFIER = new SimpleIdentifier.full(new sc.StringToken(sc.TokenType.IDENTIFIER, "", 0));
-  
+
   /**
    * Initialize a newly created scope to represent the potential target of an unlabeled{@code break} or {@code continue}.
    * @param outerScope the label scope enclosing the new label scope
@@ -8535,12 +8579,12 @@
    * @param onSwitchMember {@code true} if this label is associated with a {@code switch} member
    */
   LabelScope.con1(LabelScope outerScope, bool onSwitchStatement, bool onSwitchMember) {
-    _jtd_constructor_286_impl(outerScope, onSwitchStatement, onSwitchMember);
+    _jtd_constructor_287_impl(outerScope, onSwitchStatement, onSwitchMember);
   }
-  _jtd_constructor_286_impl(LabelScope outerScope, bool onSwitchStatement, bool onSwitchMember) {
-    _jtd_constructor_287_impl(outerScope, EMPTY_LABEL, new LabelElementImpl(_EMPTY_LABEL_IDENTIFIER, onSwitchStatement, onSwitchMember));
+  _jtd_constructor_287_impl(LabelScope outerScope, bool onSwitchStatement, bool onSwitchMember) {
+    _jtd_constructor_288_impl(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
@@ -8548,14 +8592,14 @@
    * @param element the element to which the label resolves
    */
   LabelScope.con2(LabelScope outerScope2, String label2, LabelElement element2) {
-    _jtd_constructor_287_impl(outerScope2, label2, element2);
+    _jtd_constructor_288_impl(outerScope2, label2, element2);
   }
-  _jtd_constructor_287_impl(LabelScope outerScope2, String label2, LabelElement element2) {
+  _jtd_constructor_288_impl(LabelScope outerScope2, String label2, LabelElement element2) {
     this._outerScope = outerScope2;
     this._label = label2;
     this._element = element2;
   }
-  
+
   /**
    * Return the label element corresponding to the given label, or {@code null} if the given label
    * is not defined in this scope.
@@ -8563,7 +8607,7 @@
    * @return the label element corresponding to the given label
    */
   LabelElement lookup(SimpleIdentifier targetLabel) => lookup2(targetLabel.name);
-  
+
   /**
    * Return the label element corresponding to the given label, or {@code null} if the given label
    * is not defined in this scope.
@@ -8580,14 +8624,13 @@
     }
   }
 }
-
 /**
  * Instances of the class {@code LibraryImportScope} represent the scope containing all of the names
  * available from imported libraries.
  * @coverage dart.engine.resolver
  */
 class LibraryImportScope extends Scope {
-  
+
   /**
    * @return {@code true} if the given {@link Identifier} is the part of type annotation.
    */
@@ -8632,23 +8675,23 @@
     }
     return false;
   }
-  
+
   /**
    * The element representing the library in which this scope is enclosed.
    */
   LibraryElement _definingLibrary;
-  
+
   /**
    * The listener that is to be informed when an error is encountered.
    */
   AnalysisErrorListener _errorListener;
-  
+
   /**
    * A list of the namespaces representing the names that are available in this scope from imported
    * libraries.
    */
   List<Namespace> _importedNamespaces = new List<Namespace>();
-  
+
   /**
    * 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
@@ -8703,7 +8746,7 @@
     }
     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.
@@ -8717,14 +8760,13 @@
     }
   }
 }
-
 /**
  * Instances of the class {@code LibraryScope} implement a scope containing all of the names defined
  * in a given library.
  * @coverage dart.engine.resolver
  */
 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
@@ -8746,7 +8788,7 @@
     }
     return super.getErrorForDuplicate(existing, duplicate);
   }
-  
+
   /**
    * Add to this scope all of the public top-level names that are defined in the given compilation
    * unit.
@@ -8767,7 +8809,7 @@
       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
@@ -8783,25 +8825,24 @@
     }
   }
 }
-
 /**
  * Instances of the class {@code Namespace} implement a mapping of identifiers to the elements
  * represented by those identifiers. Namespaces are the building blocks for scopes.
  * @coverage dart.engine.resolver
  */
 class Namespace {
-  
+
   /**
    * A table mapping names that are defined in this namespace to the element representing the thing
    * declared with that name.
    */
   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
@@ -8810,7 +8851,7 @@
   Namespace(Map<String, Element> definedNames) {
     this._definedNames = definedNames;
   }
-  
+
   /**
    * Return the element in this namespace that is available to the containing scope using the given
    * name.
@@ -8818,21 +8859,20 @@
    * @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 {@code NamespaceBuilder} are used to build a {@code Namespace}. Namespace
  * builders are thread-safe and re-usable.
  * @coverage dart.engine.resolver
  */
 class NamespaceBuilder {
-  
+
   /**
    * Create a namespace representing the export namespace of the given {@link ExportElement}.
    * @param element the export element whose export namespace is to be created
@@ -8847,14 +8887,14 @@
     definedNames = apply(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 createExportNamespace2(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
@@ -8870,7 +8910,7 @@
     definedNames = apply2(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
@@ -8884,7 +8924,7 @@
     }
     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
@@ -8895,7 +8935,7 @@
       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
@@ -8906,7 +8946,7 @@
       addAll(definedNames2, 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
@@ -8918,7 +8958,7 @@
       definedNames[name2] = element;
     }
   }
-  
+
   /**
    * Add to the given mapping table all of the public top-level names that are defined in the given
    * compilation unit.
@@ -8940,7 +8980,7 @@
       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
@@ -8958,7 +8998,7 @@
     }
     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
@@ -8976,7 +9016,7 @@
       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
@@ -9003,7 +9043,7 @@
       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
@@ -9012,9 +9052,10 @@
   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.
@@ -9028,48 +9069,52 @@
       if (element != null) {
         newNames[name] = element;
       }
+      String setterName = "${name}=";
+      element = definedNames[setterName];
+      if (element != null) {
+        newNames[setterName] = element;
+      }
     }
     return newNames;
   }
 }
-
 /**
  * The abstract class {@code 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.
  * @coverage dart.engine.resolver
  */
 abstract class Scope {
-  
+
   /**
    * The prefix used to mark an identifier as being private to its library.
    */
   static String PRIVATE_NAME_PREFIX = "_";
-  
+
   /**
    * 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 {@code true} if the given name is a library-private name.
    * @param name the name being tested
    * @return {@code true} if the given name is a library-private name
    */
   static bool isPrivateName(String name) => name != null && name.startsWith(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>();
-  
+
   /**
    * 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
@@ -9087,7 +9132,7 @@
       }
     }
   }
-  
+
   /**
    * Return the element with which the given identifier is associated, or {@code null} if the name
    * is not defined within this scope.
@@ -9097,7 +9142,7 @@
    * @return the element with which the given identifier is associated
    */
   Element lookup(Identifier identifier, LibraryElement referencingLibrary) => lookup3(identifier, identifier.name, referencingLibrary);
-  
+
   /**
    * Add the given element to this scope without checking for duplication or hiding.
    * @param element the element to be added to this scope
@@ -9105,7 +9150,7 @@
   void defineWithoutChecking(Element element) {
     _definedNames[getName(element)] = element;
   }
-  
+
   /**
    * Add the given element to this scope without checking for duplication or hiding.
    * @param name the name of the element to be added
@@ -9114,13 +9159,13 @@
   void defineWithoutChecking2(String name, Element element) {
     _definedNames[name] = element;
   }
-  
+
   /**
    * Return the element representing the library in which this scope is enclosed.
    * @return the element representing the library in which this scope is enclosed
    */
   LibraryElement get definingLibrary;
-  
+
   /**
    * 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.
@@ -9135,20 +9180,20 @@
     }
     return new AnalysisError.con2(source2, 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 object representing the compilation unit with which errors related to this
    * scope should be associated.
    * @return the source object with which errors should be associated
    */
   Source get source => definingLibrary.definingCompilationUnit.source;
-  
+
   /**
    * Return the element with which the given name is associated, or {@code null} if the name is not
    * defined within this scope. This method only returns elements that are directly defined within
@@ -9159,7 +9204,7 @@
    * @return the element with which the given name is associated
    */
   Element localLookup(String name, LibraryElement referencingLibrary) => _definedNames[name];
-  
+
   /**
    * Return the element with which the given name is associated, or {@code null} if the name is not
    * defined within this scope.
@@ -9171,7 +9216,7 @@
    * @return the element with which the given name is associated
    */
   Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary);
-  
+
   /**
    * 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
@@ -9187,7 +9232,6 @@
     return element.name;
   }
 }
-
 /**
  * Instances of the class {@code ConstantVerifier} traverse an AST structure looking for additional
  * errors and warnings not covered by the parser and resolver. In particular, it looks for errors
@@ -9195,32 +9239,32 @@
  * @coverage dart.engine.resolver
  */
 class ConstantVerifier extends RecursiveASTVisitor<Object> {
-  
+
   /**
    * The error reporter by which errors will be reported.
    */
   ErrorReporter _errorReporter;
-  
+
   /**
    * 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
@@ -9321,7 +9365,7 @@
     }
     return null;
   }
-  
+
   /**
    * Return {@code true} if the given value is the result of evaluating an expression whose value is
    * a valid key in a const map literal. Keys in const map literals must be either a string, number,
@@ -9330,7 +9374,7 @@
    * @return {@code true} if the given value is a valid key in a const map literal
    */
   bool isValidConstMapKey(Object value) => true;
-  
+
   /**
    * 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.
@@ -9349,7 +9393,7 @@
       }
     }
   }
-  
+
   /**
    * Validate that the given expression is a compile time constant. Return the value of the compile
    * time constant, or {@code null} if the expression is not a compile time constant.
@@ -9362,7 +9406,7 @@
     reportErrors(result, errorCode);
     return result;
   }
-  
+
   /**
    * Validate that if the passed instance creation is 'const' then all its arguments are constant
    * expressions.
@@ -9383,7 +9427,7 @@
       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.
@@ -9407,7 +9451,7 @@
       }
     }
   }
-  
+
   /**
    * Validates that the given expression is a compile time constant.
    * @param parameterElements the elements of parameters of constant constructor, they are
@@ -9418,7 +9462,7 @@
     EvaluationResultImpl result = expression.accept(new ConstantVisitor_10(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
@@ -9433,7 +9477,7 @@
       validateInitializerExpression(parameterElements, argument);
     }
   }
-  
+
   /**
    * Validates that the expressions of the given initializers (of a constant constructor) are all
    * compile time constants.
@@ -9490,14 +9534,13 @@
     return super.visitSimpleIdentifier(node);
   }
 }
-
 /**
  * Instances of the class {@code ErrorVerifier} traverse an AST structure looking for additional
  * errors and warnings not covered by the parser and resolver.
  * @coverage dart.engine.resolver
  */
 class ErrorVerifier extends RecursiveASTVisitor<Object> {
-  
+
   /**
    * Checks if the given expression is the reference to the type.
    * @param expr the expression to evaluate
@@ -9510,66 +9553,72 @@
     }
     return false;
   }
-  
+
   /**
    * The error reporter by which errors will be reported.
    */
   ErrorReporter _errorReporter;
-  
+
   /**
    * The current library that is being analyzed.
    */
   LibraryElement _currentLibrary;
-  
+
   /**
    * The type representing the type 'dynamic'.
    */
   Type2 _dynamicType;
-  
+
   /**
    * The object providing access to the types defined by the language.
    */
   TypeProvider _typeProvider;
-  
+
   /**
    * The manager for the inheritance mappings.
    */
   InheritanceManager _inheritanceManager;
-  
+
+  /**
+   * A flag indicating whether we are running in strict mode. In strict mode, error reporting is
+   * based exclusively on the static type information.
+   */
+  bool _strictMode = false;
+
   /**
    * This is set to {@code true} iff the visitor is currently visiting children nodes of a{@link ConstructorDeclaration} and the constructor is 'const'.
    * @see #visitConstructorDeclaration(ConstructorDeclaration)
    */
   bool _isEnclosingConstructorConst = false;
-  
+
   /**
    * This is set to {@code true} iff the visitor is currently visiting children nodes of a{@link CatchClause}.
    * @see #visitCatchClause(CatchClause)
    */
   bool _isInCatchClause = false;
-  
+
   /**
    * This is set to {@code true} iff the visitor is currently visiting a{@link ConstructorInitializer}.
    */
   bool _isInConstructorInitializer = false;
-  
+
   /**
    * This is set to {@code true} iff the visitor is currently visiting code in the SDK.
    */
   bool _isInSystemLibrary = false;
-  
+
   /**
    * The class containing the AST nodes being visited, or {@code null} if we are not in the scope of
    * a class.
    */
   ClassElement _enclosingClass;
-  
+
   /**
    * The method or function that we are currently visiting, or {@code null} if we are not inside a
    * method or function.
    */
   ExecutableElement _enclosingFunction;
-  
+
   /**
    * 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 {@code null}.
@@ -9582,27 +9631,27 @@
    * @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 export elements exported them.
    */
   Map<String, ExportElement> _exportedNames = new Map<String, ExportElement>();
-  
+
   /**
    * 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 {@link CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS} and{@link CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS} error codes.
    */
@@ -9613,6 +9662,7 @@
     this._isInSystemLibrary = currentLibrary.source.isInSystemLibrary();
     this._typeProvider = typeProvider;
     this._inheritanceManager = inheritanceManager;
+    _strictMode = currentLibrary.context.analysisOptions.strictMode;
     _isEnclosingConstructorConst = false;
     _isInCatchClause = false;
     _dynamicType = typeProvider.dynamicType;
@@ -9990,7 +10040,7 @@
     checkForNonBoolCondition(node.condition);
     return super.visitWhileStatement(node);
   }
-  
+
   /**
    * 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.
@@ -10058,7 +10108,7 @@
     }
     return foundError;
   }
-  
+
   /**
    * This checks the passed method declaration against override-error codes.
    * @param node the {@link MethodDeclaration} to evaluate
@@ -10205,7 +10255,7 @@
     }
     return false;
   }
-  
+
   /**
    * This verifies that all classes of the passed 'with' clause are valid.
    * @param node the 'with' clause to evaluate
@@ -10231,7 +10281,7 @@
     }
     return problemReported;
   }
-  
+
   /**
    * This checks that the return statement of the form <i>return e;</i> is not in a generative
    * constructor.
@@ -10277,7 +10327,7 @@
     }
     bool isStaticAssignable = staticReturnType.isAssignableTo(expectedReturnType);
     Type2 propagatedReturnType = getPropagatedType(returnExpression);
-    if (propagatedReturnType == null) {
+    if (_strictMode || propagatedReturnType == null) {
       if (isStaticAssignable) {
         return false;
       }
@@ -10292,7 +10342,7 @@
       return true;
     }
   }
-  
+
   /**
    * This verifies that the export namespace of the passed export directive does not export any name
    * already exported by other export directive.
@@ -10322,7 +10372,7 @@
     }
     return false;
   }
-  
+
   /**
    * This verifies that the passed argument definition test identifier is a parameter.
    * @param node the {@link ArgumentDefinitionTest} to evaluate
@@ -10338,7 +10388,7 @@
     }
     return false;
   }
-  
+
   /**
    * This verifies that the passed arguments can be assigned to their corresponding parameters.
    * @param node the arguments to evaluate
@@ -10355,7 +10405,7 @@
     }
     return problemReported;
   }
-  
+
   /**
    * This verifies that the passed argument can be assigned to their corresponding parameters.
    * @param node the argument to evaluate
@@ -10366,29 +10416,36 @@
     if (argument == null) {
       return false;
     }
-    ParameterElement parameterElement2 = argument.parameterElement;
-    if (parameterElement2 == null) {
+    ParameterElement staticParameterElement2 = argument.staticParameterElement;
+    Type2 staticParameterType = staticParameterElement2 == null ? null : staticParameterElement2.type;
+    Type2 staticArgumentType = getStaticType(argument);
+    if (staticArgumentType == null || staticParameterType == null) {
       return false;
     }
-    Type2 parameterType = parameterElement2.type;
-    if (parameterType == null) {
+    if (_strictMode) {
+      if (staticArgumentType.isAssignableTo(staticParameterType)) {
+        return false;
+      }
+      _errorReporter.reportError2(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, argument, [staticArgumentType.displayName, staticParameterType.displayName]);
+      return true;
+    }
+    ParameterElement propagatedParameterElement = argument.parameterElement;
+    Type2 propagatedParameterType = propagatedParameterElement == null ? null : propagatedParameterElement.type;
+    Type2 propagatedArgumentType = getPropagatedType(argument);
+    if (propagatedArgumentType == null || propagatedParameterType == null) {
+      if (staticArgumentType.isAssignableTo(staticParameterType)) {
+        return false;
+      }
+      _errorReporter.reportError2(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, argument, [staticArgumentType.displayName, staticParameterType.displayName]);
+      return true;
+    }
+    if (staticArgumentType.isAssignableTo(staticParameterType) || staticArgumentType.isAssignableTo(propagatedParameterType) || propagatedArgumentType.isAssignableTo(staticParameterType) || propagatedArgumentType.isAssignableTo(propagatedParameterType)) {
       return false;
     }
-    Type2 staticType = getStaticType(argument);
-    if (staticType == null) {
-      return false;
-    }
-    if (staticType.isAssignableTo(parameterType)) {
-      return false;
-    }
-    Type2 propagatedType = getPropagatedType(argument);
-    if (propagatedType != null && propagatedType.isAssignableTo(parameterType)) {
-      return false;
-    }
-    _errorReporter.reportError2(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, argument, [(propagatedType == null ? staticType : propagatedType).displayName, parameterType.displayName]);
+    _errorReporter.reportError2(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, argument, [(propagatedArgumentType == null ? staticArgumentType : propagatedArgumentType).displayName, (propagatedParameterType == null ? staticParameterType : propagatedParameterType).displayName]);
     return true;
   }
-  
+
   /**
    * This verifies that left hand side of the passed assignment expression is not final.
    * @param node the assignment expression to evaluate
@@ -10399,7 +10456,7 @@
     Expression leftExpression = node.leftHandSide;
     return checkForAssignmentToFinal2(leftExpression);
   }
-  
+
   /**
    * This verifies that the passed expression is not final.
    * @param node the expression to evaluate
@@ -10432,7 +10489,7 @@
     }
     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.
@@ -10452,7 +10509,7 @@
     }
     return false;
   }
-  
+
   /**
    * This verifies that the passed variable declaration list does not have a built-in identifier.
    * @param node the variable declaration list to check
@@ -10476,7 +10533,7 @@
     }
     return false;
   }
-  
+
   /**
    * This verifies that the given switch case is terminated with 'break', 'continue', 'return' or
    * 'throw'.
@@ -10511,7 +10568,7 @@
     _errorReporter.reportError4(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'.
@@ -10531,7 +10588,7 @@
     }
     return foundError;
   }
-  
+
   /**
    * This verifies that the passed switch statement does not have a case expression with the
    * operator '==' overridden.
@@ -10555,7 +10612,7 @@
     }
     return false;
   }
-  
+
   /**
    * This verifies that the passed method declaration is abstract only if the enclosing class is
    * also abstract.
@@ -10571,7 +10628,7 @@
     }
     return false;
   }
-  
+
   /**
    * This verifies all possible conflicts of the constructor name with other constructors and
    * members of the same class.
@@ -10619,7 +10676,7 @@
     }
     return false;
   }
-  
+
   /**
    * This verifies that the superclass of the enclosing class does not declare accessible static
    * member with the same name as the passed instance getter/setter method declaration.
@@ -10664,7 +10721,7 @@
     }
     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.
@@ -10697,7 +10754,7 @@
     _errorReporter.reportError2(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.
@@ -10737,7 +10794,7 @@
     _errorReporter.reportError2(StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER, nameNode, [memberType.displayName]);
     return true;
   }
-  
+
   /**
    * This verifies that the passed constructor declaration is 'const' then there are no non-final
    * instance variable.
@@ -10757,7 +10814,7 @@
     _errorReporter.reportError2(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.
@@ -10772,7 +10829,7 @@
     }
     return false;
   }
-  
+
   /**
    * This verifies that the passed normal formal parameter is not 'const'.
    * @param node the normal formal parameter to evaluate
@@ -10786,7 +10843,7 @@
     }
     return false;
   }
-  
+
   /**
    * This verifies that the passed instance creation expression is not being invoked on an abstract
    * class.
@@ -10811,7 +10868,7 @@
     }
     return false;
   }
-  
+
   /**
    * This verifies that the passed 'const' instance creation expression is not being invoked on a
    * constructor that is not 'const'.
@@ -10829,7 +10886,7 @@
     }
     return false;
   }
-  
+
   /**
    * This verifies that the passed 'const' instance creation expression does not reference any type
    * parameters.
@@ -10847,7 +10904,7 @@
     TypeName typeName = constructorName2.type;
     return checkForConstWithTypeParameters2(typeName);
   }
-  
+
   /**
    * This verifies that the passed type name does not reference any type parameters.
    * @param typeName the type name to evaluate
@@ -10875,7 +10932,7 @@
     }
     return false;
   }
-  
+
   /**
    * This verifies that if the passed 'const' instance creation expression is being invoked on the
    * resolved constructor.
@@ -10907,7 +10964,7 @@
     }
     return true;
   }
-  
+
   /**
    * This verifies that there are no default parameters in the passed function type alias.
    * @param node the function type alias to evaluate
@@ -10929,7 +10986,7 @@
     }
     return result;
   }
-  
+
   /**
    * This verifies the passed import has unique name among other exported libraries.
    * @param node the export directive to evaluate
@@ -10958,7 +11015,7 @@
     }
     return false;
   }
-  
+
   /**
    * Check that if the visiting library is not system, then any passed library should not be SDK
    * internal library.
@@ -10987,7 +11044,7 @@
     _errorReporter.reportError2(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
@@ -11000,7 +11057,7 @@
     }
     return checkForExtendsOrImplementsDisallowedClass(extendsClause.superclass, CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS);
   }
-  
+
   /**
    * This verifies that the passed type name does not extend or implement classes such as 'num' or
    * 'String'.
@@ -11034,7 +11091,7 @@
     }
     return false;
   }
-  
+
   /**
    * This verifies that the passed constructor field initializer has compatible field and
    * initializer expression types.
@@ -11060,6 +11117,13 @@
     }
     if (staticType.isAssignableTo(fieldType)) {
       return false;
+    } else if (_strictMode) {
+      if (_isEnclosingConstructorConst) {
+        _errorReporter.reportError2(CompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE, expression2, [staticType.displayName, fieldType.displayName]);
+      } else {
+        _errorReporter.reportError2(StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE, expression2, [staticType.displayName, fieldType.displayName]);
+      }
+      return true;
     }
     Type2 propagatedType = getPropagatedType(expression2);
     if (propagatedType != null && propagatedType.isAssignableTo(fieldType)) {
@@ -11072,7 +11136,7 @@
     }
     return true;
   }
-  
+
   /**
    * This verifies that the passed field formal parameter is in a constructor declaration.
    * @param node the field formal parameter to test
@@ -11097,7 +11161,7 @@
     }
     return false;
   }
-  
+
   /**
    * 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
@@ -11122,7 +11186,7 @@
     }
     return foundError;
   }
-  
+
   /**
    * This verifies that the passed variable declaration list has only initialized variables if the
    * list is final or const. This method is called by{@link #checkForFinalNotInitialized(ClassDeclaration)},{@link #visitTopLevelVariableDeclaration(TopLevelVariableDeclaration)} and{@link #visitVariableDeclarationStatement(VariableDeclarationStatement)}.
@@ -11143,7 +11207,7 @@
     }
     return foundError;
   }
-  
+
   /**
    * This verifies that the passed implements clause does not implement classes such as 'num' or
    * 'String'.
@@ -11161,7 +11225,7 @@
     }
     return foundError;
   }
-  
+
   /**
    * This verifies that if the passed identifier is part of constructor initializer, then it does
    * not reference implicitly 'this' expression.
@@ -11209,7 +11273,7 @@
     _errorReporter.reportError2(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
@@ -11238,7 +11302,7 @@
     }
     return false;
   }
-  
+
   /**
    * Check that if the visiting library is not system, then any passed library should not be SDK
    * internal library.
@@ -11267,7 +11331,7 @@
     _errorReporter.reportError2(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
@@ -11295,7 +11359,7 @@
     }
     return foundError;
   }
-  
+
   /**
    * For each class declaration, this method is called which verifies that all inherited members are
    * inherited consistently.
@@ -11313,7 +11377,7 @@
     }
     return true;
   }
-  
+
   /**
    * Given an assignment using a compound assignment operator, this verifies that the given
    * assignment is valid.
@@ -11342,7 +11406,7 @@
     }
     return false;
   }
-  
+
   /**
    * This verifies that the passed left hand side and right hand side represent a valid assignment.
    * @param lhs the left hand side expression
@@ -11359,7 +11423,7 @@
     Type2 staticRightType = getStaticType(rhs);
     bool isStaticAssignable = staticRightType.isAssignableTo(leftType);
     Type2 propagatedRightType = getPropagatedType(rhs);
-    if (propagatedRightType == null) {
+    if (_strictMode || propagatedRightType == null) {
       if (!isStaticAssignable) {
         _errorReporter.reportError2(StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [staticRightType.displayName, leftType.displayName]);
         return true;
@@ -11373,7 +11437,7 @@
     }
     return false;
   }
-  
+
   /**
    * This verifies that the usage of the passed 'this' is valid.
    * @param node the 'this' expression to evaluate
@@ -11387,7 +11451,7 @@
     }
     return false;
   }
-  
+
   /**
    * Checks to ensure that first type argument to a map literal must be the 'String' type.
    * @param arguments a non-{@code null}, non-empty {@link TypeName} node list from the respective{@link MapLiteral}
@@ -11403,7 +11467,7 @@
     }
     return false;
   }
-  
+
   /**
    * Checks to ensure that the passed {@link ListLiteral} or {@link MapLiteral} does not have a type
    * parameter as a type argument.
@@ -11421,7 +11485,7 @@
     }
     return foundError;
   }
-  
+
   /**
    * This verifies that the {@link #enclosingClass} does not define members with the same name as
    * the enclosing class.
@@ -11445,7 +11509,7 @@
     }
     return problemReported;
   }
-  
+
   /**
    * Check to make sure that all similarly typed accessors are of the same type (including inherited
    * accessors).
@@ -11476,7 +11540,7 @@
       _errorReporter.reportError2(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES, accessorDeclaration, [accessorTextName, setterType.displayName, getterType.displayName]);
     }
   }
-  
+
   /**
    * This verifies that the passed mixin does not have an explicitly declared constructor.
    * @param mixinName the node to report problem on
@@ -11493,7 +11557,7 @@
     }
     return false;
   }
-  
+
   /**
    * This verifies that the passed mixin has the 'Object' superclass.
    * @param mixinName the node to report problem on
@@ -11511,7 +11575,7 @@
     }
     return false;
   }
-  
+
   /**
    * This verifies that the passed mixin does not reference 'super'.
    * @param mixinName the node to report problem on
@@ -11525,7 +11589,7 @@
     }
     return false;
   }
-  
+
   /**
    * This verifies that the passed constructor has at most one 'super' initializer.
    * @param node the constructor declaration to evaluate
@@ -11544,7 +11608,7 @@
     }
     return numSuperInitializers > 0;
   }
-  
+
   /**
    * Checks to ensure that native function bodies can only in SDK code.
    * @param node the native function body to test
@@ -11558,7 +11622,7 @@
     }
     return false;
   }
-  
+
   /**
    * This verifies that the passed 'new' instance creation expression invokes existing constructor.
    * <p>
@@ -11588,7 +11652,7 @@
     }
     return true;
   }
-  
+
   /**
    * This checks that passed class declaration overrides all members required by its superclasses
    * and interfaces.
@@ -11677,7 +11741,7 @@
     }
     return true;
   }
-  
+
   /**
    * Checks to ensure that the expressions that need to be of type bool, are. Otherwise an error is
    * reported on the expression.
@@ -11693,7 +11757,7 @@
     }
     return false;
   }
-  
+
   /**
    * This verifies that the passed assert statement has either a 'bool' or '() -> bool' input.
    * @param node the assert statement to evaluate
@@ -11717,7 +11781,7 @@
     }
     return false;
   }
-  
+
   /**
    * This verifies the passed map literal either:
    * <ul>
@@ -11746,7 +11810,7 @@
     _errorReporter.reportError2(CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT, node, []);
     return true;
   }
-  
+
   /**
    * This verifies the passed method declaration of operator {@code \[\]=}, has {@code void} return
    * type.
@@ -11768,7 +11832,7 @@
     }
     return false;
   }
-  
+
   /**
    * This verifies the passed setter has no return type or the {@code void} return type.
    * @param typeName the type name to evaluate
@@ -11784,7 +11848,7 @@
     }
     return false;
   }
-  
+
   /**
    * This verifies the passed operator-method declaration, does not have an optional parameter.
    * <p>
@@ -11809,7 +11873,7 @@
     }
     return foundError;
   }
-  
+
   /**
    * This checks for named optional parameters that begin with '_'.
    * @param node the default formal parameter to evaluate
@@ -11828,7 +11892,7 @@
     }
     return false;
   }
-  
+
   /**
    * This checks if the passed constructor declaration is the redirecting generative constructor and
    * references itself directly or indirectly.
@@ -11852,7 +11916,7 @@
     }
     return false;
   }
-  
+
   /**
    * This checks if the passed constructor declaration has redirected constructor and references
    * itself directly or indirectly.
@@ -11872,7 +11936,7 @@
     _errorReporter.reportError2(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
@@ -11936,7 +12000,7 @@
     list.removeAt(list.length - 1);
     return false;
   }
-  
+
   /**
    * This checks the passed constructor declaration has a valid combination of redirected
    * constructor invocation(s), super constructor invocations and field initializers.
@@ -11972,7 +12036,7 @@
     }
     return numProblems != 0;
   }
-  
+
   /**
    * This checks if the passed constructor declaration has redirected constructor with compatible
    * function type.
@@ -12004,7 +12068,7 @@
     }
     return false;
   }
-  
+
   /**
    * This checks if the passed constructor declaration has redirected constructor and references
    * itself directly or indirectly. TODO(scheglov)
@@ -12034,7 +12098,7 @@
     _errorReporter.reportError2(CompileTimeErrorCode.REDIRECT_TO_NON_CONST_CONSTRUCTOR, redirectedConstructorNode, []);
     return true;
   }
-  
+
   /**
    * This checks if the passed identifier is banned because it is part of the variable declaration
    * with the same name.
@@ -12081,7 +12145,7 @@
     _errorReporter.reportError2(CompileTimeErrorCode.REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER, node, [name2]);
     return true;
   }
-  
+
   /**
    * This checks that the rethrow is inside of a catch clause.
    * @param node the rethrow expression to evaluate
@@ -12095,7 +12159,7 @@
     }
     return false;
   }
-  
+
   /**
    * This checks that if the given "target" is the type reference then the "name" is not the
    * reference to a instance member.
@@ -12119,7 +12183,7 @@
     _errorReporter.reportError2(StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER, name2, [name2.name]);
     return true;
   }
-  
+
   /**
    * This checks that the type of the passed 'switch' expression is assignable to the type of the
    * 'case' members.
@@ -12149,7 +12213,7 @@
     }
     return false;
   }
-  
+
   /**
    * This verifies that the type arguments in the passed instance creation expression are all within
    * their bounds as specified by the class element where the constructor \[that is being invoked\] is
@@ -12179,7 +12243,7 @@
     }
     return false;
   }
-  
+
   /**
    * This checks that if the passed generative constructor has no explicit super constructor
    * invocation, then super class has the default generative constructor.
@@ -12216,7 +12280,7 @@
     _errorReporter.reportError2(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, node.returnType, [superElement.name]);
     return true;
   }
-  
+
   /**
    * This verifies the passed operator-method declaration, has correct number of parameters.
    * <p>
@@ -12255,7 +12319,7 @@
     }
     return false;
   }
-  
+
   /**
    * This verifies if the passed setter parameter list have only one parameter.
    * <p>
@@ -12279,7 +12343,7 @@
     }
     return false;
   }
-  
+
   /**
    * Return the propagated type of the given expression, or the static type if there is no
    * propagated type information.
@@ -12293,7 +12357,7 @@
     }
     return type;
   }
-  
+
   /**
    * Returns the Type (return type) for a given getter.
    * @param propertyAccessorElement
@@ -12307,14 +12371,14 @@
       return null;
     }
   }
-  
+
   /**
    * Return the propagated 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 propagated type of the given expression
    */
   Type2 getPropagatedType(Expression expression) => expression.propagatedType;
-  
+
   /**
    * Returns the Type (first and only parameter) for a given setter.
    * @param propertyAccessorElement
@@ -12327,7 +12391,7 @@
     }
     return setterParameters[0].type;
   }
-  
+
   /**
    * 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
@@ -12340,7 +12404,7 @@
     }
     return type;
   }
-  
+
   /**
    * Return the variable element represented by the given expression, or {@code null} if there is no
    * such element.
@@ -12356,7 +12420,7 @@
     }
     return null;
   }
-  
+
   /**
    * @return {@code true} if the given constructor redirects to itself, directly or indirectly
    */
@@ -12375,7 +12439,7 @@
     }
     return false;
   }
-  
+
   /**
    * @param node the 'this' expression to analyze
    * @return {@code true} if the given 'this' expression is in the valid context
@@ -12400,7 +12464,6 @@
     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
@@ -12413,10 +12476,10 @@
   static final INIT_STATE INIT_IN_DEFAULT_VALUE = new INIT_STATE('INIT_IN_DEFAULT_VALUE', 3);
   static final INIT_STATE INIT_IN_INITIALIZERS = new INIT_STATE('INIT_IN_INITIALIZERS', 4);
   static final List<INIT_STATE> values = [NOT_INIT, INIT_IN_DECLARATION, INIT_IN_FIELD_FORMAL, INIT_IN_DEFAULT_VALUE, INIT_IN_INITIALIZERS];
-  
+
   /// The name of this enum constant, as declared in the enum declaration.
   final String name;
-  
+
   /// The position in the enum declaration.
   final int ordinal;
   INIT_STATE(this.name, this.ordinal) {
@@ -12424,7 +12487,98 @@
   int compareTo(INIT_STATE other) => ordinal - other.ordinal;
   String toString() => name;
 }
+/**
+ * Instances of the class {@code PubVerifier} traverse an AST structure looking for deviations from
+ * pub best practices.
+ */
+class PubVerifier extends RecursiveASTVisitor<Object> {
 
+  /**
+   * The error reporter by which errors will be reported.
+   */
+  ErrorReporter _errorReporter;
+  PubVerifier(ErrorReporter errorReporter) {
+    this._errorReporter = errorReporter;
+  }
+  Object visitImportDirective(ImportDirective directive) {
+    return null;
+  }
+
+  /**
+   * Determine if the file file path lies inside the "lib" directory hierarchy but references a file
+   * outside that directory hierarchy.
+   * @param directive the import directive (not {@code null})
+   * @param path the file path being verified (not {@code null})
+   * @return {@code true} if the file is inside but references a file outside
+   */
+  bool checkForFileImportInsideLibReferencesFileOutside(ImportDirective directive, String path) {
+    String fullName = getSourceFullName(directive);
+    if (fullName != null) {
+      int pathIndex = 0;
+      int fullNameIndex = fullName.length;
+      while (pathIndex < path.length && JavaString.startsWithBefore(path, "../", pathIndex)) {
+        fullNameIndex = fullName.lastIndexOf('/', fullNameIndex);
+        if (fullNameIndex < 4) {
+          return false;
+        }
+        if (JavaString.startsWithBefore(fullName, "/lib", fullNameIndex - 4)) {
+          return true;
+        }
+        pathIndex += 3;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Determine if the given file path lies outside the "lib" directory hierarchy but references a
+   * file inside that directory hierarchy.
+   * @param directive the import directive (not {@code null})
+   * @param path the file path being verified (not {@code null})
+   * @return {@code true} if the file is outside but references a file inside
+   */
+  bool checkForFileImportOutsideLibReferencesFileInside(ImportDirective directive, String path) {
+    if (path.startsWith("lib/") || path.contains("/lib/")) {
+      String fullName = getSourceFullName(directive);
+      if (fullName != null) {
+        if (!fullName.contains("/lib/")) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Determine if the given package import path contains ".."
+   * @param path the path to be validated (not {@code null})
+   * @return {@code true} if the import path contains ".."
+   */
+  bool checkForPackageImportContainsDotDot(String path) => path.contains("/../");
+
+  /**
+   * Answer the full name of the source associated with the compilation unit containing the given
+   * AST node. The returned value will have all {@link File#separatorChar} replace by '/'.
+   * @param node the node (not {@code null})
+   * @return the full name or {@code null} if it could not be determined
+   */
+  String getSourceFullName(ASTNode node) {
+    CompilationUnit unit = node.getAncestor(CompilationUnit);
+    if (unit != null) {
+      CompilationUnitElement element2 = unit.element;
+      if (element2 != null) {
+        Source librarySource = element2.source;
+        if (librarySource != null) {
+          String fullName2 = librarySource.fullName;
+          if (fullName2 != null) {
+            return fullName2.replaceAll(r'\', '/');
+          }
+        }
+      }
+    }
+    return null;
+  }
+}
 /**
  * The enumeration {@code 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
@@ -12437,23 +12591,23 @@
   static final ResolverErrorCode CONTINUE_LABEL_ON_SWITCH = new ResolverErrorCode('CONTINUE_LABEL_ON_SWITCH', 1, ErrorType.COMPILE_TIME_ERROR, "A continue label resolves to switch, must be loop or switch member");
   static final ResolverErrorCode MISSING_LIBRARY_DIRECTIVE_WITH_PART = new ResolverErrorCode('MISSING_LIBRARY_DIRECTIVE_WITH_PART', 2, ErrorType.COMPILE_TIME_ERROR, "Libraries that have parts must have a library directive");
   static final List<ResolverErrorCode> values = [BREAK_LABEL_ON_SWITCH_MEMBER, CONTINUE_LABEL_ON_SWITCH, MISSING_LIBRARY_DIRECTIVE_WITH_PART];
-  
+
   /// The name of this enum constant, as declared in the enum declaration.
   final String name;
-  
+
   /// The position in the enum declaration.
   final int ordinal;
-  
+
   /**
    * The type of this error.
    */
   ErrorType _type;
-  
+
   /**
    * The message template used to create the message to be displayed for this error.
    */
   String _message;
-  
+
   /**
    * Initialize a newly created error code to have the given type and message.
    * @param type the type of this error
diff --git a/pkg/analyzer_experimental/lib/src/generated/scanner.dart b/pkg/analyzer_experimental/lib/src/generated/scanner.dart
index 954e066..2da3af1 100644
--- a/pkg/analyzer_experimental/lib/src/generated/scanner.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/scanner.dart
@@ -1,33 +1,29 @@
 // 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.scanner;
-
 import 'dart:collection';
 import 'java_core.dart';
 import 'java_engine.dart';
 import 'source.dart';
 import 'error.dart';
 import 'instrumentation.dart';
-
-
 /**
  * Instances of the abstract class {@code KeywordState} represent a state in a state machine used to
  * scan keywords.
  * @coverage dart.engine.parser
  */
 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.
@@ -74,7 +70,7 @@
       return new KeywordState(result, null);
     }
   }
-  
+
   /**
    * Create the initial state in the state machine.
    * @return the state that was created
@@ -88,19 +84,19 @@
     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 {@code 'a'} to the transitioning character.)
    */
   List<KeywordState> _table;
-  
+
   /**
    * The keyword that is recognized by this state, or {@code null} if this state is not a terminal
    * state.
    */
   Keyword _keyword2;
-  
+
   /**
    * Initialize a newly created state to have the given transitions and to recognize the keyword
    * with the given syntax.
@@ -111,14 +107,14 @@
     this._table = table;
     this._keyword2 = (syntax == null) ? null : Keyword.keywords[syntax];
   }
-  
+
   /**
    * Return the keyword that was recognized by this state, or {@code null} if this state does not
    * recognized a keyword.
    * @return the keyword that was matched by reaching this state
    */
   Keyword keyword() => _keyword2;
-  
+
   /**
    * Return the state that follows this state on a transition of the given character, or{@code 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
@@ -126,7 +122,6 @@
    */
   KeywordState next(int c) => _table[c - 0x61];
 }
-
 /**
  * The enumeration {@code ScannerErrorCode} defines the error codes used for errors detected by the
  * scanner.
@@ -140,18 +135,18 @@
   static final ScannerErrorCode UNTERMINATED_MULTI_LINE_COMMENT = new ScannerErrorCode('UNTERMINATED_MULTI_LINE_COMMENT', 4, "Unterminated multi-line comment");
   static final ScannerErrorCode UNTERMINATED_STRING_LITERAL = new ScannerErrorCode('UNTERMINATED_STRING_LITERAL', 5, "Unterminated string literal");
   static final List<ScannerErrorCode> values = [ILLEGAL_CHARACTER, MISSING_DIGIT, MISSING_HEX_DIGIT, MISSING_QUOTE, UNTERMINATED_MULTI_LINE_COMMENT, UNTERMINATED_STRING_LITERAL];
-  
+
   /// The name of this enum constant, as declared in the enum declaration.
   final String name;
-  
+
   /// The position in the enum declaration.
   final int ordinal;
-  
+
   /**
    * The message template used to create the message to be displayed for this error.
    */
   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 this error
@@ -165,19 +160,18 @@
   int compareTo(ScannerErrorCode other) => ordinal - other.ordinal;
   String toString() => name;
 }
-
 /**
  * Instances of the class {@code TokenWithComment} represent a string token that is preceded by
  * comments.
  * @coverage dart.engine.parser
  */
 class StringTokenWithComment extends StringToken {
-  
+
   /**
    * The first comment in the list of comments that precede this token.
    */
   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.
@@ -190,7 +184,6 @@
   }
   Token get precedingComments => _precedingComment;
 }
-
 /**
  * The enumeration {@code Keyword} defines the keywords in the Dart programming language.
  * @coverage dart.engine.parser
@@ -245,29 +238,29 @@
   static final Keyword STATIC = new Keyword.con2('STATIC', 46, "static", true);
   static final Keyword TYPEDEF = new Keyword.con2('TYPEDEF', 47, "typedef", true);
   static final List<Keyword> values = [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, DYNAMIC, EXPORT, EXTERNAL, FACTORY, GET, IMPLEMENTS, IMPORT, LIBRARY, OPERATOR, PART, SET, STATIC, TYPEDEF];
-  
+
   /// The name of this enum constant, as declared in the enum declaration.
   final String name;
-  
+
   /// The position in the enum declaration.
   final int ordinal;
-  
+
   /**
    * The lexeme for the keyword.
    */
   String _syntax;
-  
+
   /**
    * A flag indicating whether the keyword is a pseudo-keyword. Pseudo keywords can be used as
    * identifiers.
    */
   bool _isPseudoKeyword2 = false;
-  
+
   /**
    * 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
@@ -279,19 +272,19 @@
     }
     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
    */
   Keyword.con1(this.name, this.ordinal, String syntax) {
-    _jtd_constructor_316_impl(syntax);
+    _jtd_constructor_318_impl(syntax);
   }
-  _jtd_constructor_316_impl(String syntax) {
-    _jtd_constructor_317_impl(syntax, false);
+  _jtd_constructor_318_impl(String syntax) {
+    _jtd_constructor_319_impl(syntax, false);
   }
-  
+
   /**
    * Initialize a newly created keyword to have the given syntax. The keyword is a pseudo-keyword if
    * the given flag is {@code true}.
@@ -299,19 +292,19 @@
    * @param isPseudoKeyword {@code true} if this keyword is a pseudo-keyword
    */
   Keyword.con2(this.name, this.ordinal, String syntax2, bool isPseudoKeyword) {
-    _jtd_constructor_317_impl(syntax2, isPseudoKeyword);
+    _jtd_constructor_319_impl(syntax2, isPseudoKeyword);
   }
-  _jtd_constructor_317_impl(String syntax2, bool isPseudoKeyword) {
+  _jtd_constructor_319_impl(String syntax2, bool isPseudoKeyword) {
     this._syntax = syntax2;
     this._isPseudoKeyword2 = isPseudoKeyword;
   }
-  
+
   /**
    * Return the lexeme for the keyword.
    * @return the lexeme for the keyword
    */
   String get syntax => _syntax;
-  
+
   /**
    * Return {@code true} if this keyword is a pseudo-keyword. Pseudo keywords can be used as
    * identifiers.
@@ -321,7 +314,6 @@
   int compareTo(Keyword other) => ordinal - other.ordinal;
   String toString() => name;
 }
-
 /**
  * The abstract class {@code AbstractScanner} implements a scanner for Dart code. Subclasses are
  * required to implement the interface used to access the characters being scanned.
@@ -334,63 +326,63 @@
  * @coverage dart.engine.parser
  */
 abstract class AbstractScanner {
-  
+
   /**
    * The source being scanned.
    */
   Source _source;
-  
+
   /**
    * The error listener that will be informed of any errors that are found during the scan.
    */
   AnalysisErrorListener _errorListener;
-  
+
   /**
    * The token pointing to the head of the linked list of tokens.
    */
   Token _tokens;
-  
+
   /**
    * The last token that was scanned.
    */
   Token _tail;
-  
+
   /**
    * The first token in the list of comment tokens found since the last non-comment token.
    */
   Token _firstComment;
-  
+
   /**
    * The last token in the list of comment tokens found since the last non-comment token.
    */
   Token _lastComment;
-  
+
   /**
    * The index of the first character of the current token.
    */
   int _tokenStart = 0;
-  
+
   /**
    * A list containing the offsets of the first character of each line in the source code.
    */
   List<int> _lineStarts = new List<int>();
-  
+
   /**
    * A list, treated something like a stack, of tokens representing the beginning of a matched pair.
    * It is used to pair the end tokens with the begin tokens.
    */
   List<BeginToken> _groupingStack = new List<BeginToken>();
-  
+
   /**
    * A flag indicating whether any unmatched groups were found during the parse.
    */
   bool _hasUnmatchedGroups2 = false;
-  
+
   /**
    * A non-breaking space, which is allowed by this scanner as a white-space character.
    */
   static int _$NBSP = 160;
-  
+
   /**
    * Initialize a newly created scanner.
    * @param source the source being scanned
@@ -405,13 +397,13 @@
     _tokenStart = -1;
     _lineStarts.add(0);
   }
-  
+
   /**
    * Return an array containing the offsets of the first character of each line in the source code.
    * @return an array containing the offsets of the first character of each line in the source code
    */
   List<int> get lineStarts => _lineStarts;
-  
+
   /**
    * Return the current offset relative to the beginning of the file. 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
@@ -419,13 +411,13 @@
    * @return the current offset of the scanner in the source
    */
   int get offset;
-  
+
   /**
    * Return {@code true} if any unmatched groups were found during the parse.
    * @return {@code true} if any unmatched groups were found during the parse
    */
   bool hasUnmatchedGroups() => _hasUnmatchedGroups2;
-  
+
   /**
    * Scan the source code to produce a list of tokens representing the source.
    * @return the first token in the list of tokens that were produced
@@ -446,13 +438,13 @@
       instrumentation.log();
     }
   }
-  
+
   /**
    * 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 substring of the source code between the start offset and the modified current
    * position. The current position is modified by adding the end delta.
@@ -463,13 +455,13 @@
    * @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();
-  
+
   /**
    * Record the fact that we are at the beginning of a new line in the source.
    */
@@ -724,7 +716,7 @@
     reportError(ScannerErrorCode.ILLEGAL_CHARACTER, [next]);
     return advance();
   }
-  
+
   /**
    * Return the beginning token corresponding to a closing brace that was found while scanning
    * inside a string interpolation expression. Tokens that cannot be matched with the closing brace
@@ -745,13 +737,13 @@
     return null;
   }
   Token firstToken() => _tokens.next;
-  
+
   /**
    * Return the source being scanned.
    * @return the source being scanned
    */
   Source get source => _source;
-  
+
   /**
    * Report an error at the current offset.
    * @param errorCode the error code indicating the nature of the error
@@ -1277,19 +1269,18 @@
     }
   }
 }
-
 /**
  * Instances of the class {@code StringToken} represent a token whose value is independent of it's
  * type.
  * @coverage dart.engine.parser
  */
 class StringToken extends Token {
-  
+
   /**
    * The lexeme represented by this token.
    */
   String _value2;
-  
+
   /**
    * Initialize a newly created token to represent a token of the given type with the given value.
    * @param type the type of the token
@@ -1302,29 +1293,28 @@
   String get lexeme => _value2;
   String value() => _value2;
 }
-
 /**
  * Instances of the class {@code CharBufferScanner} implement a scanner that reads from a character
  * buffer. The scanning logic is in the superclass.
  * @coverage dart.engine.parser
  */
 class CharBufferScanner extends AbstractScanner {
-  
+
   /**
    * The buffer from which characters will be read.
    */
   CharBuffer _buffer;
-  
+
   /**
    * The number of characters in the buffer.
    */
   int _bufferLength = 0;
-  
+
   /**
    * The index of the last character that was read.
    */
   int _charOffset = 0;
-  
+
   /**
    * Initialize a newly created scanner to scan the characters in the given character buffer.
    * @param source the source being scanned
@@ -1351,19 +1341,18 @@
     return _buffer.charAt(_charOffset + 1);
   }
 }
-
 /**
  * Instances of the class {@code TokenWithComment} represent a normal token that is preceded by
  * comments.
  * @coverage dart.engine.parser
  */
 class TokenWithComment extends Token {
-  
+
   /**
    * The first comment in the list of comments that precede this token.
    */
   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.
@@ -1376,34 +1365,33 @@
   }
   Token get precedingComments => _precedingComment;
 }
-
 /**
  * Instances of the class {@code 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.
  * @coverage dart.engine.parser
  */
 class Token {
-  
+
   /**
    * The type of the token.
    */
   TokenType _type;
-  
+
   /**
    * The offset from the beginning of the file to the first character in the token.
    */
   int _offset = 0;
-  
+
   /**
    * The previous token in the token stream.
    */
   Token _previous;
-  
+
   /**
    * The next token in the token stream.
    */
   Token _next;
-  
+
   /**
    * Initialize a newly created token to have the given type and offset.
    * @param type the type of the token
@@ -1413,7 +1401,7 @@
     this._type = type;
     this._offset = offset;
   }
-  
+
   /**
    * Return the offset from the beginning of the file to the character after last character of the
    * token.
@@ -1421,31 +1409,31 @@
    * 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 that represents this token
    */
   String get lexeme => _type.lexeme;
-  
+
   /**
    * Return the next token in the token stream.
    * @return the next token in the token stream
    */
   Token get next => _next;
-  
+
   /**
    * Return the offset from the beginning of the file to the first character in the token.
    * @return the offset from the beginning of the file to the first character in the token
    */
   int get offset => _offset;
-  
+
   /**
    * Return the first comment in the list of comments that precede this token, or {@code null} if
    * there are no comments preceding this token. Additional comments can be reached by following the
@@ -1453,25 +1441,25 @@
    * @return the first comment in the list of comments that precede this token
    */
   Token get precedingComments => null;
-  
+
   /**
    * Return the previous token in the token stream.
    * @return the previous token in the token stream
    */
   Token get previous => _previous;
-  
+
   /**
    * Return the type of the token.
    * @return the type of the token
    */
   TokenType get type => _type;
-  
+
   /**
    * Return {@code true} if this token represents an operator.
    * @return {@code true} if this token represents an operator
    */
   bool isOperator() => _type.isOperator();
-  
+
   /**
    * Return {@code 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
@@ -1479,13 +1467,13 @@
    * @return {@code true} if this token is a synthetic token
    */
   bool isSynthetic() => length == 0;
-  
+
   /**
    * Return {@code true} if this token represents an operator that can be defined by users.
    * @return {@code true} if this token represents an operator that can be defined by users
    */
   bool isUserDefinableOperator() => _type.isUserDefinableOperator();
-  
+
   /**
    * 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.
@@ -1497,7 +1485,7 @@
     token.previous = this;
     return token;
   }
-  
+
   /**
    * Set the next token in the token stream to the given token without changing which token is the
    * previous token for the given token.
@@ -1508,7 +1496,7 @@
     _next = token;
     return token;
   }
-  
+
   /**
    * Set the offset from the beginning of the file to the first character in the token to the given
    * offset.
@@ -1518,14 +1506,14 @@
     this._offset = offset2;
   }
   String toString() => lexeme;
-  
+
   /**
    * Return the value of this token. For keyword tokens, this is the keyword associated with the
    * token, for other tokens it is the lexeme associated with the token.
    * @return the value of this token
    */
   Object value() => _type.lexeme;
-  
+
   /**
    * Set the previous token in the token stream to the given token.
    * @param previous the previous token in the token stream
@@ -1534,34 +1522,33 @@
     this._previous = previous2;
   }
 }
-
 /**
  * Instances of the class {@code StringScanner} implement a scanner that reads from a string. The
  * scanning logic is in the superclass.
  * @coverage dart.engine.parser
  */
 class StringScanner extends AbstractScanner {
-  
+
   /**
    * The offset from the beginning of the file to the beginning of the source being scanned.
    */
   int _offsetDelta = 0;
-  
+
   /**
    * The string from which characters will be read.
    */
   String _string;
-  
+
   /**
    * The number of characters in the string.
    */
   int _stringLength = 0;
-  
+
   /**
    * The index, relative to the string, of the last character that was read.
    */
   int _charOffset = 0;
-  
+
   /**
    * Initialize a newly created scanner to scan the characters in the given string.
    * @param source the source being scanned
@@ -1575,7 +1562,7 @@
     this._charOffset = -1;
   }
   int get offset => _offsetDelta + _charOffset;
-  
+
   /**
    * Record that the source begins on the given line and column at the given offset. The line starts
    * for lines before the given line will not be correct.
@@ -1614,19 +1601,18 @@
     return _string.codeUnitAt(_charOffset + 1);
   }
 }
-
 /**
  * Instances of the class {@code BeginTokenWithComment} represent a begin token that is preceded by
  * comments.
  * @coverage dart.engine.parser
  */
 class BeginTokenWithComment extends BeginToken {
-  
+
   /**
    * The first comment in the list of comments that precede this token.
    */
   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.
@@ -1639,18 +1625,17 @@
   }
   Token get precedingComments => _precedingComment;
 }
-
 /**
  * Instances of the class {@code KeywordToken} represent a keyword in the language.
  * @coverage dart.engine.parser
  */
 class KeywordToken extends Token {
-  
+
   /**
    * The keyword being represented by this token.
    */
   Keyword _keyword;
-  
+
   /**
    * Initialize a newly created token to represent the given keyword.
    * @param keyword the keyword being represented by this token
@@ -1659,7 +1644,7 @@
   KeywordToken(Keyword keyword, int offset) : super(TokenType.KEYWORD, offset) {
     this._keyword = keyword;
   }
-  
+
   /**
    * Return the keyword being represented by this token.
    * @return the keyword being represented by this token
@@ -1668,19 +1653,18 @@
   String get lexeme => _keyword.syntax;
   Keyword value() => _keyword;
 }
-
 /**
  * Instances of the class {@code BeginToken} represent the opening half of a grouping pair of
  * tokens. This is used for curly brackets ('{'), parentheses ('('), and square brackets ('\[').
  * @coverage dart.engine.parser
  */
 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
@@ -1689,13 +1673,13 @@
   BeginToken(TokenType type, int offset) : super(type, offset) {
     assert((identical(type, TokenType.OPEN_CURLY_BRACKET) || identical(type, TokenType.OPEN_PAREN) || identical(type, TokenType.OPEN_SQUARE_BRACKET) || identical(type, TokenType.STRING_INTERPOLATION_EXPRESSION)));
   }
-  
+
   /**
    * Return the token that corresponds to this token.
    * @return the token that corresponds to this token
    */
   Token get endToken => _endToken;
-  
+
   /**
    * Set the token that corresponds to this token to the given token.
    * @param token the token that corresponds to this token
@@ -1704,118 +1688,117 @@
     this._endToken = token;
   }
 }
-
 /**
  * The enumeration {@code TokenClass} represents classes (or groups) of tokens with a similar use.
  * @coverage dart.engine.parser
  */
 class TokenClass implements Comparable<TokenClass> {
-  
+
   /**
    * A value used to indicate that the token type is not part of any specific class of token.
    */
   static final TokenClass NO_CLASS = new TokenClass.con1('NO_CLASS', 0);
-  
+
   /**
    * A value used to indicate that the token type is an additive operator.
    */
   static final TokenClass ADDITIVE_OPERATOR = new TokenClass.con2('ADDITIVE_OPERATOR', 1, 12);
-  
+
   /**
    * A value used to indicate that the token type is an assignment operator.
    */
   static final TokenClass ASSIGNMENT_OPERATOR = new TokenClass.con2('ASSIGNMENT_OPERATOR', 2, 1);
-  
+
   /**
    * A value used to indicate that the token type is a bitwise-and operator.
    */
   static final TokenClass BITWISE_AND_OPERATOR = new TokenClass.con2('BITWISE_AND_OPERATOR', 3, 8);
-  
+
   /**
    * A value used to indicate that the token type is a bitwise-or operator.
    */
   static final TokenClass BITWISE_OR_OPERATOR = new TokenClass.con2('BITWISE_OR_OPERATOR', 4, 6);
-  
+
   /**
    * A value used to indicate that the token type is a bitwise-xor operator.
    */
   static final TokenClass BITWISE_XOR_OPERATOR = new TokenClass.con2('BITWISE_XOR_OPERATOR', 5, 7);
-  
+
   /**
    * A value used to indicate that the token type is a cascade operator.
    */
   static final TokenClass CASCADE_OPERATOR = new TokenClass.con2('CASCADE_OPERATOR', 6, 2);
-  
+
   /**
    * A value used to indicate that the token type is a conditional operator.
    */
   static final TokenClass CONDITIONAL_OPERATOR = new TokenClass.con2('CONDITIONAL_OPERATOR', 7, 3);
-  
+
   /**
    * A value used to indicate that the token type is an equality operator.
    */
   static final TokenClass EQUALITY_OPERATOR = new TokenClass.con2('EQUALITY_OPERATOR', 8, 9);
-  
+
   /**
    * A value used to indicate that the token type is a logical-and operator.
    */
   static final TokenClass LOGICAL_AND_OPERATOR = new TokenClass.con2('LOGICAL_AND_OPERATOR', 9, 5);
-  
+
   /**
    * A value used to indicate that the token type is a logical-or operator.
    */
   static final TokenClass LOGICAL_OR_OPERATOR = new TokenClass.con2('LOGICAL_OR_OPERATOR', 10, 4);
-  
+
   /**
    * A value used to indicate that the token type is a multiplicative operator.
    */
   static final TokenClass MULTIPLICATIVE_OPERATOR = new TokenClass.con2('MULTIPLICATIVE_OPERATOR', 11, 13);
-  
+
   /**
    * A value used to indicate that the token type is a relational operator.
    */
   static final TokenClass RELATIONAL_OPERATOR = new TokenClass.con2('RELATIONAL_OPERATOR', 12, 10);
-  
+
   /**
    * A value used to indicate that the token type is a shift operator.
    */
   static final TokenClass SHIFT_OPERATOR = new TokenClass.con2('SHIFT_OPERATOR', 13, 11);
-  
+
   /**
    * A value used to indicate that the token type is a unary operator.
    */
   static final TokenClass UNARY_POSTFIX_OPERATOR = new TokenClass.con2('UNARY_POSTFIX_OPERATOR', 14, 15);
-  
+
   /**
    * A value used to indicate that the token type is a unary operator.
    */
   static final TokenClass UNARY_PREFIX_OPERATOR = new TokenClass.con2('UNARY_PREFIX_OPERATOR', 15, 14);
   static final List<TokenClass> values = [NO_CLASS, ADDITIVE_OPERATOR, ASSIGNMENT_OPERATOR, BITWISE_AND_OPERATOR, BITWISE_OR_OPERATOR, BITWISE_XOR_OPERATOR, CASCADE_OPERATOR, CONDITIONAL_OPERATOR, EQUALITY_OPERATOR, LOGICAL_AND_OPERATOR, LOGICAL_OR_OPERATOR, MULTIPLICATIVE_OPERATOR, RELATIONAL_OPERATOR, SHIFT_OPERATOR, UNARY_POSTFIX_OPERATOR, UNARY_PREFIX_OPERATOR];
-  
+
   /// The name of this enum constant, as declared in the enum declaration.
   final String name;
-  
+
   /// The position in the enum declaration.
   final int ordinal;
-  
+
   /**
    * The precedence of tokens of this class, or {@code 0} if the such tokens do not represent an
    * operator.
    */
   int _precedence = 0;
   TokenClass.con1(this.name, this.ordinal) {
-    _jtd_constructor_326_impl();
+    _jtd_constructor_328_impl();
   }
-  _jtd_constructor_326_impl() {
-    _jtd_constructor_327_impl(0);
+  _jtd_constructor_328_impl() {
+    _jtd_constructor_329_impl(0);
   }
   TokenClass.con2(this.name, this.ordinal, int precedence2) {
-    _jtd_constructor_327_impl(precedence2);
+    _jtd_constructor_329_impl(precedence2);
   }
-  _jtd_constructor_327_impl(int precedence2) {
+  _jtd_constructor_329_impl(int precedence2) {
     this._precedence = precedence2;
   }
-  
+
   /**
    * Return the precedence of tokens of this class, or {@code 0} if the such tokens do not represent
    * an operator.
@@ -1825,19 +1808,18 @@
   int compareTo(TokenClass other) => ordinal - other.ordinal;
   String toString() => name;
 }
-
 /**
  * Instances of the class {@code KeywordTokenWithComment} implement a keyword token that is preceded
  * by comments.
  * @coverage dart.engine.parser
  */
 class KeywordTokenWithComment extends KeywordToken {
-  
+
   /**
    * The first comment in the list of comments that precede this token.
    */
   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.
@@ -1850,14 +1832,13 @@
   }
   Token get precedingComments => _precedingComment;
 }
-
 /**
  * The enumeration {@code TokenType} defines the types of tokens that can be returned by the
  * scanner.
  * @coverage dart.engine.parser
  */
 class TokenType implements Comparable<TokenType> {
-  
+
   /**
    * The type of the token that marks the end of the input.
    */
@@ -1930,62 +1911,62 @@
   static final TokenType BACKSLASH = new TokenType.con2('BACKSLASH', 66, null, "\\");
   static final TokenType PERIOD_PERIOD_PERIOD = new TokenType.con2('PERIOD_PERIOD_PERIOD', 67, null, "...");
   static final List<TokenType> values = [EOF, DOUBLE, HEXADECIMAL, IDENTIFIER, INT, KEYWORD, MULTI_LINE_COMMENT, SCRIPT_TAG, SINGLE_LINE_COMMENT, STRING, AMPERSAND, AMPERSAND_AMPERSAND, AMPERSAND_EQ, AT, BANG, BANG_EQ, BAR, BAR_BAR, BAR_EQ, COLON, COMMA, CARET, CARET_EQ, CLOSE_CURLY_BRACKET, CLOSE_PAREN, CLOSE_SQUARE_BRACKET, EQ, EQ_EQ, FUNCTION, GT, GT_EQ, GT_GT, GT_GT_EQ, HASH, INDEX, INDEX_EQ, IS, LT, LT_EQ, LT_LT, LT_LT_EQ, MINUS, MINUS_EQ, MINUS_MINUS, OPEN_CURLY_BRACKET, OPEN_PAREN, OPEN_SQUARE_BRACKET, PERCENT, PERCENT_EQ, PERIOD, PERIOD_PERIOD, PLUS, PLUS_EQ, PLUS_PLUS, QUESTION, SEMICOLON, SLASH, SLASH_EQ, STAR, STAR_EQ, STRING_INTERPOLATION_EXPRESSION, STRING_INTERPOLATION_IDENTIFIER, TILDE, TILDE_SLASH, TILDE_SLASH_EQ, BACKPING, BACKSLASH, PERIOD_PERIOD_PERIOD];
-  
+
   /// The name of this enum constant, as declared in the enum declaration.
   final String name;
-  
+
   /// The position in the enum declaration.
   final int ordinal;
-  
+
   /**
    * The class of the token.
    */
   TokenClass _tokenClass;
-  
+
   /**
    * The lexeme that defines this type of token, or {@code null} if there is more than one possible
    * lexeme for this type of token.
    */
   String _lexeme;
   TokenType.con1(this.name, this.ordinal) {
-    _jtd_constructor_328_impl();
+    _jtd_constructor_330_impl();
   }
-  _jtd_constructor_328_impl() {
-    _jtd_constructor_329_impl(TokenClass.NO_CLASS, null);
+  _jtd_constructor_330_impl() {
+    _jtd_constructor_331_impl(TokenClass.NO_CLASS, null);
   }
   TokenType.con2(this.name, this.ordinal, TokenClass tokenClass2, String lexeme2) {
-    _jtd_constructor_329_impl(tokenClass2, lexeme2);
+    _jtd_constructor_331_impl(tokenClass2, lexeme2);
   }
-  _jtd_constructor_329_impl(TokenClass tokenClass2, String lexeme2) {
+  _jtd_constructor_331_impl(TokenClass tokenClass2, String lexeme2) {
     this._tokenClass = tokenClass2 == null ? TokenClass.NO_CLASS : tokenClass2;
     this._lexeme = lexeme2;
   }
-  
+
   /**
    * Return the lexeme that defines this type of token, or {@code null} if there is more than one
    * possible lexeme for this type of token.
    * @return the lexeme that defines this type of token
    */
   String get lexeme => _lexeme;
-  
+
   /**
    * Return the precedence of the token, or {@code 0} if the token does not represent an operator.
    * @return the precedence of the token
    */
   int get precedence => _tokenClass.precedence;
-  
+
   /**
    * Return {@code true} if this type of token represents an additive operator.
    * @return {@code true} if this type of token represents an additive operator
    */
   bool isAdditiveOperator() => identical(_tokenClass, TokenClass.ADDITIVE_OPERATOR);
-  
+
   /**
    * Return {@code true} if this type of token represents an assignment operator.
    * @return {@code true} if this type of token represents an assignment operator
    */
   bool isAssignmentOperator() => identical(_tokenClass, TokenClass.ASSIGNMENT_OPERATOR);
-  
+
   /**
    * Return {@code true} if this type of token represents an associative operator. An associative
    * operator is an operator for which the following equality is true:{@code (a * b) * c == a * (b * c)}. In other words, if the result of applying the operator to
@@ -1997,55 +1978,55 @@
    * @return {@code true} if this type of token represents an associative operator
    */
   bool isAssociativeOperator() => identical(this, AMPERSAND) || identical(this, AMPERSAND_AMPERSAND) || identical(this, BAR) || identical(this, BAR_BAR) || identical(this, CARET) || identical(this, PLUS) || identical(this, STAR);
-  
+
   /**
    * Return {@code true} if this type of token represents an equality operator.
    * @return {@code true} if this type of token represents an equality operator
    */
   bool isEqualityOperator() => identical(_tokenClass, TokenClass.EQUALITY_OPERATOR);
-  
+
   /**
    * Return {@code true} if this type of token represents an increment operator.
    * @return {@code true} if this type of token represents an increment operator
    */
   bool isIncrementOperator() => identical(_lexeme, "++") || identical(_lexeme, "--");
-  
+
   /**
    * Return {@code true} if this type of token represents a multiplicative operator.
    * @return {@code true} if this type of token represents a multiplicative operator
    */
   bool isMultiplicativeOperator() => identical(_tokenClass, TokenClass.MULTIPLICATIVE_OPERATOR);
-  
+
   /**
    * Return {@code true} if this token type represents an operator.
    * @return {@code true} if this token type represents an operator
    */
   bool isOperator() => _tokenClass != TokenClass.NO_CLASS && this != OPEN_PAREN && this != OPEN_SQUARE_BRACKET && this != PERIOD;
-  
+
   /**
    * Return {@code true} if this type of token represents a relational operator.
    * @return {@code true} if this type of token represents a relational operator
    */
   bool isRelationalOperator() => identical(_tokenClass, TokenClass.RELATIONAL_OPERATOR);
-  
+
   /**
    * Return {@code true} if this type of token represents a shift operator.
    * @return {@code true} if this type of token represents a shift operator
    */
   bool isShiftOperator() => identical(_tokenClass, TokenClass.SHIFT_OPERATOR);
-  
+
   /**
    * Return {@code true} if this type of token represents a unary postfix operator.
    * @return {@code true} if this type of token represents a unary postfix operator
    */
   bool isUnaryPostfixOperator() => identical(_tokenClass, TokenClass.UNARY_POSTFIX_OPERATOR);
-  
+
   /**
    * Return {@code true} if this type of token represents a unary prefix operator.
    * @return {@code true} if this type of token represents a unary prefix operator
    */
   bool isUnaryPrefixOperator() => identical(_tokenClass, TokenClass.UNARY_PREFIX_OPERATOR);
-  
+
   /**
    * Return {@code true} if this token type represents an operator that can be defined by users.
    * @return {@code true} if this token type represents an operator that can be defined by users
diff --git a/pkg/analyzer_experimental/lib/src/generated/sdk.dart b/pkg/analyzer_experimental/lib/src/generated/sdk.dart
index f988973..ca85cf4 100644
--- a/pkg/analyzer_experimental/lib/src/generated/sdk.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/sdk.dart
@@ -1,125 +1,120 @@
 // 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.sdk;
-
 import 'java_core.dart';
 import 'java_engine.dart';
 import 'source.dart' show ContentCache, Source, UriKind;
 import 'engine.dart' show AnalysisContext;
-
-
 /**
  * Represents a single library in the SDK
  */
 abstract class SdkLibrary {
-  
+
   /**
    * Return the name of the category containing the library.
    * @return the name of the category containing the library
    */
   String get category;
-  
+
   /**
    * Return the path to the file defining the library. The path is relative to the {@code lib}directory within the SDK.
    * @return the path to the file defining the library
    */
   String get path;
-  
+
   /**
    * Return the short name of the library. This is the name used after {@code dart:} in a URI.
    * @return the short name of the library
    */
   String get shortName;
-  
+
   /**
    * Return {@code true} if this library can be compiled to JavaScript by dart2js.
    * @return {@code true} if this library can be compiled to JavaScript by dart2js
    */
   bool isDart2JsLibrary();
-  
+
   /**
    * Return {@code true} if the library is documented.
    * @return {@code true} if the library is documented
    */
   bool isDocumented();
-  
+
   /**
    * Return {@code true} if the library is an implementation library.
    * @return {@code true} if the library is an implementation library
    */
   bool isImplementation();
-  
+
   /**
    * Return {@code true} if library is internal can be used only by other SDK libraries.
    * @return {@code true} if library is internal can be used only by other SDK libraries
    */
   bool isInternal();
-  
+
   /**
    * Return {@code true} if library can be used for both client and server.
    * @return {@code true} if this library can be used for both client and server.
    */
   bool isShared();
-  
+
   /**
    * Return {@code true} if this library can be run on the VM.
    * @return {@code true} if this library can be run on the VM
    */
   bool isVmLibrary();
 }
-
 /**
  * Instances of the class {@code SdkLibrary} represent the information known about a single library
  * within the SDK.
  * @coverage dart.engine.sdk
  */
 class SdkLibraryImpl implements SdkLibrary {
-  
+
   /**
    * The short name of the library. This is the name used after {@code dart:} in a URI.
    */
   String _shortName = null;
-  
+
   /**
    * The path to the file defining the library. The path is relative to the {@code lib} directory
    * within the SDK.
    */
   String _path = null;
-  
+
   /**
    * The name of the category containing the library. Unless otherwise specified in the libraries
    * file all libraries are assumed to be shared between server and client.
    */
   String _category = "Shared";
-  
+
   /**
    * A flag indicating whether the library is documented.
    */
   bool _documented = true;
-  
+
   /**
    * A flag indicating whether the library is an implementation library.
    */
   bool _implementation = false;
-  
+
   /**
    * An encoding of which platforms this library is intended to work on.
    */
   int _platforms = 0;
-  
+
   /**
    * The bit mask used to access the bit representing the flag indicating whether a library is
    * intended to work on the dart2js platform.
    */
   static int DART2JS_PLATFORM = 1;
-  
+
   /**
    * The bit mask used to access the bit representing the flag indicating whether a library is
    * intended to work on the VM platform.
    */
   static int VM_PLATFORM = 2;
-  
+
   /**
    * Initialize a newly created library to represent the library with the given name.
    * @param name the short name of the library
@@ -134,18 +129,18 @@
   bool isDocumented() => _documented;
   bool isImplementation() => _implementation;
   bool isInternal() => "Internal" == _category;
-  
+
   /**
    * Return {@code true} if library can be used for both client and server
    */
   bool isShared() => _category == "Shared";
-  
+
   /**
    * Return {@code true} if this library can be run on the VM.
    * @return {@code true} if this library can be run on the VM
    */
   bool isVmLibrary() => (_platforms & VM_PLATFORM) != 0;
-  
+
   /**
    * Set the name of the category containing the library to the given name.
    * @param category the name of the category containing the library
@@ -153,14 +148,14 @@
   void set category(String category2) {
     this._category = category2;
   }
-  
+
   /**
    * Record that this library can be compiled to JavaScript by dart2js.
    */
   void setDart2JsLibrary() {
     _platforms |= DART2JS_PLATFORM;
   }
-  
+
   /**
    * Set whether the library is documented to match the given value.
    * @param documented {@code true} if the library is documented
@@ -168,7 +163,7 @@
   void set documented(bool documented2) {
     this._documented = documented2;
   }
-  
+
   /**
    * Set whether the library is an implementation library to match the given value.
    * @param implementation {@code true} if the library is an implementation library
@@ -176,7 +171,7 @@
   void set implementation(bool implementation2) {
     this._implementation = implementation2;
   }
-  
+
   /**
    * Set the path to the file defining the library to the given path. The path is relative to the{@code lib} directory within the SDK.
    * @param path the path to the file defining the library
@@ -184,7 +179,7 @@
   void set path(String path2) {
     this._path = path2;
   }
-  
+
   /**
    * Record that this library can be run on the VM.
    */
@@ -192,37 +187,36 @@
     _platforms |= VM_PLATFORM;
   }
 }
-
 /**
  * Instances of the class {@code LibraryMap} map Dart library URI's to the {@link SdkLibraryImpllibrary}.
  * @coverage dart.engine.sdk
  */
 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 {@code 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 {@link 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 {@code null} if the URI does not map to a library.
    * @param dartUri the URI of the library to be returned
@@ -231,35 +225,34 @@
   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 {@code DartSdk} represent a Dart SDK installed in a specified location.
  * @coverage dart.engine.sdk
  */
 abstract class DartSdk {
-  
+
   /**
    * The short name of the dart SDK core library.
    */
-  static String DART_CORE = "dart:core";
-  
+  static final String DART_CORE = "dart:core";
+
   /**
    * The short name of the dart SDK html library.
    */
-  static String DART_HTML = "dart:html";
-  
+  static final String DART_HTML = "dart:html";
+
   /**
    * The version number that is returned when the real version number could not be determined.
    */
-  static String DEFAULT_VERSION = "0";
-  
+  static final String DEFAULT_VERSION = "0";
+
   /**
    * Return the source representing the file with the given URI.
    * @param contentCache the content cache used to access the contents of the mapped source
@@ -269,39 +262,39 @@
    * @return the source representing the specified file
    */
   Source fromEncoding(ContentCache contentCache, UriKind kind, Uri uri);
-  
+
   /**
    * Return the {@link AnalysisContext} used for all of the sources in this {@link DartSdk}.
    * @return the {@link AnalysisContext} used for all of the sources in this {@link 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 {@code dart:} URI, or {@code 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 {@code "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 {@code dart:} URI, or {@code null} if
    * the given URI does not denote a library in this SDK.
diff --git a/pkg/analyzer_experimental/lib/src/generated/sdk_io.dart b/pkg/analyzer_experimental/lib/src/generated/sdk_io.dart
index afba118..e289af5 100644
--- a/pkg/analyzer_experimental/lib/src/generated/sdk_io.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/sdk_io.dart
@@ -1,8 +1,6 @@
 // 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.sdk.io;
-
 import 'dart:io';
 import 'java_core.dart';
 import 'java_io.dart';
@@ -15,123 +13,121 @@
 import 'parser.dart';
 import 'sdk.dart';
 import 'engine.dart';
-
-
 /**
  * Instances of the class {@code DirectoryBasedDartSdk} represent a Dart SDK installed in a
  * specified directory.
  * @coverage dart.engine.sdk
  */
 class DirectoryBasedDartSdk implements DartSdk {
-  
+
   /**
    * The {@link AnalysisContext} which is used for all of the sources in this {@link DartSdk}.
    */
   InternalAnalysisContext _analysisContext;
-  
+
   /**
    * The directory containing the SDK.
    */
   JavaFile _sdkDirectory;
-  
+
   /**
    * The revision number of this SDK, or {@code "0"} if the revision number cannot be discovered.
    */
   String _sdkVersion;
-  
+
   /**
    * The file containing the Dartium executable.
    */
   JavaFile _dartiumExecutable;
-  
+
   /**
    * The file containing the VM executable.
    */
   JavaFile _vmExecutable;
-  
+
   /**
    * A mapping from Dart library URI's to the library represented by that URI.
    */
   LibraryMap _libraryMap;
-  
+
   /**
    * The name of the directory within the SDK directory that contains executables.
    */
   static String _BIN_DIRECTORY_NAME = "bin";
-  
+
   /**
    * The name of the directory within the SDK directory that contains Chromium.
    */
   static String _CHROMIUM_DIRECTORY_NAME = "chromium";
-  
+
   /**
    * The name of the environment variable whose value is the path to the default Dart SDK directory.
    */
   static String _DART_SDK_ENVIRONMENT_VARIABLE_NAME = "DART_SDK";
-  
+
   /**
    * The name of the file containing the Dartium executable on Linux.
    */
   static String _DARTIUM_EXECUTABLE_NAME_LINUX = "chrome";
-  
+
   /**
    * The name of the file containing the Dartium executable on Macintosh.
    */
   static String _DARTIUM_EXECUTABLE_NAME_MAC = "Chromium.app/Contents/MacOS/Chromium";
-  
+
   /**
    * The name of the file containing the Dartium executable on Windows.
    */
   static String _DARTIUM_EXECUTABLE_NAME_WIN = "Chrome.exe";
-  
+
   /**
    * The name of the {@link System} property whose value is the path to the default Dart SDK
    * directory.
    */
   static String _DEFAULT_DIRECTORY_PROPERTY_NAME = "com.google.dart.sdk";
-  
+
   /**
    * The name of the directory within the SDK directory that contains documentation for the
    * libraries.
    */
   static String _DOCS_DIRECTORY_NAME = "docs";
-  
+
   /**
    * The suffix added to the name of a library to derive the name of the file containing the
    * documentation for that library.
    */
   static String _DOC_FILE_SUFFIX = "_api.json";
-  
+
   /**
    * The name of the directory within the SDK directory that contains the libraries file.
    */
   static String _INTERNAL_DIR = "_internal";
-  
+
   /**
    * The name of the directory within the SDK directory that contains the libraries.
    */
   static String _LIB_DIRECTORY_NAME = "lib";
-  
+
   /**
    * The name of the libraries file.
    */
   static String _LIBRARIES_FILE = "libraries.dart";
-  
+
   /**
    * The name of the file within the SDK directory that contains the revision number of the SDK.
    */
   static String _REVISION_FILE_NAME = "revision";
-  
+
   /**
    * The name of the file containing the VM executable on the Windows operating system.
    */
   static String _VM_EXECUTABLE_NAME_WIN = "dart.exe";
-  
+
   /**
    * The name of the file containing the VM executable on non-Windows operating systems.
    */
   static String _VM_EXECUTABLE_NAME = "dart";
-  
+
   /**
    * Return the default Dart SDK, or {@code null} if the directory containing the default SDK cannot
    * be determined (or does not exist).
@@ -144,7 +140,7 @@
     }
     return new DirectoryBasedDartSdk(sdkDirectory);
   }
-  
+
   /**
    * Return the default directory for the Dart SDK, or {@code null} if the directory cannot be
    * determined (or does not exist). The default directory is provided by a {@link System} property
@@ -166,7 +162,7 @@
     }
     return sdkDirectory;
   }
-  
+
   /**
    * Initialize a newly created SDK to represent the Dart SDK installed in the given directory.
    * @param sdkDirectory the directory containing the SDK
@@ -186,7 +182,7 @@
   }
   Source fromEncoding(ContentCache contentCache, UriKind kind, Uri uri) => new FileBasedSource.con2(contentCache, new JavaFile.fromUri(uri), kind);
   AnalysisContext get context => _analysisContext;
-  
+
   /**
    * Return the file containing the Dartium executable, or {@code null} if it does not exist.
    * @return the file containing the Dartium executable
@@ -202,26 +198,26 @@
     }
     return _dartiumExecutable;
   }
-  
+
   /**
    * Return the directory where dartium can be found in the Dart SDK (the directory that will be the
    * working directory is Dartium is invoked without changing the default).
    * @return the directory where dartium can be found
    */
   JavaFile get dartiumWorkingDirectory => new JavaFile.relative(_sdkDirectory.getParentFile(), _CHROMIUM_DIRECTORY_NAME);
-  
+
   /**
    * Return the directory containing the SDK.
    * @return the directory containing the SDK
    */
   JavaFile get directory => _sdkDirectory;
-  
+
   /**
    * Return the directory containing documentation for the SDK.
    * @return the SDK's documentation directory
    */
   JavaFile get docDirectory => new JavaFile.relative(_sdkDirectory, _DOCS_DIRECTORY_NAME);
-  
+
   /**
    * Return the auxiliary documentation file for the given library, or {@code null} if no such file
    * exists.
@@ -241,7 +237,7 @@
     }
     return null;
   }
-  
+
   /**
    * Return the directory within the SDK directory that contains the libraries.
    * @return the directory that contains the libraries
@@ -249,7 +245,7 @@
   JavaFile get libraryDirectory => new JavaFile.relative(_sdkDirectory, _LIB_DIRECTORY_NAME);
   List<SdkLibrary> get sdkLibraries => _libraryMap.sdkLibraries;
   SdkLibrary getSdkLibrary(String dartUri) => _libraryMap.getLibrary(dartUri);
-  
+
   /**
    * Return the revision number of this SDK, or {@code "0"} if the revision number cannot be
    * discovered.
@@ -271,13 +267,13 @@
     }
     return _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 => _libraryMap.uris;
-  
+
   /**
    * Return the file containing the VM executable, or {@code null} if it does not exist.
    * @return the file containing the VM executable
@@ -293,13 +289,13 @@
     }
     return _vmExecutable;
   }
-  
+
   /**
    * Return {@code true} if this SDK includes documentation.
    * @return {@code true} if this installation of the SDK has documentation
    */
   bool hasDocumentation() => docDirectory.exists();
-  
+
   /**
    * Return {@code true} if the Dartium binary is available.
    * @return {@code true} if the Dartium binary is available
@@ -312,14 +308,14 @@
     }
     return new FileBasedSource.con2(contentCache, new JavaFile.relative(libraryDirectory, library.path), UriKind.DART_URI);
   }
-  
+
   /**
    * Ensure that the dart VM is executable. If it is not, make it executable and log that it was
    * necessary for us to do so.
    */
   void ensureVmIsExecutable() {
   }
-  
+
   /**
    * Return the name of the file containing the VM executable.
    * @return the name of the file containing the VM executable
@@ -331,7 +327,7 @@
       return _VM_EXECUTABLE_NAME;
     }
   }
-  
+
   /**
    * Return the name of the file containing the Dartium executable.
    * @return the name of the file containing the Dartium executable
@@ -345,7 +341,7 @@
       return _DARTIUM_EXECUTABLE_NAME_LINUX;
     }
   }
-  
+
   /**
    * Read all of the configuration files to initialize the library maps.
    */
@@ -359,7 +355,7 @@
       _libraryMap = new LibraryMap();
     }
   }
-  
+
   /**
    * Initialize the state of the SDK.
    */
@@ -369,7 +365,6 @@
     }
   }
 }
-
 /**
  * Instances of the class {@code SdkLibrariesReader} read and parse the libraries file
  * (dart-sdk/lib/_internal/libraries.dart) for information about the libraries in an SDK. The
@@ -393,7 +388,7 @@
  * @coverage dart.engine.sdk
  */
 class SdkLibrariesReader {
-  
+
   /**
    * Return the library map read from the given source.
    * @return the library map read from the given source
@@ -413,47 +408,47 @@
   }
 }
 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 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 {@link #PLATFORMS platforms} parameter used to specify that the library can
    * be used on the VM.
    */
   static String _VM_PLATFORM = "VM_PLATFORM";
-  
+
   /**
    * The library map that is populated by visiting the AST structure parsed from the contents of
    * the libraries file.
    */
   LibraryMap _librariesMap = new LibraryMap();
-  
+
   /**
    * Return the library map that was populated by visiting the AST structure parsed from the
    * contents of the libraries file.
diff --git a/pkg/analyzer_experimental/lib/src/generated/source.dart b/pkg/analyzer_experimental/lib/src/generated/source.dart
index 456b0e8..1fec215 100644
--- a/pkg/analyzer_experimental/lib/src/generated/source.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/source.dart
@@ -1,58 +1,54 @@
 // 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.source;
-
 import 'java_core.dart';
 import 'sdk.dart' show DartSdk;
 import 'engine.dart' show AnalysisContext;
-
-
 /**
  * Instances of the class {@code SourceFactory} resolve possibly relative URI's against an existing{@link Source source}.
  * @coverage dart.engine.source
  */
 class SourceFactory {
-  
+
   /**
    * The analysis context that this source factory is associated with.
    */
   AnalysisContext _context;
-  
+
   /**
    * The resolvers used to resolve absolute URI's.
    */
   List<UriResolver> _resolvers;
-  
+
   /**
    * A cache of content used to override the default content of a source.
    */
   ContentCache _contentCache;
-  
+
   /**
    * Initialize a newly created source factory.
    * @param contentCache the cache holding content used to override the default content of a source
    * @param resolvers the resolvers used to resolve absolute URI's
    */
   SourceFactory.con1(ContentCache contentCache2, List<UriResolver> resolvers2) {
-    _jtd_constructor_340_impl(contentCache2, resolvers2);
+    _jtd_constructor_342_impl(contentCache2, resolvers2);
   }
-  _jtd_constructor_340_impl(ContentCache contentCache2, List<UriResolver> resolvers2) {
+  _jtd_constructor_342_impl(ContentCache contentCache2, List<UriResolver> resolvers2) {
     this._contentCache = contentCache2;
     this._resolvers = resolvers2;
   }
-  
+
   /**
    * Initialize a newly created source factory.
    * @param resolvers the resolvers used to resolve absolute URI's
    */
   SourceFactory.con2(List<UriResolver> resolvers) {
-    _jtd_constructor_341_impl(resolvers);
+    _jtd_constructor_343_impl(resolvers);
   }
-  _jtd_constructor_341_impl(List<UriResolver> resolvers) {
-    _jtd_constructor_340_impl(new ContentCache(), resolvers);
+  _jtd_constructor_343_impl(List<UriResolver> resolvers) {
+    _jtd_constructor_342_impl(new ContentCache(), resolvers);
   }
-  
+
   /**
    * Return a source object representing the given absolute URI, or {@code null} if the URI is not a
    * valid URI or if it is not an absolute URI.
@@ -69,7 +65,7 @@
     }
     return null;
   }
-  
+
   /**
    * Return a source object that is equal to the source object used to obtain the given encoding.
    * @param encoding the encoding of a source object
@@ -98,19 +94,19 @@
       throw new IllegalArgumentException("Invalid URI in encoding");
     }
   }
-  
+
   /**
    * Return a cache of content used to override the default content of a source.
    * @return a cache of content used to override the default content of a source
    */
   ContentCache get contentCache => _contentCache;
-  
+
   /**
    * Return the analysis context that this source factory is associated with.
    * @return the analysis context that this source factory is associated with
    */
   AnalysisContext get context => _context;
-  
+
   /**
    * Return the {@link DartSdk} associated with this {@link SourceFactory}, or {@code null} if there
    * is no such SDK.
@@ -126,7 +122,7 @@
     }
     return null;
   }
-  
+
   /**
    * Return a source object representing the URI that results from resolving the given (possibly
    * relative) contained URI against the URI associated with an existing source object, or{@code null} if either the contained URI is invalid or if it cannot be resolved against the
@@ -142,7 +138,7 @@
       return null;
     }
   }
-  
+
   /**
    * Return an absolute URI that represents the given source.
    * @param source the source to get URI for
@@ -157,7 +153,7 @@
     }
     return null;
   }
-  
+
   /**
    * 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 {@code null} the override is removed so
@@ -168,7 +164,7 @@
   void setContents(Source source, String contents) {
     _contentCache.setContents(source, contents);
   }
-  
+
   /**
    * Set the analysis context that this source factory is associated with to the given context.
    * <p>
@@ -179,7 +175,7 @@
   void set context(AnalysisContext context2) {
     this._context = context2;
   }
-  
+
   /**
    * Return the contents of the given source, or {@code null} if this factory does not override the
    * contents of the source.
@@ -189,7 +185,7 @@
    * @return the contents of the given source
    */
   String getContents(Source source) => _contentCache.getContents(source);
-  
+
   /**
    * Return the modification stamp of the given source, or {@code null} if this factory does not
    * override the contents of the source.
@@ -199,7 +195,7 @@
    * @return the modification stamp of the given source
    */
   int getModificationStamp(Source source) => _contentCache.getModificationStamp(source);
-  
+
   /**
    * Return a source object representing the URI that results from resolving the given (possibly
    * relative) contained URI against the URI associated with an existing source object, or{@code null} if either the contained URI is invalid or if it cannot be resolved against the
@@ -222,7 +218,6 @@
     }
   }
 }
-
 /**
  * The abstract class {@code 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
@@ -230,7 +225,7 @@
  * @coverage dart.engine.source
  */
 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{@link Source source} representing the file to which it was resolved, or {@code null} if it
@@ -242,7 +237,7 @@
    * @return a {@link Source source} representing the file to which given URI was resolved
    */
   Source fromEncoding(ContentCache contentCache, UriKind kind, Uri uri);
-  
+
   /**
    * Resolve the given absolute URI. Return a {@link Source source} representing the file to which
    * it was resolved, or {@code null} if it could not be resolved.
@@ -251,7 +246,7 @@
    * @return a {@link Source source} representing the file to which given URI was resolved
    */
   Source resolveAbsolute(ContentCache contentCache, Uri uri);
-  
+
   /**
    * Return an absolute URI that represents the given source.
    * @param source the source to get URI for
@@ -259,19 +254,18 @@
    */
   Uri restoreAbsolute(Source source) => null;
 }
-
 /**
  * The interface {@code Source} defines the behavior of objects representing source code that can be
  * compiled.
  * @coverage dart.engine.source
  */
 abstract class Source {
-  
+
   /**
    * An empty array of sources.
    */
-  static List<Source> EMPTY_ARRAY = new List<Source>(0);
-  
+  static final List<Source> EMPTY_ARRAY = new List<Source>(0);
+
   /**
    * Return {@code true} if the given object is a source that represents the same source code as
    * this source.
@@ -281,13 +275,13 @@
    * @see Object#equals(Object)
    */
   bool operator ==(Object object);
-  
+
   /**
    * Return {@code true} if this source exists.
    * @return {@code true} if this source exists
    */
   bool exists();
-  
+
   /**
    * Get the contents of this source and pass it to the given receiver. Exactly one of the methods
    * defined on the receiver will be invoked unless an exception is thrown. The method that will be
@@ -297,7 +291,7 @@
    * @throws Exception if the contents of this source could not be accessed
    */
   void getContents(Source_ContentReceiver receiver);
-  
+
   /**
    * Return an encoded representation of this source that can be used to create a source that is
    * equal to this source.
@@ -305,7 +299,7 @@
    * @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
@@ -313,7 +307,7 @@
    * @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
@@ -323,14 +317,14 @@
    * @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
@@ -339,20 +333,20 @@
    * @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()
    */
   int get hashCode;
-  
+
   /**
    * Return {@code true} if this source is in one of the system libraries.
    * @return {@code true} if this is in a system library
    */
   bool isInSystemLibrary();
-  
+
   /**
    * Resolve the relative URI against the URI associated with this source object. Return a{@link Source source} representing the URI to which it was resolved, or {@code null} if it
    * could not be resolved.
@@ -367,20 +361,19 @@
    */
   Source resolveRelative(Uri relativeUri);
 }
-
 /**
  * The interface {@code ContentReceiver} defines the behavior of objects that can receive the
  * content of a source.
  */
 abstract class Source_ContentReceiver {
-  
+
   /**
    * Accept the contents of a source represented as a character buffer.
    * @param contents the contents of the source
    * @param modificationTime the time at which the contents were last set
    */
   void accept(CharBuffer contents, int modificationTime);
-  
+
   /**
    * Accept the contents of a source represented as a string.
    * @param contents the contents of the source
@@ -388,30 +381,29 @@
    */
   void accept2(String contents, int modificationTime);
 }
-
 /**
  * The enumeration {@code SourceKind} defines the different kinds of sources that are known to the
  * analysis engine.
  * @coverage dart.engine.source
  */
 class SourceKind implements Comparable<SourceKind> {
-  
+
   /**
    * A source containing HTML. The HTML might or might not contain Dart scripts.
    */
   static final SourceKind HTML = new SourceKind('HTML', 0);
-  
+
   /**
    * A Dart compilation unit that is not a part of another library. Libraries might or might not
    * contain any directives, including a library directive.
    */
   static final SourceKind LIBRARY = new SourceKind('LIBRARY', 1);
-  
+
   /**
    * A Dart compilation unit that is part of another library. Parts contain a part-of directive.
    */
   static final SourceKind PART = new SourceKind('PART', 2);
-  
+
   /**
    * An unknown kind of source. Used both when it is not possible to identify the kind of a source
    * and also when the kind of a source is not known without performing a computation and the client
@@ -419,10 +411,10 @@
    */
   static final SourceKind UNKNOWN = new SourceKind('UNKNOWN', 3);
   static final List<SourceKind> values = [HTML, LIBRARY, PART, UNKNOWN];
-  
+
   /// The name of this enum constant, as declared in the enum declaration.
   final String name;
-  
+
   /// The position in the enum declaration.
   final int ordinal;
   SourceKind(this.name, this.ordinal) {
@@ -430,41 +422,40 @@
   int compareTo(SourceKind other) => ordinal - other.ordinal;
   String toString() => name;
 }
-
 /**
  * The enumeration {@code 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.
  * @coverage dart.engine.source
  */
 class UriKind implements Comparable<UriKind> {
-  
+
   /**
    * A 'dart:' URI.
    */
   static final UriKind DART_URI = new UriKind('DART_URI', 0, 0x64);
-  
+
   /**
    * A 'file:' URI.
    */
   static final UriKind FILE_URI = new UriKind('FILE_URI', 1, 0x66);
-  
+
   /**
    * A 'package:' URI.
    */
   static final UriKind PACKAGE_URI = new UriKind('PACKAGE_URI', 2, 0x70);
   static final List<UriKind> values = [DART_URI, FILE_URI, PACKAGE_URI];
-  
+
   /// The name of this enum constant, as declared in the enum declaration.
   final String name;
-  
+
   /// The position in the enum declaration.
   final int ordinal;
-  
+
   /**
    * The single character encoding used to identify this kind of URI.
    */
   int _encoding = 0;
-  
+
   /**
    * Initialize a newly created URI kind to have the given encoding.
    * @param encoding the single character encoding used to identify this kind of URI.
@@ -472,7 +463,7 @@
   UriKind(this.name, this.ordinal, int encoding) {
     this._encoding = encoding;
   }
-  
+
   /**
    * Return the URI kind represented by the given encoding, or {@code null} if there is no kind with
    * the given encoding.
@@ -492,7 +483,7 @@
     }
     return null;
   }
-  
+
   /**
    * Return the single character encoding used to identify this kind of URI.
    * @return the single character encoding used to identify this kind of URI
@@ -501,25 +492,24 @@
   int compareTo(UriKind other) => ordinal - other.ordinal;
   String toString() => name;
 }
-
 /**
  * A source range defines an {@link Element}'s source coordinates relative to its {@link Source}.
  * @coverage dart.engine.utilities
  */
 class SourceRange {
-  
+
   /**
    * The 0-based index of the first character of the source code for this element, relative to the
    * source buffer in which this element is contained.
    */
   int _offset = 0;
-  
+
   /**
    * The number of characters of the source code for this element, relative to the source buffer in
    * which this element is contained.
    */
   int _length = 0;
-  
+
   /**
    * Initialize a newly created source range using the given offset and the given length.
    * @param offset the given offset
@@ -529,27 +519,27 @@
     this._offset = offset;
     this._length = length;
   }
-  
+
   /**
    * @return {@code true} if <code>x</code> is in \[offset, offset + length) interval.
    */
   bool contains(int x) => _offset <= x && x < _offset + _length;
-  
+
   /**
    * @return {@code true} if <code>x</code> is in (offset, offset + length) interval.
    */
   bool containsExclusive(int x) => _offset < x && x < _offset + _length;
-  
+
   /**
    * @return {@code true} if <code>otherRange</code> covers this {@link SourceRange}.
    */
   bool coveredBy(SourceRange otherRange) => otherRange.covers(this);
-  
+
   /**
    * @return {@code true} if this {@link SourceRange} covers <code>otherRange</code>.
    */
   bool covers(SourceRange otherRange) => offset <= otherRange.offset && otherRange.end <= end;
-  
+
   /**
    * @return {@code true} if this {@link SourceRange} ends in <code>otherRange</code>.
    */
@@ -564,18 +554,18 @@
     SourceRange sourceRange = obj as SourceRange;
     return sourceRange.offset == _offset && sourceRange.length == _length;
   }
-  
+
   /**
    * @return the 0-based index of the after-last character of the source code for this element,
    * relative to the source buffer in which this element is contained.
    */
   int get end => _offset + _length;
-  
+
   /**
    * @return the expanded instance of {@link SourceRange}, which has the same center.
    */
   SourceRange getExpanded(int delta) => new SourceRange(_offset - delta, delta + _length + delta);
-  
+
   /**
    * Returns the number of characters of the source code for this element, relative to the source
    * buffer in which this element is contained.
@@ -583,12 +573,12 @@
    * buffer in which this element is contained
    */
   int get length => _length;
-  
+
   /**
    * @return the instance of {@link SourceRange} with end moved on "delta".
    */
   SourceRange getMoveEnd(int delta) => new SourceRange(_offset, _length + delta);
-  
+
   /**
    * Returns the 0-based index of the first character of the source code for this element, relative
    * to the source buffer in which this element is contained.
@@ -596,13 +586,13 @@
    * to the source buffer in which this element is contained
    */
   int get offset => _offset;
-  
+
   /**
    * @return the expanded translated of {@link SourceRange}, with moved start and the same length.
    */
   SourceRange getTranslated(int delta) => new SourceRange(_offset + delta, _length);
   int get hashCode => 31 * _offset + _length;
-  
+
   /**
    * @return {@code true} if this {@link SourceRange} intersects with given.
    */
@@ -618,7 +608,7 @@
     }
     return true;
   }
-  
+
   /**
    * @return {@code true} if this {@link SourceRange} starts in <code>otherRange</code>.
    */
@@ -633,7 +623,6 @@
     return builder.toString();
   }
 }
-
 /**
  * The interface {@code SourceContainer} is used by clients to define a collection of sources
  * <p>
@@ -644,7 +633,7 @@
  * @coverage dart.engine.source
  */
 abstract class SourceContainer {
-  
+
   /**
    * Determine if the specified source is part of the receiver's collection of sources.
    * @param source the source in question
@@ -652,30 +641,29 @@
    */
   bool contains(Source source);
 }
-
 /**
  * Instances of the class {@code DartUriResolver} resolve {@code dart} URI's.
  * @coverage dart.engine.source
  */
 class DartUriResolver extends UriResolver {
-  
+
   /**
    * The Dart SDK against which URI's are to be resolved.
    */
   DartSdk _sdk;
-  
+
   /**
    * The name of the {@code dart} scheme.
    */
   static String _DART_SCHEME = "dart";
-  
+
   /**
    * Return {@code true} if the given URI is a {@code dart:} URI.
    * @param uri the URI being tested
    * @return {@code true} if the given URI is a {@code 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.
@@ -690,7 +678,7 @@
     }
     return null;
   }
-  
+
   /**
    * Return the {@link DartSdk} against which URIs are to be resolved.
    * @return the {@link DartSdk} against which URIs are to be resolved.
@@ -703,19 +691,18 @@
     return _sdk.mapDartUri(contentCache, uri.toString());
   }
 }
-
 /**
  * Instances of the class {@code LineInfo} encapsulate information about line and column information
  * within a source file.
  * @coverage dart.engine.utilities
  */
 class LineInfo {
-  
+
   /**
    * An array containing the offsets of the first character of each line in the source code.
    */
   List<int> _lineStarts;
-  
+
   /**
    * Initialize a newly created set of line information to represent the data encoded in the given
    * array.
@@ -729,7 +716,7 @@
     }
     this._lineStarts = lineStarts;
   }
-  
+
   /**
    * 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
@@ -745,23 +732,22 @@
     return new LineInfo_Location(lineCount, offset - _lineStarts[lineCount - 1] + 1);
   }
 }
-
 /**
  * Instances of the class {@code 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.
    */
   int _lineNumber = 0;
-  
+
   /**
    * The one-based index of the column containing the character.
    */
   int _columnNumber = 0;
-  
+
   /**
    * Initialize a newly created location to represent the location of the character at the given
    * line and column position.
@@ -772,38 +758,37 @@
     this._lineNumber = lineNumber;
     this._columnNumber = columnNumber;
   }
-  
+
   /**
    * Return the one-based index of the column containing the character.
    * @return the one-based index of the column containing the character
    */
   int get columnNumber => _columnNumber;
-  
+
   /**
    * Return the one-based index of the line containing the character.
    * @return the one-based index of the line containing the character
    */
   int get lineNumber => _lineNumber;
 }
-
 /**
  * Instances of class {@code ContentCache} hold content used to override the default content of a{@link Source}.
  * @coverage dart.engine.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 {@code null} if this cache does not override the
    * contents of the source.
@@ -813,7 +798,7 @@
    * @return the contents of the given source
    */
   String getContents(Source source) => _contentMap[source];
-  
+
   /**
    * Return the modification stamp of the given source, or {@code null} if this cache does not
    * override the contents of the source.
@@ -823,7 +808,7 @@
    * @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 {@code null} the override is removed so
diff --git a/pkg/analyzer_experimental/lib/src/generated/source_io.dart b/pkg/analyzer_experimental/lib/src/generated/source_io.dart
index 7b7f4b0..3decc7b 100644
--- a/pkg/analyzer_experimental/lib/src/generated/source_io.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/source_io.dart
@@ -1,8 +1,6 @@
 // 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.source.io;
-
 import 'source.dart';
 import 'dart:io';
 import 'java_core.dart';
@@ -10,35 +8,33 @@
 import 'sdk.dart' show DartSdk;
 import 'engine.dart' show AnalysisContext, AnalysisEngine;
 export 'source.dart';
-
-
 /**
  * Instances of the class {@code FileBasedSource} implement a source that represents a file.
  * @coverage dart.engine.source
  */
 class FileBasedSource implements Source {
-  
+
   /**
    * The content cache used to access the contents of this source if they have been overridden from
    * what is on disk or cached.
    */
   ContentCache _contentCache;
-  
+
   /**
    * The file represented by this source.
    */
   JavaFile _file;
-  
+
   /**
    * The cached encoding for this source.
    */
   String _encoding;
-  
+
   /**
    * The kind of URI from which this source was originally derived.
    */
   UriKind _uriKind;
-  
+
   /**
    * Initialize a newly created source object. The source object is assumed to not be in a system
    * library.
@@ -46,12 +42,12 @@
    * @param file the file represented by this source
    */
   FileBasedSource.con1(ContentCache contentCache, JavaFile file) {
-    _jtd_constructor_336_impl(contentCache, file);
+    _jtd_constructor_338_impl(contentCache, file);
   }
-  _jtd_constructor_336_impl(ContentCache contentCache, JavaFile file) {
-    _jtd_constructor_337_impl(contentCache, file, UriKind.FILE_URI);
+  _jtd_constructor_338_impl(ContentCache contentCache, JavaFile file) {
+    _jtd_constructor_339_impl(contentCache, file, UriKind.FILE_URI);
   }
-  
+
   /**
    * Initialize a newly created source object.
    * @param contentCache the content cache used to access the contents of this source
@@ -59,9 +55,9 @@
    * @param flags {@code true} if this source is in one of the system libraries
    */
   FileBasedSource.con2(ContentCache contentCache2, JavaFile file2, UriKind uriKind2) {
-    _jtd_constructor_337_impl(contentCache2, file2, uriKind2);
+    _jtd_constructor_339_impl(contentCache2, file2, uriKind2);
   }
-  _jtd_constructor_337_impl(ContentCache contentCache2, JavaFile file2, UriKind uriKind2) {
+  _jtd_constructor_339_impl(ContentCache contentCache2, JavaFile file2, UriKind uriKind2) {
     this._contentCache = contentCache2;
     this._file = file2;
     this._uriKind = uriKind2;
@@ -106,7 +102,7 @@
     }
     return _file.getAbsolutePath();
   }
-  
+
   /**
    * Return the file represented by this source. This is an internal method that is only intended to
    * be used by {@link UriResolver}.
@@ -114,7 +110,6 @@
    */
   JavaFile get file => _file;
 }
-
 /**
  * Instances of the class {@code PackageUriResolver} resolve {@code package} URI's in the context of
  * an application.
@@ -125,29 +120,29 @@
  * @coverage dart.engine.source
  */
 class PackageUriResolver extends UriResolver {
-  
+
   /**
    * The package directories that {@code package} URI's are assumed to be relative to.
    */
   List<JavaFile> _packagesDirectories;
-  
+
   /**
    * The name of the {@code package} scheme.
    */
-  static String _PACKAGE_SCHEME = "package";
-  
+  static String PACKAGE_SCHEME = "package";
+
   /**
    * Log exceptions thrown with the message "Required key not available" only once.
    */
   static bool _CanLogRequiredKeyIoException = true;
-  
+
   /**
    * Return {@code true} if the given URI is a {@code package} URI.
    * @param uri the URI being tested
    * @return {@code true} if the given URI is a {@code package} URI
    */
-  static bool isPackageUri(Uri uri) => _PACKAGE_SCHEME == uri.scheme;
-  
+  static bool isPackageUri(Uri uri) => PACKAGE_SCHEME == uri.scheme;
+
   /**
    * Initialize a newly created resolver to resolve {@code package} URI's relative to the given
    * package directories.
@@ -208,7 +203,7 @@
               String pkgCanonicalPath = pkgFolder.getCanonicalPath();
               if (sourcePath.startsWith(pkgCanonicalPath)) {
                 String relPath = sourcePath.substring(pkgCanonicalPath.length);
-                return parseUriWithException("${_PACKAGE_SCHEME}:${pkgFolder.getName()}${relPath}");
+                return parseUriWithException("${PACKAGE_SCHEME}:${pkgFolder.getName()}${relPath}");
               }
             } catch (e) {
             }
@@ -218,7 +213,7 @@
     }
     return null;
   }
-  
+
   /**
    * Answer the canonical file for the specified package.
    * @param packagesDirectory the "packages" directory (not {@code null})
@@ -242,14 +237,13 @@
     return new JavaFile.relative(pkgDir, relPath.replaceAll('/', JavaFile.separatorChar));
   }
 }
-
 /**
  * Instances of the class {@link DirectoryBasedSourceContainer} represent a source container that
  * contains all sources within a given directory.
  * @coverage dart.engine.source
  */
 class DirectoryBasedSourceContainer implements SourceContainer {
-  
+
   /**
    * Append the system file separator to the given path unless the path already ends with a
    * separator.
@@ -262,37 +256,37 @@
     }
     return "${path}${JavaFile.separator}";
   }
-  
+
   /**
    * The container's path (not {@code null}).
    */
   String _path;
-  
+
   /**
    * Construct a container representing the specified directory and containing any sources whose{@link Source#getFullName()} starts with the directory's path. This is a convenience method,
    * fully equivalent to {@link DirectoryBasedSourceContainer#DirectoryBasedSourceContainer(String)}.
    * @param directory the directory (not {@code null})
    */
   DirectoryBasedSourceContainer.con1(JavaFile directory) {
-    _jtd_constructor_334_impl(directory);
+    _jtd_constructor_336_impl(directory);
   }
-  _jtd_constructor_334_impl(JavaFile directory) {
-    _jtd_constructor_335_impl(directory.getPath());
+  _jtd_constructor_336_impl(JavaFile directory) {
+    _jtd_constructor_337_impl(directory.getPath());
   }
-  
+
   /**
    * Construct a container representing the specified path and containing any sources whose{@link Source#getFullName()} starts with the specified path.
    * @param path the path (not {@code null} and not empty)
    */
   DirectoryBasedSourceContainer.con2(String path2) {
-    _jtd_constructor_335_impl(path2);
+    _jtd_constructor_337_impl(path2);
   }
-  _jtd_constructor_335_impl(String path2) {
+  _jtd_constructor_337_impl(String path2) {
     this._path = appendFileSeparator(path2);
   }
   bool contains(Source source) => source.fullName.startsWith(_path);
   bool operator ==(Object obj) => (obj is DirectoryBasedSourceContainer) && ((obj as DirectoryBasedSourceContainer)).path == path;
-  
+
   /**
    * Answer the receiver's path, used to determine if a source is contained in the receiver.
    * @return the path (not {@code null}, not empty)
@@ -301,24 +295,23 @@
   int get hashCode => _path.hashCode;
   String toString() => "SourceContainer[${_path}]";
 }
-
 /**
  * Instances of the class {@code FileUriResolver} resolve {@code file} URI's.
  * @coverage dart.engine.source
  */
 class FileUriResolver extends UriResolver {
-  
+
   /**
    * The name of the {@code file} scheme.
    */
-  static String _FILE_SCHEME = "file";
-  
+  static String FILE_SCHEME = "file";
+
   /**
    * Return {@code true} if the given URI is a {@code file} URI.
    * @param uri the URI being tested
    * @return {@code true} if the given URI is a {@code file} URI
    */
-  static bool isFileUri(Uri uri) => uri.scheme == _FILE_SCHEME;
+  static bool isFileUri(Uri uri) => uri.scheme == FILE_SCHEME;
   Source fromEncoding(ContentCache contentCache, UriKind kind, Uri uri) {
     if (identical(kind, UriKind.FILE_URI)) {
       return new FileBasedSource.con2(contentCache, new JavaFile.fromUri(uri), kind);
diff --git a/pkg/analyzer_experimental/lib/src/generated/utilities_dart.dart b/pkg/analyzer_experimental/lib/src/generated/utilities_dart.dart
index af701a1..ee959a3 100644
--- a/pkg/analyzer_experimental/lib/src/generated/utilities_dart.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/utilities_dart.dart
@@ -1,10 +1,6 @@
 // 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.utilities.dart;
-
-
-
 /**
  * The enumeration {@code ParameterKind} defines the different kinds of parameters. There are two
  * basic kinds of parameters: required and optional. Optional parameters are further divided into
@@ -16,18 +12,18 @@
   static final ParameterKind POSITIONAL = new ParameterKind('POSITIONAL', 1, true);
   static final ParameterKind NAMED = new ParameterKind('NAMED', 2, true);
   static final List<ParameterKind> values = [REQUIRED, POSITIONAL, NAMED];
-  
+
   /// The name of this enum constant, as declared in the enum declaration.
   final String name;
-  
+
   /// The position in the enum declaration.
   final int ordinal;
-  
+
   /**
    * A flag indicating whether this is an optional parameter.
    */
   bool _isOptional2 = false;
-  
+
   /**
    * Initialize a newly created kind with the given state.
    * @param isOptional {@code true} if this is an optional parameter
@@ -35,7 +31,7 @@
   ParameterKind(this.name, this.ordinal, bool isOptional) {
     this._isOptional2 = isOptional;
   }
-  
+
   /**
    * Return {@code true} if this is an optional parameter.
    * @return {@code true} if this is an optional parameter
diff --git a/pkg/analyzer_experimental/test/generated/ast_test.dart b/pkg/analyzer_experimental/test/generated/ast_test.dart
index b7c4697..10c7928 100644
--- a/pkg/analyzer_experimental/test/generated/ast_test.dart
+++ b/pkg/analyzer_experimental/test/generated/ast_test.dart
@@ -1,8 +1,6 @@
 // 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.ast_test;
-
 import 'dart:collection';
 import 'package:analyzer_experimental/src/generated/java_core.dart';
 import 'package:analyzer_experimental/src/generated/java_engine.dart';
@@ -17,7 +15,6 @@
 import 'parser_test.dart' show ParserTestCase;
 import 'test_support.dart';
 import 'scanner_test.dart' show TokenFactory;
-
 class NodeLocatorTest extends ParserTestCase {
   void test_offset() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit("library myLib;", []);
@@ -185,7 +182,6 @@
     });
   }
 }
-
 /**
  * The class {@code ASTFactory} defines utility methods that can be used to create AST nodes. The
  * nodes that are created are complete in the sense that all of the tokens that would have been
@@ -373,7 +369,7 @@
   static TryStatement tryStatement3(Block body, List<CatchClause> catchClauses, Block finallyClause) => new TryStatement.full(TokenFactory.token(Keyword.TRY), body, catchClauses, finallyClause == null ? null : TokenFactory.token(Keyword.FINALLY), finallyClause);
   static FunctionTypeAlias typeAlias(TypeName returnType, String name, TypeParameterList typeParameters, FormalParameterList parameters) => new FunctionTypeAlias.full(null, null, TokenFactory.token(Keyword.TYPEDEF), returnType, identifier3(name), typeParameters, parameters, TokenFactory.token3(TokenType.SEMICOLON));
   static TypeArgumentList typeArgumentList(List<TypeName> typeNames) => new TypeArgumentList.full(TokenFactory.token3(TokenType.LT), list(typeNames), TokenFactory.token3(TokenType.GT));
-  
+
   /**
    * Create a type name whose name has been resolved to the given element and whose type has been
    * resolved to the type of the given element.
@@ -566,7 +562,7 @@
     }
     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
@@ -674,10 +670,10 @@
   static final AssignmentKind SIMPLE_RIGHT = new AssignmentKind('SIMPLE_RIGHT', 8);
   static final AssignmentKind NONE = new AssignmentKind('NONE', 9);
   static final List<AssignmentKind> values = [BINARY, COMPOUND_LEFT, COMPOUND_RIGHT, POSTFIX_INC, PREFIX_DEC, PREFIX_INC, PREFIX_NOT, SIMPLE_LEFT, SIMPLE_RIGHT, NONE];
-  
+
   /// The name of this enum constant, as declared in the enum declaration.
   final String name;
-  
+
   /// The position in the enum declaration.
   final int ordinal;
   AssignmentKind(this.name, this.ordinal) {
@@ -692,10 +688,10 @@
   static final WrapperKind PROPERTY_RIGHT = new WrapperKind('PROPERTY_RIGHT', 3);
   static final WrapperKind NONE = new WrapperKind('NONE', 4);
   static final List<WrapperKind> values = [PREFIXED_LEFT, PREFIXED_RIGHT, PROPERTY_LEFT, PROPERTY_RIGHT, NONE];
-  
+
   /// The name of this enum constant, as declared in the enum declaration.
   final String name;
-  
+
   /// The position in the enum declaration.
   final int ordinal;
   WrapperKind(this.name, this.ordinal) {
@@ -1921,7 +1917,7 @@
   void test_visitWithClause_single() {
     assertSource("with A", ASTFactory.withClause([ASTFactory.typeName4("A", [])]));
   }
-  
+
   /**
    * Assert that a {@code ToSourceVisitor} will produce the expected source when visiting the given
    * node.
diff --git a/pkg/analyzer_experimental/test/generated/element_test.dart b/pkg/analyzer_experimental/test/generated/element_test.dart
index 2dc5be5..ed98686 100644
--- a/pkg/analyzer_experimental/test/generated/element_test.dart
+++ b/pkg/analyzer_experimental/test/generated/element_test.dart
@@ -1,8 +1,6 @@
 // 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.element_test;
-
 import 'dart:collection';
 import 'dart:io';
 import 'package:analyzer_experimental/src/generated/java_core.dart';
@@ -21,7 +19,6 @@
 import 'scanner_test.dart' show TokenFactory;
 import 'ast_test.dart' show ASTFactory;
 import 'resolver_test.dart' show TestTypeProvider;
-
 class ElementLocationImplTest extends EngineTestCase {
   void test_create_encoding() {
     String encoding = "a;b;c";
@@ -173,7 +170,7 @@
   }
 }
 class InterfaceTypeImplTest extends EngineTestCase {
-  
+
   /**
    * The type provider used to access the types.
    */
@@ -1537,14 +1534,13 @@
     });
   }
 }
-
 /**
  * The class {@code 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'.
    */
diff --git a/pkg/analyzer_experimental/test/generated/parser_test.dart b/pkg/analyzer_experimental/test/generated/parser_test.dart
index 015c179..616a497 100644
--- a/pkg/analyzer_experimental/test/generated/parser_test.dart
+++ b/pkg/analyzer_experimental/test/generated/parser_test.dart
@@ -1,8 +1,6 @@
 // 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.parser_test;
-
 import 'dart:collection';
 import 'package:analyzer_experimental/src/generated/java_core.dart';
 import 'package:analyzer_experimental/src/generated/java_engine.dart';
@@ -17,8 +15,6 @@
 import 'test_support.dart';
 import 'scanner_test.dart' show TokenFactory;
 import 'ast_test.dart' show ASTFactory;
-
-
 /**
  * The class {@code 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
@@ -3670,7 +3666,7 @@
     JUnitTestCase.assertNotNull(following);
     JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
   }
-  
+
   /**
    * Invoke the method {@link Parser#computeStringValue(String)} with the given argument.
    * @param lexeme the argument to the method
@@ -3682,7 +3678,7 @@
     Parser parser = new Parser(null, listener);
     return invokeParserMethodImpl(parser, "computeStringValue", <Object> [lexeme], null) as String;
   }
-  
+
   /**
    * Invoke the method {@link Parser#createSyntheticIdentifier()} with the parser set to the token
    * stream produced by scanning the given source.
@@ -3694,7 +3690,7 @@
     GatheringErrorListener listener = new GatheringErrorListener();
     return ParserTestCase.invokeParserMethod2("createSyntheticIdentifier", "", listener);
   }
-  
+
   /**
    * Invoke the method {@link Parser#createSyntheticIdentifier()} with the parser set to the token
    * stream produced by scanning the given source.
@@ -3706,7 +3702,7 @@
     GatheringErrorListener listener = new GatheringErrorListener();
     return ParserTestCase.invokeParserMethod2("createSyntheticStringLiteral", "", listener);
   }
-  
+
   /**
    * Invoke the method {@link Parser#isFunctionDeclaration()} with the parser set to the token
    * stream produced by scanning the given source.
@@ -3718,7 +3714,7 @@
     GatheringErrorListener listener = new GatheringErrorListener();
     return ParserTestCase.invokeParserMethod2("isFunctionDeclaration", source, listener) as bool;
   }
-  
+
   /**
    * Invoke the method {@link Parser#isFunctionExpression()} with the parser set to the token stream
    * produced by scanning the given source.
@@ -3733,7 +3729,7 @@
     Parser parser = new Parser(null, listener);
     return invokeParserMethodImpl(parser, "isFunctionExpression", <Object> [tokenStream], tokenStream) as bool;
   }
-  
+
   /**
    * Invoke the method {@link Parser#isInitializedVariableDeclaration()} with the parser set to the
    * token stream produced by scanning the given source.
@@ -3745,7 +3741,7 @@
     GatheringErrorListener listener = new GatheringErrorListener();
     return ParserTestCase.invokeParserMethod2("isInitializedVariableDeclaration", source, listener) as bool;
   }
-  
+
   /**
    * Invoke the method {@link Parser#isSwitchMember()} with the parser set to the token stream
    * produced by scanning the given source.
@@ -3757,7 +3753,7 @@
     GatheringErrorListener listener = new GatheringErrorListener();
     return ParserTestCase.invokeParserMethod2("isSwitchMember", source, listener) as bool;
   }
-  
+
   /**
    * Invoke a "skip" method in {@link Parser}. The method is assumed to take a token as it's
    * parameter and is given the first token in the scanned source.
@@ -5856,7 +5852,6 @@
     JUnitTestCase.fail("Unexpected compilation error: ${event.message} (${event.offset}, ${event.length})");
   }
 }
-
 /**
  * The class {@code 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
@@ -6267,18 +6262,17 @@
     });
   }
 }
-
 /**
  * Instances of the class {@code ASTValidator} are used to validate the correct construction of an
  * AST structure.
  */
 class ASTValidator extends GeneralizingASTVisitor<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.
@@ -6298,7 +6292,7 @@
     validate(node);
     return super.visitNode(node);
   }
-  
+
   /**
    * Validate that the given AST node is correctly constructed.
    * @param node the AST node being validated
@@ -6339,12 +6333,12 @@
   }
 }
 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);
-  
+
   /**
    * Invoke a parse method in {@link Parser}. The method is assumed to have the given number and
    * type of parameters and will be invoked with the given arguments.
@@ -6359,7 +6353,7 @@
    * @throws AssertionFailedError if the result is {@code null} or if any errors are produced
    */
   static Object parse(String methodName, List<Object> objects, String source) => parse3(methodName, objects, source, new List<AnalysisError>(0));
-  
+
   /**
    * Invoke a parse method in {@link Parser}. The method is assumed to have the given number and
    * type of parameters and will be invoked with the given arguments.
@@ -6381,7 +6375,7 @@
     listener.assertErrors(errors);
     return result;
   }
-  
+
   /**
    * Invoke a parse method in {@link Parser}. The method is assumed to have the given number and
    * type of parameters and will be invoked with the given arguments.
@@ -6403,7 +6397,7 @@
     listener.assertErrors2(errorCodes);
     return result;
   }
-  
+
   /**
    * Invoke a parse method in {@link Parser}. The method is assumed to have no arguments.
    * <p>
@@ -6418,7 +6412,7 @@
    * scanning and parsing the source do not match the expected errors
    */
   static Object parse5(String methodName, String source, List<ErrorCode> errorCodes) => parse4(methodName, _EMPTY_ARGUMENTS, source, errorCodes);
-  
+
   /**
    * Parse the given source as a compilation unit.
    * @param source the source to be parsed
@@ -6438,7 +6432,7 @@
     listener.assertErrors2(errorCodes);
     return unit;
   }
-  
+
   /**
    * Parse the given source as an expression.
    * @param source the source to be parsed
@@ -6458,7 +6452,7 @@
     listener.assertErrors2(errorCodes);
     return expression as Expression;
   }
-  
+
   /**
    * Parse the given source as a statement.
    * @param source the source to be parsed
@@ -6478,7 +6472,7 @@
     listener.assertErrors2(errorCodes);
     return statement as Statement;
   }
-  
+
   /**
    * Parse the given source as a sequence of statements.
    * @param source the source to be parsed
@@ -6500,7 +6494,7 @@
     listener.assertErrors2(errorCodes);
     return statements;
   }
-  
+
   /**
    * Invoke a method in {@link Parser}. The method is assumed to have the given number and type of
    * parameters and will be invoked with the given arguments.
@@ -6527,7 +6521,7 @@
     }
     return result as Object;
   }
-  
+
   /**
    * Invoke a method in {@link Parser}. The method is assumed to have no arguments.
    * <p>
@@ -6542,7 +6536,7 @@
    * 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
@@ -6556,7 +6550,7 @@
     }
     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
@@ -6567,7 +6561,6 @@
     });
   }
 }
-
 /**
  * The class {@code RecoveryParserTest} defines parser tests that test the parsing of invalid code
  * sequences to ensure that the correct recovery steps are taken in the parser.
@@ -7288,7 +7281,6 @@
     });
   }
 }
-
 /**
  * The class {@code ErrorParserTest} defines parser tests that test the parsing of code to ensure
  * that errors are correctly reported, and in some cases, not reported.
diff --git a/pkg/analyzer_experimental/test/generated/resolver_test.dart b/pkg/analyzer_experimental/test/generated/resolver_test.dart
index c42002c..4884cbe 100644
--- a/pkg/analyzer_experimental/test/generated/resolver_test.dart
+++ b/pkg/analyzer_experimental/test/generated/resolver_test.dart
@@ -1,8 +1,6 @@
 // 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.resolver_test;
-
 import 'dart:collection';
 import 'package:analyzer_experimental/src/generated/java_core.dart';
 import 'package:analyzer_experimental/src/generated/java_engine.dart';
@@ -22,7 +20,6 @@
 import 'test_support.dart';
 import 'ast_test.dart' show ASTFactory;
 import 'element_test.dart' show ElementFactory;
-
 class TypePropagationTest extends ResolverTestCase {
   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;", "  }", "}"]));
@@ -4194,6 +4191,18 @@
     assertErrors([CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
     verify([source]);
   }
+  void test_constInitializedWithNonConstValue_missingConstInListLiteral() {
+    Source source = addSource("const List L = [0];");
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
+    verify([source]);
+  }
+  void test_constInitializedWithNonConstValue_missingConstInMapLiteral() {
+    Source source = addSource("const Map M = {'a' : 0};");
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
+    verify([source]);
+  }
   void test_constWithInvalidTypeParameters() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  const A();", "}", "f() { return const A<A>(); }"]));
     resolve(source);
@@ -5567,6 +5576,14 @@
         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_constWithInvalidTypeParameters', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_constWithInvalidTypeParameters);
@@ -6350,7 +6367,6 @@
     });
   }
 }
-
 /**
  * Instances of the class {@code 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.
@@ -6485,6 +6501,135 @@
     return "<unknown file- ASTNode is null>";
   }
 }
+/**
+ * The class {@code 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([StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+  void setUp() {
+    super.setUp();
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    options.strictMode = true;
+    analysisContext.analysisOptions = options;
+  }
+  void test_assert_is() {
+    Source source = addSource(EngineTestCase.createSource(["int f(num n) {", "  assert (n is int);", "  return n & 0x0F;", "}"]));
+    resolve(source);
+    assertErrors([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);
+    assertErrors([StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+  void test_conditional_is() {
+    Source source = addSource(EngineTestCase.createSource(["int f(num n) {", "  return (n is int) ? n & 0x0F : 0;", "}"]));
+    resolve(source);
+    assertErrors([StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+  void test_conditional_isNot() {
+    Source source = addSource(EngineTestCase.createSource(["int f(num n) {", "  return (n is! int) ? 0 : n & 0x0F;", "}"]));
+    resolve(source);
+    assertErrors([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([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([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);
+    assertErrors([StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+  void test_if_is() {
+    Source source = addSource(EngineTestCase.createSource(["int f(num n) {", "  if (n is int) {", "    return n & 0x0F;", "  }", "  return 0;", "}"]));
+    resolve(source);
+    assertErrors([StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+  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([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([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([StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+  void test_localVar() {
+    Source source = addSource(EngineTestCase.createSource(["int f() {", "  num n = 1234;", "  return n & 0x0F;", "}"]));
+    resolve(source);
+    assertErrors([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 {
 
   /**
@@ -6544,6 +6689,22 @@
     _typeProvider = new TestTypeProvider();
     _resolver = createResolver();
   }
+  void test_lookUpMethodInInterfaces() {
+    InterfaceType intType2 = _typeProvider.intType;
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    MethodElement operator = ElementFactory.methodElement("[]", intType2, [intType2]);
+    classA.methods = <MethodElement> [operator];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.interfaces = <InterfaceType> [classA.type];
+    ClassElementImpl classC = ElementFactory.classElement2("C", []);
+    classC.mixins = <InterfaceType> [classB.type];
+    ClassElementImpl classD = ElementFactory.classElement("D", classC.type, []);
+    SimpleIdentifier array = ASTFactory.identifier3("a");
+    array.staticType = classD.type;
+    IndexExpression expression = ASTFactory.indexExpression(array, ASTFactory.identifier3("i"));
+    JUnitTestCase.assertSame(operator, resolve5(expression, []));
+    _listener.assertNoErrors();
+  }
   void test_visitAssignmentExpression_compound() {
     InterfaceType intType2 = _typeProvider.intType;
     SimpleIdentifier leftHandSide = ASTFactory.identifier3("a");
@@ -7027,6 +7188,10 @@
   }
   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);
@@ -7248,6 +7413,48 @@
     });
   }
 }
+class PubSuggestionCodeTest extends ResolverTestCase {
+  void test_import_packageWithDotDot() {
+    Source source = addSource(EngineTestCase.createSource(["import 'package:somepackage/../other.dart';"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.URI_DOES_NOT_EXIST, PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT]);
+  }
+  void test_import_referenceIntoLibDirectory() {
+    Source source = addSource(EngineTestCase.createSource(["import '../lib/other.dart';"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.URI_DOES_NOT_EXIST, PubSuggestionCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE]);
+  }
+  void test_import_referenceOutOfLibDirectory() {
+    Source source = addSource2("lib/test.dart", EngineTestCase.createSource(["import '../web/other.dart';"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.URI_DOES_NOT_EXIST, PubSuggestionCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE]);
+  }
+  void test_import_valid() {
+    Source source = addSource2("lib2/test.dart", EngineTestCase.createSource(["import '../web/other.dart';"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
+  }
+  static dartSuite() {
+    _ut.group('PubSuggestionCodeTest', () {
+      _ut.test('test_import_packageWithDotDot', () {
+        final __test = new PubSuggestionCodeTest();
+        runJUnitTest(__test, __test.test_import_packageWithDotDot);
+      });
+      _ut.test('test_import_referenceIntoLibDirectory', () {
+        final __test = new PubSuggestionCodeTest();
+        runJUnitTest(__test, __test.test_import_referenceIntoLibDirectory);
+      });
+      _ut.test('test_import_referenceOutOfLibDirectory', () {
+        final __test = new PubSuggestionCodeTest();
+        runJUnitTest(__test, __test.test_import_referenceOutOfLibDirectory);
+      });
+      _ut.test('test_import_valid', () {
+        final __test = new PubSuggestionCodeTest();
+        runJUnitTest(__test, __test.test_import_valid);
+      });
+    });
+  }
+}
 class StaticWarningCodeTest extends ResolverTestCase {
   void fail_argumentTypeNotAssignable_invocation_functionParameter_generic() {
     Source source = addSource(EngineTestCase.createSource(["class A<K, V> {", "  m(f(K k), V v) {", "    f(v);", "  }", "}"]));
@@ -8466,7 +8673,6 @@
     });
   }
 }
-
 /**
  * Instances of the class {@code TestTypeProvider} implement a type provider that can be used by
  * tests without creating the element model for the core library.
@@ -8609,7 +8815,8 @@
       Type2 eType = listElement.typeVariables[0].type;
       InterfaceType supertype = iterableType.substitute5(<Type2> [eType]);
       listElement.supertype = supertype;
-      listElement.methods = <MethodElement> [ElementFactory.methodElement("[]", eType, [_intType]), ElementFactory.methodElement("[]=", VoidTypeImpl.instance, [_intType, eType])];
+      listElement.accessors = <PropertyAccessorElement> [ElementFactory.getterElement("length", false, intType)];
+      listElement.methods = <MethodElement> [ElementFactory.methodElement("[]", eType, [intType]), ElementFactory.methodElement("[]=", VoidTypeImpl.instance, [intType, eType])];
     }
     return _listType;
   }
@@ -8617,7 +8824,7 @@
     if (_mapType == null) {
       ClassElementImpl mapElement = ElementFactory.classElement2("Map", ["K", "V"]);
       _mapType = mapElement.type;
-      mapElement.accessors = <PropertyAccessorElement> [ElementFactory.getterElement("length", false, _intType)];
+      mapElement.accessors = <PropertyAccessorElement> [ElementFactory.getterElement("length", false, intType)];
     }
     return _mapType;
   }
@@ -8633,7 +8840,7 @@
       _objectType = objectElement.type;
       if (objectElement.methods.length == 0) {
         objectElement.constructors = <ConstructorElement> [ElementFactory.constructorElement(objectElement, null)];
-        objectElement.methods = <MethodElement> [ElementFactory.methodElement("toString", stringType, []), ElementFactory.methodElement("==", _boolType, [_objectType]), ElementFactory.methodElement("noSuchMethod", dynamicType, [dynamicType])];
+        objectElement.methods = <MethodElement> [ElementFactory.methodElement("toString", stringType, []), ElementFactory.methodElement("==", boolType, [_objectType]), ElementFactory.methodElement("noSuchMethod", dynamicType, [dynamicType])];
         objectElement.accessors = <PropertyAccessorElement> [ElementFactory.getterElement("hashCode", false, intType), ElementFactory.getterElement("runtimeType", false, typeType)];
       }
     }
@@ -8687,7 +8894,6 @@
     doubleElement.methods = <MethodElement> [ElementFactory.methodElement("remainder", _doubleType, [_numType]), ElementFactory.methodElement("+", _doubleType, [_numType]), ElementFactory.methodElement("-", _doubleType, [_numType]), ElementFactory.methodElement("*", _doubleType, [_numType]), ElementFactory.methodElement("%", _doubleType, [_numType]), ElementFactory.methodElement("/", _doubleType, [_numType]), ElementFactory.methodElement("~/", _doubleType, [_numType]), ElementFactory.methodElement("-", _doubleType, []), ElementFactory.methodElement("abs", _doubleType, []), ElementFactory.methodElement("round", _doubleType, []), ElementFactory.methodElement("floor", _doubleType, []), ElementFactory.methodElement("ceil", _doubleType, []), ElementFactory.methodElement("truncate", _doubleType, []), ElementFactory.methodElement("toString", _stringType, [])];
   }
 }
-
 /**
  * The class {@code AnalysisContextFactory} defines utility methods used to create analysis contexts
  * for testing purposes.
@@ -8861,7 +9067,6 @@
     });
   }
 }
-
 /**
  * Instances of the class {@code ResolutionVerifier} verify that all of the nodes in an AST
  * structure that should have been resolved were resolved.
@@ -8889,10 +9094,10 @@
    * structures that are expected to have been resolved have an element associated with them.
    */
   ResolutionVerifier() {
-    _jtd_constructor_359_impl();
+    _jtd_constructor_361_impl();
   }
-  _jtd_constructor_359_impl() {
-    _jtd_constructor_360_impl(null);
+  _jtd_constructor_361_impl() {
+    _jtd_constructor_362_impl(null);
   }
 
   /**
@@ -8904,9 +9109,9 @@
    * therefore not cause the test to fail
    */
   ResolutionVerifier.con1(Set<ASTNode> knownExceptions2) {
-    _jtd_constructor_360_impl(knownExceptions2);
+    _jtd_constructor_362_impl(knownExceptions2);
   }
-  _jtd_constructor_360_impl(Set<ASTNode> knownExceptions2) {
+  _jtd_constructor_362_impl(Set<ASTNode> knownExceptions2) {
     this._knownExceptions = knownExceptions2;
   }
 
@@ -10406,7 +10611,6 @@
     });
   }
 }
-
 /**
  * A non-abstract subclass that can be used for testing purposes.
  */
@@ -10557,7 +10761,15 @@
     assertNoErrors();
     verify([source]);
   }
-  void test_importWithPrefix() {
+  void test_import_hide() {
+    addSource2("lib1.dart", EngineTestCase.createSource(["library lib1;", "set foo(value) {}"]));
+    addSource2("lib2.dart", EngineTestCase.createSource(["library lib2;", "set foo(value) {}"]));
+    Source source = addSource2("lib3.dart", EngineTestCase.createSource(["import 'lib1.dart' hide foo;", "import 'lib2.dart';", "", "main() {", "  foo = 0;", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_import_prefix() {
     addSource2("/two.dart", EngineTestCase.createSource(["library two;", "f(int x) {", "  return x * x;", "}"]));
     Source source = addSource2("/one.dart", EngineTestCase.createSource(["library one;", "import 'two.dart' as _two;", "main() {", "  _two.f(0);", "}"]));
     resolve(source);
@@ -10773,7 +10985,7 @@
     JUnitTestCase.assertEquals(indices.length, argumentCount);
     for (int i = 0; i < argumentCount; i++) {
       Expression argument = arguments2[i];
-      ParameterElement element = argument.parameterElement;
+      ParameterElement element = argument.staticParameterElement;
       int index = indices[i];
       if (index < 0) {
         JUnitTestCase.assertNull(element);
@@ -10872,9 +11084,13 @@
         final __test = new SimpleResolverTest();
         runJUnitTest(__test, __test.test_hasReferenceToSuper);
       });
-      _ut.test('test_importWithPrefix', () {
+      _ut.test('test_import_hide', () {
         final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_importWithPrefix);
+        runJUnitTest(__test, __test.test_import_hide);
+      });
+      _ut.test('test_import_prefix', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_import_prefix);
       });
       _ut.test('test_indexExpression_typeParameters', () {
         final __test = new SimpleResolverTest();
@@ -10975,8 +11191,10 @@
 //  CompileTimeErrorCodeTest.dartSuite();
 //  ErrorResolverTest.dartSuite();
 //  NonErrorResolverTest.dartSuite();
+//  PubSuggestionCodeTest.dartSuite();
 //  SimpleResolverTest.dartSuite();
 //  StaticTypeWarningCodeTest.dartSuite();
 //  StaticWarningCodeTest.dartSuite();
+//  StrictModeTest.dartSuite();
 //  TypePropagationTest.dartSuite();
 }
\ No newline at end of file
diff --git a/pkg/analyzer_experimental/test/generated/scanner_test.dart b/pkg/analyzer_experimental/test/generated/scanner_test.dart
index 5ac3673..0484f0d 100644
--- a/pkg/analyzer_experimental/test/generated/scanner_test.dart
+++ b/pkg/analyzer_experimental/test/generated/scanner_test.dart
@@ -1,8 +1,6 @@
 // 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.scanner_test;
-
 import 'dart:collection';
 import 'package:analyzer_experimental/src/generated/java_core.dart';
 import 'package:analyzer_experimental/src/generated/java_engine.dart';
@@ -12,7 +10,6 @@
 import 'package:analyzer_experimental/src/generated/scanner.dart';
 import 'package:unittest/unittest.dart' as _ut;
 import 'test_support.dart';
-
 class KeywordStateTest extends JUnitTestCase {
   void test_KeywordState() {
     List<Keyword> keywords = Keyword.values;
@@ -131,7 +128,6 @@
     });
   }
 }
-
 /**
  * The class {@code TokenFactory} defines utility methods that can be used to create tokens.
  */
@@ -1477,13 +1473,12 @@
     });
   }
 }
-
 /**
  * Instances of the class {@code 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
@@ -2048,7 +2043,7 @@
     JUnitTestCase.assertEquals(source.length, comment.length);
     JUnitTestCase.assertEquals(source, comment.lexeme);
   }
-  
+
   /**
    * Assert that scanning the given source produces an error with the given code.
    * @param illegalCharacter
@@ -2060,7 +2055,7 @@
     scan(source, listener);
     listener.assertErrors([new AnalysisError.con2(null, expectedOffset, 1, expectedError, [(source.codeUnitAt(expectedOffset) as int)])]);
   }
-  
+
   /**
    * Assert that when scanned the given source contains a single keyword token with the same lexeme
    * as the original source.
@@ -2099,7 +2094,7 @@
       JUnitTestCase.assertEquals(expectedLocation._columnNumber, location.columnNumber);
     }
   }
-  
+
   /**
    * Assert that the token scanned from the given source has the expected type.
    * @param expectedType the expected type of the token
@@ -2132,7 +2127,7 @@
     JUnitTestCase.assertEquals(TokenType.EOF, originalToken.next.type);
     return originalToken;
   }
-  
+
   /**
    * Assert that when scanned the given source contains a sequence of tokens identical to the given
    * tokens.
@@ -2160,7 +2155,6 @@
     return token;
   }
 }
-
 /**
  * Instances of the class {@code ExpectedLocation} encode information about the expected location
  * of a given offset in source code.
diff --git a/pkg/analyzer_experimental/test/generated/test_support.dart b/pkg/analyzer_experimental/test/generated/test_support.dart
index 59bafe1..e156318 100644
--- a/pkg/analyzer_experimental/test/generated/test_support.dart
+++ b/pkg/analyzer_experimental/test/generated/test_support.dart
@@ -1,8 +1,6 @@
 // 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.test_support;
-
 import 'dart:collection';
 import 'package:analyzer_experimental/src/generated/java_core.dart';
 import 'package:analyzer_experimental/src/generated/java_engine.dart';
@@ -13,60 +11,58 @@
 import 'package:analyzer_experimental/src/generated/element.dart' show InterfaceType, MethodElement, PropertyAccessorElement;
 import 'package:analyzer_experimental/src/generated/engine.dart' show AnalysisContext, AnalysisContextImpl, RecordingErrorListener;
 import 'package:unittest/unittest.dart' as _ut;
-
-
 /**
  * Instances of the class {@code 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.
    */
   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() : super() {
-    _jtd_constructor_357_impl();
+    _jtd_constructor_359_impl();
   }
-  _jtd_constructor_357_impl() {
+  _jtd_constructor_359_impl() {
   }
-  
+
   /**
    * Initialize a newly created error listener to collect errors.
    */
   GatheringErrorListener.con1(String rawSource2) {
-    _jtd_constructor_358_impl(rawSource2);
+    _jtd_constructor_360_impl(rawSource2);
   }
-  _jtd_constructor_358_impl(String rawSource2) {
+  _jtd_constructor_360_impl(String rawSource2) {
     this._rawSource = rawSource2;
     this._markedSource = rawSource2;
   }
-  
+
   /**
    * 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
@@ -76,7 +72,7 @@
       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
@@ -99,7 +95,7 @@
       }
     }
   }
-  
+
   /**
    * 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
@@ -183,7 +179,7 @@
       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
@@ -215,7 +211,7 @@
       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
@@ -223,13 +219,13 @@
   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 {@code null} if no line
    * information has been associated with the source.
@@ -237,7 +233,7 @@
    * @return the line information associated with the source
    */
   LineInfo getLineInfo(Source source) => _lineInfoMap[source];
-  
+
   /**
    * Return {@code true} if an error with the given error code has been gathered.
    * @param errorCode the error code being searched for
@@ -251,7 +247,7 @@
     }
     return false;
   }
-  
+
   /**
    * Return {@code true} if at least one error has been gathered.
    * @return {@code true} if at least one error has been gathered
@@ -265,7 +261,7 @@
     }
     _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
@@ -274,7 +270,7 @@
   void setLineInfo(Source source, List<int> lineStarts) {
     _lineInfoMap[source] = new LineInfo(lineStarts);
   }
-  
+
   /**
    * Set the line information associated with the given source to the given information.
    * @param source the source with which the line information is associated
@@ -283,7 +279,7 @@
   void setLineInfo2(Source source, LineInfo lineInfo) {
     _lineInfoMap[source] = lineInfo;
   }
-  
+
   /**
    * Return {@code true} if the two errors are equivalent.
    * @param firstError the first error being compared
@@ -291,7 +287,7 @@
    * @return {@code true} if the two errors are equivalent
    */
   bool equals3(AnalysisError firstError, AnalysisError secondError) => identical(firstError.errorCode, secondError.errorCode) && firstError.offset == secondError.offset && firstError.length == secondError.length && equals4(firstError.source, secondError.source);
-  
+
   /**
    * Return {@code true} if the two sources are equivalent.
    * @param firstSource the first source being compared
@@ -306,7 +302,7 @@
     }
     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
@@ -349,7 +345,7 @@
     }
     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 {@code true}, otherwise return {@code false}without modifying the list.
@@ -367,13 +363,12 @@
     return true;
   }
 }
-
 /**
  * The class {@code EngineTestCase} defines utility methods for making assertions.
  */
 class EngineTestCase extends JUnitTestCase {
   static int _PRINT_RANGE = 6;
-  
+
   /**
    * Assert that the tokens in the actual stream of tokens have the same types and lexemes as the
    * tokens in the expected stream of tokens. Note that this does not assert anything about the
@@ -391,7 +386,7 @@
       right = right.next;
     }
   }
-  
+
   /**
    * Assert that the array of actual values contain exactly the same values as those in the array of
    * expected value, with the exception that the order of the elements is not required to be the
@@ -421,7 +416,7 @@
       }
     }
   }
-  
+
   /**
    * Assert that a given String is equal to an expected value.
    * @param expected the expected String value
@@ -447,7 +442,7 @@
       JUnitTestCase.assertEqualsMsg(message, expected, actual);
     }
   }
-  
+
   /**
    * Assert that the given list is non-{@code null} and has exactly expected elements.
    * @param list the list being tested
@@ -470,7 +465,7 @@
       }
     }
   }
-  
+
   /**
    * Assert that the given array is non-{@code null} and has exactly expected elements.
    * @param array the array being tested
@@ -494,7 +489,7 @@
       }
     }
   }
-  
+
   /**
    * Assert that the given list is non-{@code null} and has exactly expected elements.
    * @param set the list being tested
@@ -516,7 +511,7 @@
       }
     }
   }
-  
+
   /**
    * Assert that the given object is an instance of the expected class.
    * @param expectedClass the class that the object is expected to be an instance of
@@ -530,7 +525,7 @@
     }
     return object as Object;
   }
-  
+
   /**
    * Assert that the given array is non-{@code null} and has the expected number of elements.
    * @param expectedLength the expected number of elements
@@ -545,7 +540,7 @@
       JUnitTestCase.fail("Expected array of length ${expectedLength}; contained ${array.length} elements");
     }
   }
-  
+
   /**
    * Assert that the actual token has the same type and lexeme as the expected token. Note that this
    * does not assert anything about the offsets of the tokens (although the lengths will be equal).
@@ -563,7 +558,7 @@
       JUnitTestCase.assertEquals(((expectedToken as StringToken)).lexeme, ((actualToken as StringToken)).lexeme);
     }
   }
-  
+
   /**
    * Assert that the given list is non-{@code null} and has the expected number of elements.
    * @param expectedSize the expected number of elements
@@ -578,7 +573,7 @@
       JUnitTestCase.fail("Expected list of size ${expectedSize}; contained ${list.length} elements");
     }
   }
-  
+
   /**
    * Assert that the given map is non-{@code null} and has the expected number of elements.
    * @param expectedSize the expected number of elements
@@ -593,7 +588,7 @@
       JUnitTestCase.fail("Expected map of size ${expectedSize}; contained ${map.length} elements");
     }
   }
-  
+
   /**
    * Assert that the given set is non-{@code null} and has the expected number of elements.
    * @param expectedSize the expected number of elements
@@ -608,7 +603,7 @@
       JUnitTestCase.fail("Expected set of size ${expectedSize}; contained ${set.length} elements");
     }
   }
-  
+
   /**
    * Convert the given array of lines into a single source string.
    * @param lines the lines to be merged into a single source string
@@ -621,7 +616,7 @@
     }
     return writer.toString();
   }
-  
+
   /**
    * Calculate the offset where the given strings differ.
    * @param str1 the first String to compare
@@ -647,7 +642,7 @@
     context.sourceFactory = new SourceFactory.con2([]);
     return context;
   }
-  
+
   /**
    * Return the getter in the given type with the given name. Inherited getters are ignored.
    * @param type the type in which the getter is declared
@@ -663,7 +658,7 @@
     JUnitTestCase.fail("Could not find getter named ${getterName} in ${type.displayName}");
     return null;
   }
-  
+
   /**
    * Return the method in the given type with the given name. Inherited methods are ignored.
    * @param type the type in which the method is declared
diff --git a/pkg/http/lib/src/utils.dart b/pkg/http/lib/src/utils.dart
index 7be3938..9125ddc 100644
--- a/pkg/http/lib/src/utils.dart
+++ b/pkg/http/lib/src/utils.dart
@@ -113,11 +113,14 @@
 /// characters.
 bool isPlainAscii(String string) => _ASCII_ONLY.hasMatch(string);
 
-/// Converts [input] into a [Uint8List]. If [input] is a [ByteArray] or
-/// [ByteArrayViewable], this just returns a view on [input].
+/// Converts [input] into a [Uint8List]. If [input] is a [TypedData], this just
+/// returns a view on [input].
 Uint8List toUint8List(List<int> input) {
   if (input is Uint8List) return input;
-  if (input is ByteData) return new Uint8List.view(input.buffer);
+  if (input is TypedData) {
+    // TODO(nweiz): remove this "as" check when issue 11080 is fixed.
+    return new Uint8List.view((input as TypedData).buffer);
+  }
   var output = new Uint8List(input.length);
   output.setRange(0, input.length, input);
   return output;
diff --git a/pkg/scheduled_test/lib/src/descriptor/async_descriptor.dart b/pkg/scheduled_test/lib/src/descriptor/async_descriptor.dart
index 79092dc..e46e17b 100644
--- a/pkg/scheduled_test/lib/src/descriptor/async_descriptor.dart
+++ b/pkg/scheduled_test/lib/src/descriptor/async_descriptor.dart
@@ -33,11 +33,5 @@
   Future validateNow([String parent]) =>
     future.then((entry) => entry.validateNow(parent));
 
-  Stream<List<int>> load(String path) => errorStream("AsyncDescriptors don't "
-      "support load().");
-
-  Stream<List<int>> read() => errorStream("AsyncDescriptors don't support "
-      "read().");
-
   String describe() => "async descriptor";
 }
diff --git a/pkg/scheduled_test/lib/src/descriptor/descriptor.dart b/pkg/scheduled_test/lib/src/descriptor/descriptor.dart
index 1dc2c94..82342c4 100644
--- a/pkg/scheduled_test/lib/src/descriptor/descriptor.dart
+++ b/pkg/scheduled_test/lib/src/descriptor/descriptor.dart
@@ -35,6 +35,12 @@
   /// need to be caught, since otherwise they'd be registered by the schedule.
   Future validateNow([String parent]);
 
+  /// Returns a detailed tree-style description of [this].
+  String describe();
+}
+
+/// An interface for descriptors that can load the contents of sub-descriptors.
+abstract class LoadableDescriptor implements Descriptor {
   /// Treats [this] as an in-memory filesystem and returns a stream of the
   /// contents of the child entry located at [path]. This only works if [this]
   /// is a directory entry. This operation is not [schedule]d.
@@ -44,16 +50,15 @@
   ///
   /// All errors in loading the file will be passed through the returned
   /// [Stream].
-  Stream<List<int>> load(String pathToLoad) => errorStream("Can't load "
-      "'$pathToLoad' from within '$name': not a directory.");
+  Stream<List<int>> load(String pathToLoad);
+}
 
+/// An interface for descriptors whose contents can be read.
+abstract class ReadableDescriptor implements Descriptor {
   /// Returns the contents of [this] as a stream. This only works if [this] is a
   /// file entry. This operation is not [schedule]d.
   ///
   /// All errors in loading the file will be passed through the returned
   /// [Stream].
   Stream<List<int>> read();
-
-  /// Returns a detailed tree-style description of [this].
-  String describe();
 }
diff --git a/pkg/scheduled_test/lib/src/descriptor/directory_descriptor.dart b/pkg/scheduled_test/lib/src/descriptor/directory_descriptor.dart
index 97f8c92..f5a2f4f 100644
--- a/pkg/scheduled_test/lib/src/descriptor/directory_descriptor.dart
+++ b/pkg/scheduled_test/lib/src/descriptor/directory_descriptor.dart
@@ -17,7 +17,7 @@
 final path.Builder _path = new path.Builder(style: path.Style.posix);
 
 /// A descriptor describing a directory containing multiple files.
-class DirectoryDescriptor extends Descriptor {
+class DirectoryDescriptor extends Descriptor implements LoadableDescriptor {
   /// The entries contained within this directory. This is intentionally
   /// mutable.
   final List<Descriptor> contents;
@@ -59,35 +59,41 @@
   Stream<List<int>> load(String pathToLoad) {
     return futureStream(new Future.value().then((_) {
       if (_path.isAbsolute(pathToLoad)) {
-        throw "Can't load absolute path '$pathToLoad'.";
+        throw new ArgumentError("Can't load absolute path '$pathToLoad'.");
       }
 
       var split = _path.split(_path.normalize(pathToLoad));
       if (split.isEmpty || split.first == '.' || split.first == '..') {
-        throw "Can't load '$pathToLoad' from within '$name'.";
+        throw new ArgumentError("Can't load '$pathToLoad' from within "
+            "'$name'.");
       }
 
-      var matchingEntries = contents.where((entry) =>
-          entry.name == split.first).toList();
+      var requiresReadable = split.length == 1;
+      var matchingEntries = contents.where((entry) {
+        return entry.name == split.first && (requiresReadable ?
+            entry is ReadableDescriptor :
+            entry is LoadableDescriptor);
+      }).toList();
 
+      var adjective = requiresReadable ? 'readable' : 'loadable';
       if (matchingEntries.length == 0) {
-        throw "Couldn't find an entry named '${split.first}' within '$name'.";
+        throw "Couldn't find a $adjective entry named '${split.first}' within "
+            "'$name'.";
       } else if (matchingEntries.length > 1) {
-        throw "Found multiple entries named '${split.first}' within '$name'.";
+        throw "Found multiple $adjective entries named '${split.first}' within "
+            "'$name'.";
       } else {
         var remainingPath = split.sublist(1);
         if (remainingPath.isEmpty) {
-          return matchingEntries.first.read();
+          return (matchingEntries.first as ReadableDescriptor).read();
         } else {
-          return matchingEntries.first.load(_path.joinAll(remainingPath));
+          return (matchingEntries.first as LoadableDescriptor)
+              .load(_path.joinAll(remainingPath));
         }
       }
     }));
   }
 
-  Stream<List<int>> read() => errorStream("Can't read the contents of '$name': "
-      "is a directory.");
-
   String describe() {
     if (contents.isEmpty) return name;
 
diff --git a/pkg/scheduled_test/lib/src/descriptor/file_descriptor.dart b/pkg/scheduled_test/lib/src/descriptor/file_descriptor.dart
index f6927e9..a215a4b 100644
--- a/pkg/scheduled_test/lib/src/descriptor/file_descriptor.dart
+++ b/pkg/scheduled_test/lib/src/descriptor/file_descriptor.dart
@@ -16,7 +16,7 @@
 import '../utils.dart';
 
 /// A descriptor describing a single file.
-class FileDescriptor extends Descriptor {
+abstract class FileDescriptor extends Descriptor implements ReadableDescriptor {
   /// The contents of the file, in bytes.
   final List<int> contents;
 
@@ -82,7 +82,7 @@
       : super._(name, contents);
 
   Future _validateNow(List<int> actualContents) {
-    if (orderedIterableEquals(contents, actualContents)) return;
+    if (orderedIterableEquals(contents, actualContents)) return null;
     // TODO(nweiz): show a hex dump here if the data is small enough.
     throw "File '$name' didn't contain the expected binary data.";
   }
@@ -93,7 +93,7 @@
       : super._(name, encodeUtf8(contents));
 
   Future _validateNow(List<int> actualContents) {
-    if (orderedIterableEquals(contents, actualContents)) return;
+    if (orderedIterableEquals(contents, actualContents)) return null;
     throw _textMismatchMessage(textContents,
         new String.fromCharCodes(actualContents));
   }
diff --git a/pkg/scheduled_test/lib/src/descriptor/nothing_descriptor.dart b/pkg/scheduled_test/lib/src/descriptor/nothing_descriptor.dart
index 1cc47f5..471508b 100644
--- a/pkg/scheduled_test/lib/src/descriptor/nothing_descriptor.dart
+++ b/pkg/scheduled_test/lib/src/descriptor/nothing_descriptor.dart
@@ -37,11 +37,5 @@
     }
   });
 
-  Stream<List<int>> load(String pathToLoad) => errorStream("Nothing "
-      "descriptors don't support load().");
-
-  Stream<List<int>> read() => errorStream("Nothing descriptors don't support "
-      "read().");
-
   String describe() => "nothing at '$name'";
 }
diff --git a/pkg/scheduled_test/lib/src/descriptor/pattern_descriptor.dart b/pkg/scheduled_test/lib/src/descriptor/pattern_descriptor.dart
index 7eb0c61..60364f5 100644
--- a/pkg/scheduled_test/lib/src/descriptor/pattern_descriptor.dart
+++ b/pkg/scheduled_test/lib/src/descriptor/pattern_descriptor.dart
@@ -112,10 +112,4 @@
 
   Future create([String parent]) => new Future.error(
       new UnsupportedError("Pattern descriptors don't support create()."));
-
-  Stream<List<int>> load(String pathToLoad) => errorStream(
-      new UnsupportedError("Pattern descriptors don't support load()."));
-
-  Stream<List<int>> read() => errorStream(new UnsupportedError("Pattern "
-      "descriptors don't support read()."));
 }
diff --git a/pkg/scheduled_test/lib/src/scheduled_future_matchers.dart b/pkg/scheduled_test/lib/src/scheduled_future_matchers.dart
index 599613d..fcdaacb 100644
--- a/pkg/scheduled_test/lib/src/scheduled_future_matchers.dart
+++ b/pkg/scheduled_test/lib/src/scheduled_future_matchers.dart
@@ -21,7 +21,7 @@
 /// This differs from the `completes` matcher in `unittest` in that it pipes any
 /// errors in the Future to [currentSchedule], rather than reporting them in the
 /// [expect]'s error message.
-Matcher completes = const _ScheduledCompletes(null, null);
+final Matcher completes = const _ScheduledCompletes(null, null);
 
 /// Matches a [Future] that completes succesfully with a value that matches
 /// [matcher]. Note that this creates an asynchronous expectation. The call to
diff --git a/pkg/scheduled_test/test/descriptor/async_test.dart b/pkg/scheduled_test/test/descriptor/async_test.dart
index 1726345..961f528 100644
--- a/pkg/scheduled_test/test/descriptor/async_test.dart
+++ b/pkg/scheduled_test/test/descriptor/async_test.dart
@@ -121,23 +121,4 @@
           matches(r"^Directory not found: '[^']+[\\/]dir'\.$"));
     });
   }, passing: ['test 2']);
-
-  expectTestsPass("async().load() fails", () {
-    test('test', () {
-      scheduleSandbox();
-
-      expect(d.async(new Future.value(d.file('name.txt')))
-              .load('path').toList(),
-          throwsA(equals("AsyncDescriptors don't support load().")));
-    });
-  });
-
-  expectTestsPass("async().read() fails", () {
-    test('test', () {
-      scheduleSandbox();
-
-      expect(d.async(new Future.value(d.file('name.txt'))).read().toList(),
-          throwsA(equals("AsyncDescriptors don't support read().")));
-    });
-  });
 }
diff --git a/pkg/scheduled_test/test/descriptor/directory_test.dart b/pkg/scheduled_test/test/descriptor/directory_test.dart
index e54b191..16536b6 100644
--- a/pkg/scheduled_test/test/descriptor/directory_test.dart
+++ b/pkg/scheduled_test/test/descriptor/directory_test.dart
@@ -291,14 +291,6 @@
     });
   });
 
-  expectTestsPass("directory().read() fails", () {
-    test('test', () {
-      var dir = d.dir('dir', [d.file('name.txt', 'contents')]);
-      expect(dir.read().toList(),
-          throwsA(equals("Can't read the contents of 'dir': is a directory.")));
-    });
-  });
-
   expectTestsPass("directory().load() fails to load a nested directory", () {
     test('test', () {
       var dir = d.dir('dir', [
@@ -309,8 +301,8 @@
       ]);
 
       expect(dir.load('subdir').toList(),
-          throwsA(equals("Can't read the contents of 'subdir': is a "
-              "directory.")));
+          throwsA(equals("Couldn't find a readable entry named 'subdir' within "
+              "'dir'.")));
     });
   });
 
@@ -318,8 +310,7 @@
     test('test', () {
       var dir = d.dir('dir', [d.file('name.txt', 'contents')]);
 
-      expect(dir.load('/name.txt').toList(),
-          throwsA(equals("Can't load absolute path '/name.txt'.")));
+      expect(dir.load('/name.txt').toList(), throwsArgumentError);
     });
   });
 
@@ -327,14 +318,11 @@
     test('test', () {
       var dir = d.dir('dir', [d.file('name.txt', 'contents')]);
 
-      expect(dir.load('.').toList(),
-          throwsA(equals("Can't load '.' from within 'dir'.")));
+      expect(dir.load('.').toList(), throwsArgumentError);
 
-      expect(dir.load('..').toList(),
-          throwsA(equals("Can't load '..' from within 'dir'.")));
+      expect(dir.load('..').toList(), throwsArgumentError);
 
-      expect(dir.load('').toList(),
-          throwsA(equals("Can't load '' from within 'dir'.")));
+      expect(dir.load('').toList(), throwsArgumentError);
     });
   });
 
@@ -344,8 +332,8 @@
       var dir = d.dir('dir', [d.file('name.txt', 'contents')]);
 
       expect(dir.load('not-name.txt').toList(),
-          throwsA(equals("Couldn't find an entry named 'not-name.txt' within "
-              "'dir'.")));
+          throwsA(equals("Couldn't find a readable entry named 'not-name.txt' "
+              "within 'dir'.")));
     });
   });
 
@@ -358,8 +346,21 @@
       ]);
 
       expect(dir.load('name.txt').toList(),
-          throwsA(equals("Found multiple entries named 'name.txt' within "
-              "'dir'.")));
+          throwsA(equals("Found multiple readable entries named 'name.txt' "
+              "within 'dir'.")));
+    });
+  });
+
+  expectTestsPass("directory().load() loads a file next to a subdirectory with "
+      "the same name", () {
+    test('test', () {
+      var dir = d.dir('dir', [
+        d.file('name', 'contents'),
+        d.dir('name', [d.file('subfile', 'contents')])
+      ]);
+
+      expect(byteStreamToString(dir.load('name')),
+          completion(equals('contents')));
     });
   });
 
diff --git a/pkg/scheduled_test/test/descriptor/file_test.dart b/pkg/scheduled_test/test/descriptor/file_test.dart
index 958f431..96d4418 100644
--- a/pkg/scheduled_test/test/descriptor/file_test.dart
+++ b/pkg/scheduled_test/test/descriptor/file_test.dart
@@ -114,14 +114,6 @@
     });
   });
 
-  expectTestsPass("file().load() throws an error", () {
-    test('test', () {
-      expect(d.file('name.txt', 'contents').load('path').toList(),
-          throwsA(equals("Can't load 'path' from within 'name.txt': not a "
-                         "directory.")));
-    });
-  });
-
   expectTestsPass("file().describe() returns the filename", () {
     test('test', () {
       expect(d.file('name.txt', 'contents').describe(), equals('name.txt'));
@@ -230,6 +222,7 @@
       expect(errors, everyElement(new isInstanceOf<ScheduleError>()));
       expect(errors.map((e) => e.error.message), equals([
         "Expected: contains 'baaz'\n     But: was 'barfoobaz'.\n"
+        "Actual: 'barfoobaz'"
       ]), verbose: true);
     });
   }, passing: ['test 2']);
@@ -271,6 +264,7 @@
       expect(errors.map((e) => e.error.message), equals([
         "Expected: contains <12>\n"
         "     But: was [98, 97, 114, 102, 111, 111, 98, 97, 122].\n"
+        "Actual: [98, 97, 114, 102, 111, 111, 98, 97, 122]"
       ]), verbose: true);
     });
   }, passing: ['test 2']);
diff --git a/pkg/scheduled_test/test/descriptor/nothing_test.dart b/pkg/scheduled_test/test/descriptor/nothing_test.dart
index 902fc4e..0e62334 100644
--- a/pkg/scheduled_test/test/descriptor/nothing_test.dart
+++ b/pkg/scheduled_test/test/descriptor/nothing_test.dart
@@ -84,22 +84,4 @@
               r"directory\.$"));
     });
   }, passing: ['test 2']);
-
-  expectTestsPass("nothing().load() fails", () {
-    test('test', () {
-      scheduleSandbox();
-
-      expect(d.nothing('name.txt').load('path').toList(),
-          throwsA(equals("Nothing descriptors don't support load().")));
-    });
-  });
-
-  expectTestsPass("nothing().read() fails", () {
-    test('test', () {
-      scheduleSandbox();
-
-      expect(d.nothing('name.txt').read().toList(),
-          throwsA(equals("Nothing descriptors don't support read().")));
-    });
-  });
 }
\ No newline at end of file
diff --git a/pkg/stack_trace/lib/src/frame.dart b/pkg/stack_trace/lib/src/frame.dart
index 335bfba..8f1931b 100644
--- a/pkg/stack_trace/lib/src/frame.dart
+++ b/pkg/stack_trace/lib/src/frame.dart
@@ -21,9 +21,15 @@
   final Uri uri;
 
   /// The line number on which the code location is located.
+  ///
+  /// This can be null, indicating that the line number is unknown or
+  /// unimportant.
   final int line;
 
   /// The column number of the code location.
+  ///
+  /// This can be null, indicating that the column number is unknown or
+  /// unimportant.
   final int column;
 
   /// The name of the member in which the code location occurs.
@@ -53,11 +59,8 @@
   }
 
   /// A human-friendly description of the code location.
-  ///
-  /// For Dart core libraries, this will omit the line and column information,
-  /// since those are useless for baked-in libraries.
   String get location {
-    if (isCore) return library;
+    if (line == null || column == null) return library;
     return '$library $line:$column';
   }
 
diff --git a/pkg/stack_trace/lib/src/trace.dart b/pkg/stack_trace/lib/src/trace.dart
index 4ed1563..db0e70b 100644
--- a/pkg/stack_trace/lib/src/trace.dart
+++ b/pkg/stack_trace/lib/src/trace.dart
@@ -10,7 +10,7 @@
 import 'frame.dart';
 import 'lazy_trace.dart';
 
-final _patchRegExp = new RegExp(r"-patch$");
+final _terseRegExp = new RegExp(r"(-patch)?(/.*)?$");
 
 /// A stack trace, comprised of a list of stack frames.
 class Trace implements StackTrace {
@@ -79,15 +79,16 @@
   /// native stack traces.
   String get fullStackTrace => toString();
 
-  /// Returns a terser version of [this]. This is accomplished by folding
-  /// together multiple stack frames from the core library, as in [foldFrames].
-  /// Core library patches are also renamed to remove their `-patch` suffix.
+  /// Returns a terser version of [this].
+  ///
+  /// This is accomplished by folding together multiple stack frames from the
+  /// core library, as in [foldFrames]. Remaining core library frames have their
+  /// libraries, "-patch" suffixes, and line numbers removed.
   Trace get terse {
     return new Trace(foldFrames((frame) => frame.isCore).frames.map((frame) {
       if (!frame.isCore) return frame;
-      var library = frame.library.replaceAll(_patchRegExp, '');
-      return new Frame(
-          Uri.parse(library), frame.line, frame.column, frame.member);
+      var library = frame.library.replaceAll(_terseRegExp, '');
+      return new Frame(Uri.parse(library), null, null, frame.member);
     }));
   }
 
diff --git a/pkg/stack_trace/test/frame_test.dart b/pkg/stack_trace/test/frame_test.dart
index 512f6d0..d1f53f6 100644
--- a/pkg/stack_trace/test/frame_test.dart
+++ b/pkg/stack_trace/test/frame_test.dart
@@ -59,13 +59,13 @@
     expect(() => new Frame.parse(''), throwsFormatException);
     expect(() => new Frame.parse('#1'), throwsFormatException);
     expect(() => new Frame.parse('#1      Foo'), throwsFormatException);
-    expect(() => new Frame.parse('#1      Foo (dart:async)'),
+    expect(() => new Frame.parse('#1      Foo (dart:async/future.dart)'),
         throwsFormatException);
-    expect(() => new Frame.parse('#1      Foo (dart:async:10)'),
+    expect(() => new Frame.parse('#1      Foo (dart:async/future.dart:10)'),
         throwsFormatException);
-    expect(() => new Frame.parse('#1      (dart:async:10:15)'),
+    expect(() => new Frame.parse('#1      (dart:async/future.dart:10:15)'),
         throwsFormatException);
-    expect(() => new Frame.parse('Foo (dart:async:10:15)'),
+    expect(() => new Frame.parse('Foo (dart:async/future.dart:10:15)'),
         throwsFormatException);
   });
 
@@ -75,9 +75,12 @@
 
     expect(isCore('dart:core'), isTrue);
     expect(isCore('dart:async'), isTrue);
+    expect(isCore('dart:core/uri.dart'), isTrue);
+    expect(isCore('dart:async/future.dart'), isTrue);
     expect(isCore('bart:core'), isFalse);
     expect(isCore('sdart:core'), isFalse);
     expect(isCore('darty:core'), isFalse);
+    expect(isCore('bart:core/uri.dart'), isFalse);
   });
 
   group('.caller()', () {
@@ -104,8 +107,8 @@
 
   group('.library', () {
     test('returns the URI string for non-file URIs', () {
-      expect(new Frame.parse('#0 Foo (dart:async:0:0)').library,
-          equals('dart:async'));
+      expect(new Frame.parse('#0 Foo (dart:async/future.dart:0:0)').library,
+          equals('dart:async/future.dart'));
       expect(new Frame.parse('#0 Foo '
               '(http://dartlang.org/stuff/thing.dart:0:0)').library,
           equals('http://dartlang.org/stuff/thing.dart'));
@@ -128,18 +131,12 @@
       expect(new Frame.parse('#0 Foo ($uri:1:2)').location,
           equals('${path.join('foo', 'bar.dart')} 1:2'));
     });
-
-    test('just returns the library for core libraries', () {
-      expect(new Frame.parse('#0 Foo (dart:core:5:10)').location,
-          equals('dart:core'));
-      expect(new Frame.parse('#0 Foo (dart:async-patch:1:2)').location,
-          equals('dart:async-patch'));
-    });
   });
 
   group('.package', () {
     test('returns null for non-package URIs', () {
-      expect(new Frame.parse('#0 Foo (dart:async:0:0)').package, isNull);
+      expect(new Frame.parse('#0 Foo (dart:async/future.dart:0:0)').package,
+          isNull);
       expect(new Frame.parse('#0 Foo '
               '(http://dartlang.org/stuff/thing.dart:0:0)').package,
           isNull);
@@ -161,15 +158,10 @@
           equals('http://dartlang.org/thing.dart 5:10 in Foo'));
     });
 
-    test('just returns the library for core libraries', () {
-      expect(new Frame.parse('#0 Foo (dart:core:5:10)').toString(),
-          equals('dart:core in Foo'));
-    });
-
     test('converts "<anonymous closure>" to "<fn>"', () {
-      expect(new Frame.parse('#0 Foo.<anonymous closure> (dart:core:5:10)')
-              .toString(),
-          equals('dart:core in Foo.<fn>'));
+      expect(new Frame.parse('#0 Foo.<anonymous closure> '
+              '(dart:core/uri.dart:5:10)').toString(),
+          equals('dart:core/uri.dart 5:10 in Foo.<fn>'));
     });
   });
 }
diff --git a/pkg/stack_trace/test/trace_test.dart b/pkg/stack_trace/test/trace_test.dart
index afd5700..902ae80 100644
--- a/pkg/stack_trace/test/trace_test.dart
+++ b/pkg/stack_trace/test/trace_test.dart
@@ -35,13 +35,13 @@
   test('parses a stack trace correctly', () {
     var trace = new Trace.parse('''
 #0      Foo._bar (file:///home/nweiz/code/stuff.dart:42:21)
-#1      zip.<anonymous closure>.zap (dart:async:0:2)
+#1      zip.<anonymous closure>.zap (dart:async/future.dart:0:2)
 #2      zip.<anonymous closure>.zap (http://pub.dartlang.org/thing.dart:1:100)
 ''');
 
     expect(trace.frames[0].uri,
         equals(Uri.parse("file:///home/nweiz/code/stuff.dart")));
-    expect(trace.frames[1].uri, equals(Uri.parse("dart:async")));
+    expect(trace.frames[1].uri, equals(Uri.parse("dart:async/future.dart")));
     expect(trace.frames[2].uri,
         equals(Uri.parse("http://pub.dartlang.org/thing.dart")));
   });
@@ -94,13 +94,13 @@
     var uri = pathToFileUri(path.join('foo', 'bar.dart'));
     var trace = new Trace.parse('''
 #0      Foo._bar ($uri:42:21)
-#1      zip.<anonymous closure>.zap (dart:async:0:2)
+#1      zip.<anonymous closure>.zap (dart:async/future.dart:0:2)
 #2      zip.<anonymous closure>.zap (http://pub.dartlang.org/thing.dart:1:100)
 ''');
 
     expect(trace.toString(), equals('''
 ${path.join('foo', 'bar.dart')} 42:21                        Foo._bar
-dart:async                                zip.<fn>.zap
+dart:async/future.dart 0:2                zip.<fn>.zap
 http://pub.dartlang.org/thing.dart 1:100  zip.<fn>.zap
 '''));
   });
@@ -118,11 +118,11 @@
   test('.terse folds core frames together bottom-up', () {
     var trace = new Trace.parse('''
 #0 notCore (foo.dart:42:21)
-#1 top (dart:async:0:2)
-#2 bottom (dart:core:1:100)
+#1 top (dart:async/future.dart:0:2)
+#2 bottom (dart:core/uri.dart:1:100)
 #3 alsoNotCore (bar.dart:10:20)
 #4 top (dart:io:5:10)
-#5 bottom (dart:async-patch:9:11)
+#5 bottom (dart:async-patch/future.dart:9:11)
 ''');
 
     expect(trace.terse.toString(), equals('''
@@ -139,16 +139,16 @@
 #1 fooTop (bar.dart:0:2)
 #2 fooBottom (foo.dart:1:100)
 #3 alsoNotFoo (bar.dart:10:20)
-#4 fooTop (dart:io:5:10)
-#5 fooBottom (dart:async-patch:9:11)
+#4 fooTop (dart:io/socket.dart:5:10)
+#5 fooBottom (dart:async-patch/future.dart:9:11)
 ''');
 
     var folded = trace.foldFrames((frame) => frame.member.startsWith('foo'));
     expect(folded.toString(), equals('''
-foo.dart 42:21    notFoo
-foo.dart 1:100    fooBottom
-bar.dart 10:20    alsoNotFoo
-dart:async-patch  fooBottom
+foo.dart 42:21                     notFoo
+foo.dart 1:100                     fooBottom
+bar.dart 10:20                     alsoNotFoo
+dart:async-patch/future.dart 9:11  fooBottom
 '''));
   });
 }
diff --git a/pkg/unittest/lib/src/core_matchers.dart b/pkg/unittest/lib/src/core_matchers.dart
index 1c8d2f6..25767e3 100644
--- a/pkg/unittest/lib/src/core_matchers.dart
+++ b/pkg/unittest/lib/src/core_matchers.dart
@@ -86,7 +86,9 @@
  * recursion depth [limit] can be provided. The default limit is 100.
  */
 Matcher equals(expected, [limit=100]) =>
-    new _DeepMatcher(expected, limit);
+    expected is String
+        ? new _StringEqualsMatcher(expected) 
+        : new _DeepMatcher(expected, limit);
 
 class _DeepMatcher extends BaseMatcher {
   final _expected;
@@ -206,6 +208,84 @@
     mismatchDescription.add(_match(_expected, item));
 }
 
+/** A special equality matcher for strings. */
+class _StringEqualsMatcher extends BaseMatcher {
+  final String _value;
+
+  _StringEqualsMatcher(this._value);
+
+  bool get showActualValue => true;
+
+  bool matches(item, MatchState mismatchState) => _value == item;
+
+  Description describe(Description description) =>
+      description.addDescriptionOf(_value);
+
+  Description describeMismatch(item, Description mismatchDescription,
+      MatchState matchState, bool verbose) {
+    if (item is! String) {
+      return mismatchDescription.addDescriptionOf(item).add(' not a string');
+    } else {
+      var buff = new StringBuffer();
+      buff.write('Strings are not equal.');
+      var escapedItem = _escape(item);
+      var escapedValue = _escape(_value);
+      int minLength = escapedItem.length < escapedValue.length ?
+          escapedItem.length : escapedValue.length;
+      int start;
+      for (start = 0; start < minLength; start++) {
+        if (escapedValue.codeUnitAt(start) != escapedItem.codeUnitAt(start)) {
+          break;
+        }
+      }
+      if (start == minLength) {
+        if (escapedValue.length < escapedItem.length) {
+          buff.write(' Both strings start the same, but the given value also'
+              ' has the following trailing characters: ');
+          _writeTrailing(buff, escapedItem, escapedValue.length);
+        } else {
+          buff.write(' Both strings start the same, but the given value is'
+              ' missing the following trailing characters: ');
+          _writeTrailing(buff, escapedValue, escapedItem.length);
+        }
+      } else {
+        buff.write('\nExpected: ');
+        _writeLeading(buff, escapedValue, start);
+        _writeTrailing(buff, escapedValue, start);
+        buff.write('\n  Actual: ');
+        _writeLeading(buff, escapedItem, start);
+        _writeTrailing(buff, escapedItem, start);
+        buff.write('\n          ');
+        for (int i = (start > 10 ? 14 : start); i > 0; i--) buff.write(' ');
+        buff.write('^\n Differ at position $start');
+      }
+
+      return mismatchDescription.replace(buff.toString());
+    }
+  }
+
+  static String _escape(String s) =>
+      s.replaceAll('\n', '\\n').replaceAll('\r', '\\r').replaceAll('\t', '\\t');
+
+  static String _writeLeading(StringBuffer buff, String s, int start) {
+    if (start > 10) {
+      buff.write('... ');
+      buff.write(s.substring(start - 10, start));
+    } else {
+      buff.write(s.substring(0, start));
+    }
+  }
+
+  static String _writeTrailing(StringBuffer buff, String s, int start) {
+    if (start + 10 > s.length) {
+      buff.write(s.substring(start));
+    } else {
+      buff.write(s.substring(start, start + 10));
+      buff.write(' ...');
+    }
+  }
+}
+
 /** A matcher that matches any value. */
 const Matcher anything = const _IsAnything();
 
diff --git a/pkg/unittest/lib/src/expect.dart b/pkg/unittest/lib/src/expect.dart
index f10309d..562eb24 100644
--- a/pkg/unittest/lib/src/expect.dart
+++ b/pkg/unittest/lib/src/expect.dart
@@ -144,9 +144,7 @@
   description.add('     But: ')
       .add(mismatchDescription.toString()).add('.\n');
 
-  if (!mismatchDescription.toString().startsWith("was ")) {
-    description.add('Actual: ').addDescriptionOf(actual);
-  }
+  description.add('Actual: ').addDescriptionOf(actual);
   if (reason != null) {
     description.add(reason).add('\n');
   }
diff --git a/pkg/unittest/lib/src/future_matchers.dart b/pkg/unittest/lib/src/future_matchers.dart
index 6067451..f92625a 100644
--- a/pkg/unittest/lib/src/future_matchers.dart
+++ b/pkg/unittest/lib/src/future_matchers.dart
@@ -13,7 +13,7 @@
  * To test that a Future completes with an exception, you can use [throws] and
  * [throwsA].
  */
-Matcher completes = const _Completes(null, '');
+final Matcher completes = const _Completes(null, '');
 
 /**
  * Matches a [Future] that completes succesfully with a value that matches
diff --git a/pkg/unittest/test/instance_test.dart b/pkg/unittest/test/instance_test.dart
index bda0561..1d165d8 100644
--- a/pkg/unittest/test/instance_test.dart
+++ b/pkg/unittest/test/instance_test.dart
@@ -13,7 +13,7 @@
   group('Type Matchers', () {
     test('isInstanceOf', () {
       shouldFail(0, new isInstanceOf<String>('String'),
-          "Expected: an instance of String But: was <0>.");
+          "Expected: an instance of String But: was <0>. Actual: <0>");
       shouldPass('cow', new isInstanceOf<String>('String'));
     });
 
diff --git a/pkg/unittest/test/matchers_test.dart b/pkg/unittest/test/matchers_test.dart
index 4e53e16..e623c5a 100644
--- a/pkg/unittest/test/matchers_test.dart
+++ b/pkg/unittest/test/matchers_test.dart
@@ -20,30 +20,36 @@
 
     test('isTrue', () {
       shouldPass(true, isTrue);
-      shouldFail(false, isTrue, "Expected: true But: was <false>.");
+      shouldFail(false, isTrue, "Expected: true But: was <false>. "
+          "Actual: <false>");
     });
 
     test('isFalse', () {
       shouldPass(false, isFalse);
-      shouldFail(10, isFalse, "Expected: false But: was <10>.");
-      shouldFail(true, isFalse, "Expected: false But: was <true>.");
+      shouldFail(10, isFalse, "Expected: false But: was <10>. "
+          "Actual: <10>");
+      shouldFail(true, isFalse, "Expected: false But: was <true>. "
+          "Actual: <true>");
     });
 
     test('isNull', () {
       shouldPass(null, isNull);
-      shouldFail(false, isNull, "Expected: null But: was <false>.");
+      shouldFail(false, isNull, "Expected: null But: was <false>. "
+          "Actual: <false>");
     });
 
     test('isNotNull', () {
       shouldPass(false, isNotNull);
-      shouldFail(null, isNotNull, "Expected: not null But: was <null>.");
+      shouldFail(null, isNotNull, "Expected: not null But: was <null>. "
+          "Actual: <null>");
     });
 
     test('same', () {
       var a = new Map();
       var b = new Map();
       shouldPass(a, same(a));
-      shouldFail(b, same(a), "Expected: same instance as {} But: was {}.");
+      shouldFail(b, same(a), "Expected: same instance as {} But: was {}. "
+          "Actual: {}");
     });
 
     test('equals', () {
@@ -58,7 +64,8 @@
       shouldPass(0, anything);
       shouldPass(null, anything);
       shouldPass(a, anything);
-      shouldFail(a, isNot(anything), "Expected: not anything But: was {}.");
+      shouldFail(a, isNot(anything), "Expected: not anything "
+          "But: was {}. Actual: {}");
     });
 
     test('throws', () {
@@ -121,7 +128,7 @@
     test('scalar type mismatch', () {
       shouldFail('error', equals(5.1),
           "Expected: <5.1> "
-          "But: was 'error'.");
+          "But: was 'error'. Actual: 'error'");
     });
 
     test('nested type mismatch', () {
@@ -145,64 +152,67 @@
     test('greaterThan', () {
       shouldPass(10, greaterThan(9));
       shouldFail(9, greaterThan(10),
-        "Expected: a value greater than <10> But: was <9>.");
+        "Expected: a value greater than <10> But: was <9>. Actual: <9>");
     });
 
     test('greaterThanOrEqualTo', () {
       shouldPass(10, greaterThanOrEqualTo(10));
       shouldFail(9, greaterThanOrEqualTo(10),
-        "Expected: a value greater than or equal to <10> But: was <9>.");
+        "Expected: a value greater than or equal to <10> But: was <9>. "
+        "Actual: <9>");
     });
 
     test('lessThan', () {
       shouldFail(10, lessThan(9), "Expected: a value less than <9> "
-          "But: was <10>.");
+          "But: was <10>. Actual: <10>");
       shouldPass(9, lessThan(10));
     });
 
     test('lessThanOrEqualTo', () {
       shouldPass(10, lessThanOrEqualTo(10));
       shouldFail(11, lessThanOrEqualTo(10),
-        "Expected: a value less than or equal to <10> But: was <11>.");
+        "Expected: a value less than or equal to <10> But: was <11>. "
+        "Actual: <11>");
     });
 
     test('isZero', () {
       shouldPass(0, isZero);
-      shouldFail(1, isZero, "Expected: a value equal to <0> But: was <1>.");
+      shouldFail(1, isZero, "Expected: a value equal to <0> But: was <1>."
+          " Actual: <1>");
     });
 
     test('isNonZero', () {
       shouldFail(0, isNonZero, "Expected: a value not equal to <0> "
-          "But: was <0>.");
+          "But: was <0>. Actual: <0>");
       shouldPass(1, isNonZero);
     });
 
     test('isPositive', () {
       shouldFail(-1, isPositive, "Expected: a positive value "
-          "But: was <-1>.");
+          "But: was <-1>. Actual: <-1>");
       shouldFail(0, isPositive, "Expected: a positive value "
-          "But: was <0>.");
+          "But: was <0>. Actual: <0>");
       shouldPass(1, isPositive);
     });
 
     test('isNegative', () {
       shouldPass(-1, isNegative);
       shouldFail(0, isNegative,
-          "Expected: a negative value But: was <0>.");
+          "Expected: a negative value But: was <0>. Actual: <0>");
     });
 
     test('isNonPositive', () {
       shouldPass(-1, isNonPositive);
       shouldPass(0, isNonPositive);
       shouldFail(1, isNonPositive,
-          "Expected: a non-positive value But: was <1>.");
+          "Expected: a non-positive value But: was <1>. Actual: <1>");
     });
 
     test('isNonNegative', () {
       shouldPass(1, isNonNegative);
       shouldPass(0, isNonNegative);
       shouldFail(-1, isNonNegative,
-        "Expected: a non-negative value But: was <-1>.");
+        "Expected: a non-negative value But: was <-1>. Actual: <-1>");
     });
 
     test('closeTo', () {
@@ -222,29 +232,29 @@
     test('inInclusiveRange', () {
       shouldFail(-1, inInclusiveRange(0,2),
           "Expected: be in range from 0 (inclusive) to 2 (inclusive) "
-          "But: was <-1>.");
+          "But: was <-1>. Actual: <-1>");
       shouldPass(0, inInclusiveRange(0,2));
       shouldPass(1, inInclusiveRange(0,2));
       shouldPass(2, inInclusiveRange(0,2));
       shouldFail(3, inInclusiveRange(0,2),
           "Expected: be in range from 0 (inclusive) to 2 (inclusive) "
-          "But: was <3>.");
+          "But: was <3>. Actual: <3>");
     });
 
     test('inExclusiveRange', () {
       shouldFail(0, inExclusiveRange(0,2),
           "Expected: be in range from 0 (exclusive) to 2 (exclusive) "
-          "But: was <0>.");
+          "But: was <0>. Actual: <0>");
       shouldPass(1, inExclusiveRange(0,2));
       shouldFail(2, inExclusiveRange(0,2),
           "Expected: be in range from 0 (exclusive) to 2 (exclusive) "
-          "But: was <2>.");
+          "But: was <2>. Actual: <2>");
     });
 
     test('inOpenClosedRange', () {
       shouldFail(0, inOpenClosedRange(0,2),
           "Expected: be in range from 0 (exclusive) to 2 (inclusive) "
-          "But: was <0>.");
+          "But: was <0>. Actual: <0>");
       shouldPass(1, inOpenClosedRange(0,2));
       shouldPass(2, inOpenClosedRange(0,2));
     });
@@ -254,7 +264,7 @@
       shouldPass(1, inClosedOpenRange(0,2));
       shouldFail(2, inClosedOpenRange(0,2),
           "Expected: be in range from 0 (inclusive) to 2 (exclusive) "
-          "But: was <2>.");
+          "But: was <2>. Actual: <2>");
     });
   });
 
@@ -263,22 +273,23 @@
     test('isEmpty', () {
       shouldPass('', isEmpty);
       shouldFail(null, isEmpty,
-          "Expected: empty But: was <null>.");
+          "Expected: empty But: was <null>. Actual: <null>");
       shouldFail(0, isEmpty,
-          "Expected: empty But: was <0>.");
-      shouldFail('a', isEmpty, "Expected: empty But: was 'a'.");
+          "Expected: empty But: was <0>. Actual: <0>");
+      shouldFail('a', isEmpty, "Expected: empty But: was 'a'. Actual: 'a'");
     });
 
     test('equalsIgnoringCase', () {
       shouldPass('hello', equalsIgnoringCase('HELLO'));
       shouldFail('hi', equalsIgnoringCase('HELLO'),
-          "Expected: 'HELLO' ignoring case But: was 'hi'.");
+          "Expected: 'HELLO' ignoring case But: was 'hi'. Actual: 'hi'");
     });
 
     test('equalsIgnoringWhitespace', () {
       shouldPass(' hello   world  ', equalsIgnoringWhitespace('hello world'));
       shouldFail(' helloworld  ', equalsIgnoringWhitespace('hello world'),
-          "Expected: 'hello world' ignoring whitespace But: was 'helloworld'.");
+          "Expected: 'hello world' ignoring whitespace "
+          "But: was 'helloworld'. Actual: ' helloworld '");
     });
 
     test('startsWith', () {
@@ -286,7 +297,8 @@
       shouldPass('hello', startsWith('hell'));
       shouldPass('hello', startsWith('hello'));
       shouldFail('hello', startsWith('hello '),
-          "Expected: a string starting with 'hello ' But: was 'hello'.");
+          "Expected: a string starting with 'hello ' "
+          "But: was 'hello'. Actual: 'hello'");
     });
 
     test('endsWith', () {
@@ -294,7 +306,8 @@
       shouldPass('hello', endsWith('lo'));
       shouldPass('hello', endsWith('hello'));
       shouldFail('hello', endsWith(' hello'),
-          "Expected: a string ending with ' hello' But: was 'hello'.");
+          "Expected: a string ending with ' hello' "
+          "But: was 'hello'. Actual: 'hello'");
     });
 
     test('contains', () {
@@ -304,7 +317,7 @@
       shouldPass('hello', contains('hell'));
       shouldPass('hello', contains('hello'));
       shouldFail('hello', contains(' '),
-          "Expected: contains ' ' But: was 'hello'.");
+          "Expected: contains ' ' But: was 'hello'. Actual: 'hello'");
     });
 
     test('stringContainsInOrder', () {
@@ -323,14 +336,14 @@
       shouldFail('goodbye cruel world',
         stringContainsInOrder(['goo', 'cruel', 'bye']),
         "Expected: a string containing 'goo', 'cruel', 'bye' in order "
-        "But: was 'goodbye cruel world'.");
+        "But: was 'goodbye cruel world'. Actual: 'goodbye cruel world'");
     });
 
     test('matches', () {
       shouldPass('c0d', matches('[a-z][0-9][a-z]'));
       shouldPass('c0d', matches(new RegExp('[a-z][0-9][a-z]')));
       shouldFail('cOd', matches('[a-z][0-9][a-z]'),
-          "Expected: match '[a-z][0-9][a-z]' But: was 'cOd'.");
+          "Expected: match '[a-z][0-9][a-z]' But: was 'cOd'. Actual: 'cOd'");
     });
   });
 
@@ -338,19 +351,20 @@
 
     test('isEmpty', () {
       shouldPass([], isEmpty);
-      shouldFail([1], isEmpty, "Expected: empty But: was [1].");
+      shouldFail([1], isEmpty, "Expected: empty But: was [1]. Actual: [1]");
     });
 
     test('contains', () {
       var d = [1, 2];
       shouldPass(d, contains(1));
-      shouldFail(d, contains(0), "Expected: contains <0> But: was [1, 2].");
+      shouldFail(d, contains(0), "Expected: contains <0> "
+          "But: was [1, 2]. Actual: [1, 2]");
     });
 
     test('isIn', () {
       var d = [1, 2];
       shouldPass(1, isIn(d));
-      shouldFail(0, isIn(d), "Expected: is in [1, 2] But: was <0>.");
+      shouldFail(0, isIn(d), "Expected: is in [1, 2] But: was <0>. Actual: <0>");
     });
 
     test('everyElement', () {
@@ -367,7 +381,7 @@
       var e = [1, 1, 1];
       shouldPass(d, someElement(2));
       shouldFail(e, someElement(2),
-          "Expected: some element <2> But: was [1, 1, 1].");
+          "Expected: some element <2> But: was [1, 1, 1]. Actual: [1, 1, 1]");
     });
 
     test('orderedEquals', () {
@@ -430,7 +444,8 @@
       shouldPass({}, isEmpty);
       shouldPass(a, isEmpty);
       a['foo'] = 'bar';
-      shouldFail(a, isEmpty, "Expected: empty But: was {'foo': 'bar'}.");
+      shouldFail(a, isEmpty, "Expected: empty But: was {'foo': 'bar'}. "
+          "Actual: {'foo': 'bar'}");
     });
 
     test('equals', () {
@@ -487,9 +502,9 @@
       var b = new Map();
       shouldPass(a, contains('foo'));
       shouldFail(b, contains('foo'),
-          "Expected: contains 'foo' But: was {}.");
+          "Expected: contains 'foo' But: was {}. Actual: {}");
       shouldFail(10, contains('foo'),
-          "Expected: contains 'foo' But: was <10>.");
+          "Expected: contains 'foo' But: was <10>. Actual: <10>");
     });
 
     test('containsValue', () {
@@ -497,7 +512,8 @@
       a['foo'] = 'bar';
       shouldPass(a, containsValue('bar'));
       shouldFail(a, containsValue('ba'),
-          "Expected: contains value 'ba' But: was {'foo': 'bar'}.");
+          "Expected: contains value 'ba' But: was {'foo': 'bar'}. "
+          "Actual: {'foo': 'bar'}");
     });
 
     test('containsPair', () {
@@ -506,7 +522,8 @@
       shouldPass(a, containsPair('foo', 'bar'));
       shouldFail(a, containsPair('foo', 'ba'),
           "Expected: contains pair 'foo' => 'ba' "
-          "But:  contains key 'foo' but with value was 'bar'. "
+          "But: Strings are not equal. Both strings start the same, "
+          "but the given value also has the following trailing characters: r. "
           "Actual: {'foo': 'bar'}");
       shouldFail(a, containsPair('fo', 'bar'),
           "Expected: contains pair 'fo' => 'bar' "
@@ -530,7 +547,7 @@
 
     test('anyOf', () {
       shouldFail(0, anyOf([equals(1), equals(2)]),
-          "Expected: (<1> or <2>) But: was <0>.");
+          "Expected: (<1> or <2>) But: was <0>. Actual: <0>");
       shouldPass(1, anyOf([equals(1), equals(2)]));
     });
 
@@ -538,7 +555,7 @@
       shouldPass(1, allOf([lessThan(10), greaterThan(0)]));
       shouldFail(-1, allOf([lessThan(10), greaterThan(0)]),
           "Expected: (a value less than <10> and a value greater than <0>) "
-          "But: was <-1> (wasn't a value greater than <0>).");
+          "But: was <-1> (wasn't a value greater than <0>). Actual: <-1>");
     });
   });
 
@@ -598,7 +615,8 @@
       var completer = new Completer();
       completer.completeError('X');
       shouldFail(completer.future, throwsA(equals('Y')),
-          "Expected: 'Y' But: was 'X'.",
+          "Expected: 'Y' But: Strings are not equal. "
+          "Expected: Y Actual: X ^ Differ at position 0. Actual: 'X'",
           isAsync: true);
     });
   });
@@ -606,7 +624,7 @@
   group('Predicate Matchers', () {
     test('isInstanceOf', () {
       shouldFail(0, predicate((x) => x is String, "an instance of String"),
-          "Expected: an instance of String But: was <0>.");
+          "Expected: an instance of String But: was <0>. Actual: <0>");
       shouldPass('cow', predicate((x) => x is String, "an instance of String"));
     });
   });
diff --git a/pkg/unittest/test/matchers_unminified_test.dart b/pkg/unittest/test/matchers_unminified_test.dart
index 7435a0c..51629ca 100644
--- a/pkg/unittest/test/matchers_unminified_test.dart
+++ b/pkg/unittest/test/matchers_unminified_test.dart
@@ -105,7 +105,9 @@
       var d = new SimpleIterable(0);
       var e = new SimpleIterable(1);
       shouldPass(d, isEmpty);
-      shouldFail(e, isEmpty, "Expected: empty But: was SimpleIterable:[1].");
+      shouldFail(e, isEmpty, "Expected: empty "
+          "But: was SimpleIterable:[1]. "
+          "Actual: SimpleIterable:[1]");
     });
 
     test('contains', () {
@@ -113,7 +115,8 @@
       shouldPass(d, contains(2));
       shouldFail(d, contains(5),
           "Expected: contains <5> "
-          "But: was SimpleIterable:[3, 2, 1].");
+          "But: was SimpleIterable:[3, 2, 1]. "
+          "Actual: SimpleIterable:[3, 2, 1]");
     });
   });
 
diff --git a/pkg/unittest/test/unittest_test.dart b/pkg/unittest/test/unittest_test.dart
index cc28d9e..d6486c4 100644
--- a/pkg/unittest/test/unittest_test.dart
+++ b/pkg/unittest/test/unittest_test.dart
@@ -405,7 +405,7 @@
   var tests = {
     'single correct test': buildStatusString(1, 0, 0, 'single correct test'),
     'single failing test': buildStatusString(0, 1, 0, 'single failing test',
-        message: 'Expected: <5> But: was <4>.'),
+        message: 'Expected: <5> But: was <4>. Actual: <4>'),
     'exception test': buildStatusString(0, 1, 0, 'exception test',
         message: 'Caught Exception: Fail.'),
     'group name test': buildStatusString(2, 0, 0, 'a a::a b b'),
@@ -427,7 +427,7 @@
         message: 'Callback called (2) after test case testOne has already '
                  'been marked as pass.:testTwo:'),
     'middle exception test': buildStatusString(2, 1, 0,
-        'testOne::testTwo:Expected: false But: was <true>.:testThree'),
+        'testOne::testTwo:Expected: false But: was <true>. Actual: <true>:testThree'),
     'async setup/teardown test': buildStatusString(2, 0, 3,
         'good setup/good teardown foo1::'
         'good setup/bad teardown foo2:good setup/bad teardown '
@@ -440,13 +440,13 @@
     'test returning future': buildStatusString(2, 4, 0,
         'successful::'
         'error1:Callback called more times than expected (1).:'
-        'fail1:Expected: <false> But: was <true>.:'
+        'fail1:Expected: <false> But: was <true>. Actual: <true>:'
         'error2:Callback called more times than expected (1).:'
         'fail2:failure:'
         'foo5'),
     'test returning future using runAsync': buildStatusString(2, 4, 0,
         'successful::'
-        'fail1:Expected: <false> But: was <true>.:'
+        'fail1:Expected: <false> But: was <true>. Actual: <true>:'
         'error1:Callback called more times than expected (1).:'
         'fail2:failure:'
         'error2:Callback called more times than expected (1).:'
diff --git a/pkg/yaml/lib/src/yaml_map.dart b/pkg/yaml/lib/src/yaml_map.dart
index 303d8ed..aa8397c 100644
--- a/pkg/yaml/lib/src/yaml_map.dart
+++ b/pkg/yaml/lib/src/yaml_map.dart
@@ -36,7 +36,7 @@
   Iterable get values => _map.values;
   int get length => _map.length;
   bool get isEmpty => _map.isEmpty;
-  bool get isNotEmpty => map.isNotEmpty;
+  bool get isNotEmpty => _map.isNotEmpty;
   String toString() => _map.toString();
 
   int get hashCode => hashCodeFor(_map);
diff --git a/runtime/bin/bin.gypi b/runtime/bin/bin.gypi
index 8b0db92..03c75c6 100644
--- a/runtime/bin/bin.gypi
+++ b/runtime/bin/bin.gypi
@@ -184,23 +184,18 @@
       'include_dirs': [
         '..',
       ],
+      'includes': [
+        'io_impl_sources.gypi',
+      ],
       'sources': [
         'io_natives.h',
         'io_natives.cc',
       ],
       'conditions': [
-        [ 'dart_io_support==1', {
+        ['dart_io_support==1', {
           'dependencies': [
             'bin/net/ssl.gyp:libssl_dart',
           ],
-          'includes': [
-            'io_impl_sources.gypi',
-          ],
-        },
-        {
-          'includes': [
-            'io_impl_sources_no_nss.gypi',
-          ],
         }],
         ['OS=="win"', {
           # TODO(antonm): fix the implementation.
@@ -343,7 +338,6 @@
     {
       'target_name': 'generate_resources_cc_file',
       'type': 'none',
-      'toolsets':['target', 'host'],
       'includes': [
         'vmstats_sources.gypi',
       ],
@@ -372,13 +366,12 @@
       # dart binary with a snapshot of corelibs built in.
       'target_name': 'dart',
       'type': 'executable',
-      'toolsets':['target'],
       'dependencies': [
         'libdart',
         'libdart_builtin',
         'libdart_io',
         'generate_snapshot_file#host',
-        'generate_resources_cc_file#host',
+        'generate_resources_cc_file',
       ],
       'include_dirs': [
         '..',
@@ -442,12 +435,11 @@
       # dart binary without any snapshot built in.
       'target_name': 'dart_no_snapshot',
       'type': 'executable',
-      'toolsets':['target'],
       'dependencies': [
         'libdart_withcore',
         'libdart_builtin',
         'libdart_io',
-        'generate_resources_cc_file#host',
+        'generate_resources_cc_file',
       ],
       'include_dirs': [
         '..',
@@ -655,8 +647,15 @@
           'include_dirs': [
             '..',
           ],
+          'cflags!': [
+            '-Wnon-virtual-dtor',
+            '-Woverloaded-virtual',
+            '-fno-rtti',
+            '-fvisibility-inlines-hidden',
+            '-Wno-conversion-null',
+          ],
           'sources': [
-            'test_extension.cc',
+            'test_extension.c',
             'test_extension_dllmain_win.cc',
           ],
           'defines': [
diff --git a/runtime/bin/builtin.dart b/runtime/bin/builtin.dart
index bae6952..716ec71 100644
--- a/runtime/bin/builtin.dart
+++ b/runtime/bin/builtin.dart
@@ -3,6 +3,43 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library builtin;
+import 'dart:io';
+
+int _httpRequestResponseCode = 0;
+String _httpRequestStatusString;
+var _httpRequestResponse;
+
+void _requestCompleted(HttpClientResponseBody body) {
+  _httpRequestResponseCode = body.statusCode;
+  _httpRequestStatusString = '${body.statusCode} ${body.reasonPhrase}';
+  _httpRequestResponse = null;
+  if (body.statusCode != 200 || body.type == "json") {
+    return;
+  }
+  _httpRequestResponse = body.body;
+}
+
+void _requestFailed(error) {
+  _httpRequestResponseCode = 0;
+  _httpRequestStatusString = error.toString();
+  _httpRequestResponse = null;
+}
+
+HttpClient _client = new HttpClient();
+void _makeHttpRequest(String uri) {
+  _httpRequestResponseCode = 0;
+  _httpRequestStatusString = null;
+  _httpRequestResponse = null;
+  Uri requestUri = Uri.parse(uri);
+  _client.getUrl(requestUri)
+      .then((HttpClientRequest request) => request.close())
+      .then(HttpBodyHandler.processResponse)
+      .then((HttpClientResponseBody body) {
+        _requestCompleted(body);
+      }).catchError((error) {
+        _requestFailed(error);
+      });
+}
 
 // Corelib 'print' implementation.
 void _print(arg) {
@@ -36,6 +73,12 @@
 }
 
 String _resolveScriptUri(String cwd, String scriptName, bool isWindows) {
+  var scriptUri = Uri.parse(scriptName);
+  if (scriptUri.scheme == 'http') {
+    _entrypoint = scriptUri;
+    _logResolution("# Resolved script to: $_entrypoint");
+    return _entrypoint.toString();
+  }
   _logResolution("# Current working directory: $cwd");
   _logResolution("# ScriptName: $scriptName");
   if (isWindows) {
@@ -159,7 +202,11 @@
   if (_packageRoot != null) {
     path = "${_packageRoot}${uri.path}";
   } else {
-    path = _entrypoint.resolve('packages/${uri.path}').path;
+    if (_entrypoint.scheme == 'http') {
+      path = _entrypoint.resolve('packages/${uri.path}').toString();
+    } else {
+      path = _entrypoint.resolve('packages/${uri.path}').path;
+    }
   }
 
   _logResolution("# Package: $path");
@@ -170,18 +217,3 @@
   _logResolution('# Path: $uri');
   return uri.toString();
 }
-
-String _pathFromHttpUri(String userUri) {
-  var uri = Uri.parse(userUri);
-  return uri.path;
-}
-
-String _domainFromHttpUri(String userUri) {
-  var uri = Uri.parse(userUri);
-  return uri.domain;
-}
-
-int _portFromHttpUri(String userUri) {
-  var uri = Uri.parse(userUri);
-  return uri.port == 0 ? 80 : uri.port;
-}
diff --git a/runtime/bin/crypto.cc b/runtime/bin/crypto.cc
index cd707dd..af3d386b4a 100644
--- a/runtime/bin/crypto.cc
+++ b/runtime/bin/crypto.cc
@@ -26,7 +26,7 @@
     delete[] buffer;
     Dart_ThrowException(DartUtils::NewDartOSError());
   }
-  Dart_Handle result = Dart_NewTypedData(kUint8, count);
+  Dart_Handle result = Dart_NewTypedData(Dart_TypedData_kUint8, count);
   if (Dart_IsError(result)) {
     delete[] buffer;
     Dart_Handle error = DartUtils::NewString("Failed to allocate storage.");
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index 9e26305..fc90469 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -242,74 +242,12 @@
 }
 
 
-// Writes string into socket.
-// Return < 0 indicates an error.
-// Return >= 0 number of bytes written.
-static intptr_t SocketWriteString(intptr_t socket, const char* str,
-                                  intptr_t len) {
-    int r;
-    intptr_t cursor = 0;
-    do {
-      r = Socket::Write(socket, &str[cursor], len);
-      if (r < 0) {
-        return r;
-      }
-      cursor += r;
-      len -= r;
-    } while (len > 0);
-    ASSERT(len == 0);
-    return cursor;
-}
-
-
-static uint8_t* SocketReadUntilEOF(intptr_t socket, intptr_t* response_len) {
-  const intptr_t kInitialBufferSize = 16 * KB;
-  intptr_t buffer_size = kInitialBufferSize;
-  uint8_t* buffer = reinterpret_cast<uint8_t*>(malloc(buffer_size));
-  ASSERT(buffer != NULL);
-  intptr_t buffer_cursor = 0;
-  do {
-    int bytes_read = Socket::Read(socket, &buffer[buffer_cursor],
-                                      buffer_size - buffer_cursor - 1);
-    if (bytes_read < 0) {
-      free(buffer);
-      return NULL;
-    }
-
-    buffer_cursor += bytes_read;
-
-    if (bytes_read == 0) {
-      *response_len = buffer_cursor;
-      buffer[buffer_cursor] = '\0';
-      break;
-    }
-
-    // There is still more data to be read, check that we have room in the
-    // buffer for more data.
-    if (buffer_cursor == buffer_size - 1) {
-      // Buffer is full. Increase buffer size.
-      buffer_size *= 2;
-      buffer = reinterpret_cast<uint8_t*>(realloc(buffer, buffer_size));
-      ASSERT(buffer != NULL);
-    }
-  } while (true);
-  return buffer;
-}
-
-
-static bool HttpGetRequestOkay(const char* response) {
-  static const char* kOkayReply = "HTTP/1.0 200 OK";
-  static const intptr_t kOkayReplyLen = strlen(kOkayReply);
-  return (strncmp(response, kOkayReply, kOkayReplyLen) == 0);
-}
-
-
-static const uint8_t* HttpRequestGetPayload(const char* response) {
-  const char* split = strstr(response, "\r\n\r\n");
-  if (split != NULL) {
-    return reinterpret_cast<const uint8_t*>(split+4);
-  }
-  return NULL;
+static Dart_Handle SingleArgDart_Invoke(Dart_Handle arg, Dart_Handle lib,
+                                        const char* method) {
+  const int kNumArgs = 1;
+  Dart_Handle dart_args[kNumArgs];
+  dart_args[0] = arg;
+  return Dart_Invoke(lib, DartUtils::NewString(method), kNumArgs, dart_args);
 }
 
 
@@ -322,133 +260,93 @@
   *error_msg = msg
 
 
-static const uint8_t* HttpGetRequest(const char* host, const char* path,
-                                     int port, intptr_t* response_len,
-                                     const char** error_msg) {
-  OSError* error = NULL;
-  SocketAddresses* addresses = Socket::LookupAddress(host, -1, &error);
-  if (addresses == NULL || addresses->count() == 0) {
-    SET_ERROR_MSG(error_msg, "Unable to resolve %s", host);
-    return NULL;
-  }
-
-  int preferred_address = 0;
-  for (int i = 0; i < addresses->count(); i++) {
-    SocketAddress* address = addresses->GetAt(i);
-    if (address->GetType() == SocketAddress::ADDRESS_LOOPBACK_IP_V4) {
-      // Prefer the IP_V4 loop back.
-      preferred_address = i;
-      break;
-    }
-  }
-
-  RawAddr addr = addresses->GetAt(preferred_address)->addr();
-  intptr_t tcp_client = Socket::Create(addr);
-  if (tcp_client < 0) {
-    SET_ERROR_MSG(error_msg, "Unable to create socket to %s:%d", host, port);
-    return NULL;
-  }
-  Socket::Connect(tcp_client, addr, port);
-  if (tcp_client < 0) {
-    SET_ERROR_MSG(error_msg, "Unable to connect to %s:%d", host, port);
-    return NULL;
-  }
-  // Send get request.
-  {
-    const char* format =
-        "GET %s HTTP/1.0\r\nUser-Agent: Dart VM\r\nHost: %s\r\n\r\n";
-    intptr_t len = snprintf(NULL, 0, format, path, host);
-    char* get_request = reinterpret_cast<char*>(malloc(len + 1));
-    snprintf(get_request, len + 1, format, path, host);
-    intptr_t r = SocketWriteString(tcp_client, get_request, len);
-    free(get_request);
-    if (r < len) {
-      SET_ERROR_MSG(error_msg, "Unable to write to %s:%d - %d", host, port,
-                    static_cast<int>(r));
-      Socket::Close(tcp_client);
-      return NULL;
-    }
-    ASSERT(r == len);
-  }
-  // Consume response.
-  uint8_t* response = SocketReadUntilEOF(tcp_client, response_len);
-  // Close socket.
-  Socket::Close(tcp_client);
-  if (response == NULL) {
-    SET_ERROR_MSG(error_msg, "Unable to read from %s:%d", host, port);
-    return NULL;
-  }
-  if (HttpGetRequestOkay(reinterpret_cast<const char*>(response)) == false) {
-    SET_ERROR_MSG(error_msg, "Invalid HTTP response from %s:%d", host, port);
-    free(response);
-    return NULL;
-  }
-  return response;
-}
-
-
-static Dart_Handle ParseHttpUri(const char* script_uri, const char** host_str,
-                                int64_t* port_int, const char** path_str) {
-  ASSERT(script_uri != NULL);
-  ASSERT(host_str != NULL);
-  ASSERT(port_int != NULL);
-  ASSERT(path_str != NULL);
-  Dart_Handle result;
-  Dart_Handle uri = DartUtils::NewString(script_uri);
-  Dart_Handle builtin_lib =
-      Builtin::LoadAndCheckLibrary(Builtin::kBuiltinLibrary);
-  Dart_Handle path = DartUtils::PathFromUri(uri, builtin_lib);
-  if (Dart_IsError(path)) {
-    return path;
-  }
-  Dart_Handle host = DartUtils::DomainFromUri(uri, builtin_lib);
-  if (Dart_IsError(host)) {
-    return host;
-  }
-  Dart_Handle port = DartUtils::PortFromUri(uri, builtin_lib);
-  if (Dart_IsError(port)) {
-    return port;
-  }
-  result = Dart_StringToCString(path, path_str);
+Dart_Handle MakeHttpRequest(Dart_Handle uri, Dart_Handle builtin_lib,
+                            uint8_t** buffer, intptr_t* buffer_len) {
+  const intptr_t HttpResponseCodeOK = 200;
+  ASSERT(buffer != NULL);
+  ASSERT(buffer_len != NULL);
+  ASSERT(!Dart_HasLivePorts());
+  SingleArgDart_Invoke(uri, builtin_lib, "_makeHttpRequest");
+  // Run until all ports to isolate are closed.
+  Dart_Handle result = Dart_RunLoop();
   if (Dart_IsError(result)) {
     return result;
   }
-  result = Dart_StringToCString(host, host_str);
-  if (Dart_IsError(result)) {
-    return result;
+  intptr_t responseCode =
+    DartUtils::GetIntegerField(builtin_lib, "_httpRequestResponseCode");
+  if (responseCode != HttpResponseCodeOK) {
+    // Return error.
+    Dart_Handle responseStatus =
+        Dart_GetField(builtin_lib,
+                      DartUtils::NewString("_httpRequestStatusString"));
+    if (Dart_IsError(responseStatus)) {
+      return responseStatus;
+    }
+    if (Dart_IsNull(responseStatus)) {
+      return Dart_Error("HTTP error.");
+    }
+    return Dart_Error(DartUtils::GetStringValue(responseStatus));
   }
-  if (DartUtils::GetInt64Value(port, port_int) == false) {
-    return Dart_Error("Invalid port");
+  Dart_Handle response =
+    Dart_GetField(builtin_lib, DartUtils::NewString("_httpRequestResponse"));
+  if (Dart_IsError(response)) {
+    return response;
+  }
+  if (Dart_IsString(response)) {
+    // Received response as string.
+    uint8_t* responseString = NULL;
+    intptr_t responseStringLength;
+    Dart_Handle r = Dart_StringToUTF8(response, &responseString,
+                                      &responseStringLength);
+    if (Dart_IsError(r)) {
+      *buffer = NULL;
+      *buffer_len = 0;
+      return r;
+    }
+    // Get payload as bytes.
+    *buffer_len = responseStringLength;
+    *buffer = reinterpret_cast<uint8_t*>(malloc(responseStringLength));
+    memmove(*buffer, responseString, responseStringLength);
+  } else {
+    // Received response as list of bytes.
+    ASSERT(Dart_IsList(response));
+    // Query list length.
+    result = Dart_ListLength(response, buffer_len);
+    if (Dart_IsError(result)) {
+      *buffer_len = 0;
+      *buffer = NULL;
+      return result;
+    }
+    // Get payload as bytes.
+    *buffer = reinterpret_cast<uint8_t*>(malloc(*buffer_len));
+    result = Dart_ListGetAsBytes(response, 0, *buffer, *buffer_len);
+    if (Dart_IsError(result)) {
+      free(*buffer);
+      *buffer_len = 0;
+      *buffer = NULL;
+      return result;
+    }
   }
   return result;
 }
 
 
 Dart_Handle DartUtils::ReadStringFromHttp(const char* script_uri) {
-  const char* host_str = NULL;
-  int64_t port_int = 0;
-  const char* path_str = NULL;
-  Dart_Handle result = ParseHttpUri(script_uri, &host_str, &port_int,
-                                    &path_str);
+  Dart_Handle uri = NewString(script_uri);
+  if (Dart_IsError(uri)) {
+    return uri;
+  }
+  Dart_Handle builtin_lib =
+      Builtin::LoadAndCheckLibrary(Builtin::kBuiltinLibrary);
+  uint8_t* buffer;
+  intptr_t bufferLen;
+  Dart_Handle result = MakeHttpRequest(uri, builtin_lib, &buffer, &bufferLen);
   if (Dart_IsError(result)) {
     return result;
   }
-  const char* error_msg = NULL;
-  intptr_t len;
-  const uint8_t* text_buffer = HttpGetRequest(host_str, path_str, port_int,
-                                              &len, &error_msg);
-  if (text_buffer == NULL) {
-    return Dart_Error(error_msg);
-  }
-  const uint8_t* payload = HttpRequestGetPayload(
-      reinterpret_cast<const char*>(text_buffer));
-  if (payload == NULL) {
-    return Dart_Error("Invalid HTTP response.");
-  }
-  // Subtract HTTP response from length.
-  len -= (payload-text_buffer);
-  ASSERT(len >= 0);
-  Dart_Handle str = Dart_NewStringFromUTF8(payload, len);
+  Dart_Handle str = Dart_NewStringFromUTF8(buffer,
+                                           bufferLen);
+  free(buffer);
   return str;
 }
 
@@ -512,32 +410,6 @@
 }
 
 
-static Dart_Handle SingleArgDart_Invoke(Dart_Handle arg, Dart_Handle lib,
-                                        const char* method) {
-  const int kNumArgs = 1;
-  Dart_Handle dart_args[kNumArgs];
-  dart_args[0] = arg;
-  return Dart_Invoke(lib, DartUtils::NewString(method), kNumArgs, dart_args);
-}
-
-Dart_Handle DartUtils::PathFromUri(Dart_Handle script_uri,
-                                   Dart_Handle builtin_lib) {
-  return SingleArgDart_Invoke(script_uri, builtin_lib, "_pathFromHttpUri");
-}
-
-
-Dart_Handle DartUtils::DomainFromUri(Dart_Handle script_uri,
-                                     Dart_Handle builtin_lib) {
-  return SingleArgDart_Invoke(script_uri, builtin_lib, "_domainFromHttpUri");
-}
-
-
-Dart_Handle DartUtils::PortFromUri(Dart_Handle script_uri,
-                                   Dart_Handle builtin_lib) {
-  return SingleArgDart_Invoke(script_uri, builtin_lib, "_portFromHttpUri");
-}
-
-
 Dart_Handle DartUtils::ResolveUri(Dart_Handle library_url,
                                   Dart_Handle url,
                                   Dart_Handle builtin_lib) {
@@ -576,7 +448,7 @@
   bool is_dart_extension_url = DartUtils::IsDartExtensionSchemeURL(url_string);
 
   // Handle URI canonicalization requests.
-  if (tag == kCanonicalizeUrl) {
+  if (tag == Dart_kCanonicalizeUrl) {
     // If this is a Dart Scheme URL or 'part' of a io library
     // then it is not modified as it will be handled internally.
     if (is_dart_scheme_url || is_io_library) {
@@ -594,25 +466,25 @@
 
   // Handle 'import' of dart scheme URIs (i.e they start with 'dart:').
   if (is_dart_scheme_url) {
-    if (tag == kImportTag) {
+    if (tag == Dart_kImportTag) {
       // Handle imports of other built-in libraries present in the SDK.
       if (DartUtils::IsDartIOLibURL(url_string)) {
         return Builtin::LoadAndCheckLibrary(Builtin::kIOLibrary);
       }
       return Dart_Error("Do not know how to load '%s'", url_string);
     } else {
-      ASSERT(tag == kSourceTag);
+      ASSERT(tag == Dart_kSourceTag);
       return Dart_Error("Unable to load source '%s' ", url_string);
     }
   }
 
   // Handle 'part' of IO library.
   if (is_io_library) {
-    if (tag == kSourceTag) {
+    if (tag == Dart_kSourceTag) {
       return Dart_LoadSource(
           library, url, Builtin::PartSource(Builtin::kIOLibrary, url_string));
     } else {
-      ASSERT(tag == kImportTag);
+      ASSERT(tag == Dart_kImportTag);
       return Dart_Error("Unable to import '%s' ", url_string);
     }
   }
@@ -627,7 +499,7 @@
   }
   Dart_StringToCString(file_path, &url_string);
   if (is_dart_extension_url) {
-    if (tag != kImportTag) {
+    if (tag != Dart_kImportTag) {
       return Dart_Error("Dart extensions must use import: '%s'", url_string);
     }
     return Extensions::LoadExtension(url_string, library);
@@ -665,44 +537,22 @@
 }
 
 
-Dart_Handle DartUtils::LoadScriptHttp(const char* script_uri,
+Dart_Handle DartUtils::LoadScriptHttp(Dart_Handle uri,
                                       Dart_Handle builtin_lib) {
-  Dart_Handle uri = NewString(script_uri);
-  if (Dart_IsError(uri)) {
-    return uri;
-  }
-  const char* host_str = NULL;
-  int64_t port_int = 0;
-  const char* path_str = NULL;
-  Dart_Handle result = ParseHttpUri(script_uri, &host_str, &port_int,
-                                    &path_str);
+  intptr_t len = 0;
+  uint8_t* buffer = NULL;
+  Dart_Handle result = MakeHttpRequest(uri, builtin_lib, &buffer, &len);
   if (Dart_IsError(result)) {
     return result;
   }
-  const char* error_msg = NULL;
-  intptr_t len;
-  const uint8_t* text_buffer;
-  text_buffer = HttpGetRequest(host_str, path_str, port_int, &len,
-                               &error_msg);
-  if (text_buffer == NULL) {
-    return Dart_Error(error_msg);
-  }
-  const uint8_t* payload = HttpRequestGetPayload(
-      reinterpret_cast<const char*>(text_buffer));
-  if (payload == NULL) {
-    return Dart_Error("Invalid HTTP response.");
-  }
-  // Subtract HTTP response from length.
-  len -= (payload-text_buffer);
-  ASSERT(len >= 0);
-  // At this point we have received a valid HTTP 200 reply and
-  // payload points at the beginning of the script or snapshot.
+  const uint8_t* payload = buffer;
   bool is_snapshot = false;
   payload = SniffForMagicNumber(payload, &len, &is_snapshot);
   if (is_snapshot) {
     return Dart_LoadScriptFromSnapshot(payload, len);
   } else {
     Dart_Handle source = Dart_NewStringFromUTF8(payload, len);
+    free(buffer);
     if (Dart_IsError(source)) {
       return source;
     }
@@ -713,14 +563,18 @@
 
 Dart_Handle DartUtils::LoadScript(const char* script_uri,
                                   Dart_Handle builtin_lib) {
-  if (DartUtils::IsHttpSchemeURL(script_uri)) {
-    return LoadScriptHttp(script_uri, builtin_lib);
-  }
-  Dart_Handle resolved_script_uri;
-  resolved_script_uri = ResolveScriptUri(NewString(script_uri), builtin_lib);
+  // Always call ResolveScriptUri because as a side effect it sets
+  // the script entry path which is used when automatically resolving
+  // package root.
+  Dart_Handle resolved_script_uri =
+      ResolveScriptUri(NewString(script_uri), builtin_lib);
   if (Dart_IsError(resolved_script_uri)) {
     return resolved_script_uri;
   }
+  // Handle http: requests separately.
+  if (DartUtils::IsHttpSchemeURL(script_uri)) {
+    return LoadScriptHttp(resolved_script_uri, builtin_lib);
+  }
   Dart_Handle script_path = DartUtils::FilePathFromUri(resolved_script_uri,
                                                        builtin_lib);
   if (Dart_IsError(script_path)) {
@@ -778,10 +632,10 @@
   }
   // The tag is either an import or a source tag.
   // Load it according to the specified tag.
-  if (tag == kImportTag) {
+  if (tag == Dart_kImportTag) {
     // Return library object or an error string.
     return Dart_LoadLibrary(url, source);
-  } else if (tag == kSourceTag) {
+  } else if (tag == Dart_kSourceTag) {
     return Dart_LoadSource(library, url, source);
   }
   return Dart_Error("wrong tag");
@@ -876,7 +730,7 @@
   int32_t max = 0x3fffffff;  // 1073741823
   ASSERT(min <= value && value < max);
   Dart_CObject object;
-  object.type = Dart_CObject::kInt32;
+  object.type = Dart_CObject_kInt32;
   object.value.as_int32 = value;
   return Dart_PostCObject(port_id, &object);
 }
@@ -953,9 +807,9 @@
 // objects. As these will be used by different threads the use of
 // these depends on the fact that the marking internally in the
 // Dart_CObject structure is not marking simple value objects.
-Dart_CObject CObject::api_null_ = { Dart_CObject::kNull , { 0 } };
-Dart_CObject CObject::api_true_ = { Dart_CObject::kBool , { true } };
-Dart_CObject CObject::api_false_ = { Dart_CObject::kBool, { false } };
+Dart_CObject CObject::api_null_ = { Dart_CObject_kNull , { 0 } };
+Dart_CObject CObject::api_true_ = { Dart_CObject_kBool , { true } };
+Dart_CObject CObject::api_false_ = { Dart_CObject_kBool, { false } };
 CObject CObject::null_ = CObject(&api_null_);
 CObject CObject::true_ = CObject(&api_true_);
 CObject CObject::false_ = CObject(&api_false_);
@@ -981,7 +835,7 @@
 }
 
 
-Dart_CObject* CObject::New(Dart_CObject::Type type, int additional_bytes) {
+Dart_CObject* CObject::New(Dart_CObject_Type type, int additional_bytes) {
   Dart_CObject* cobject = reinterpret_cast<Dart_CObject*>(
       Dart_ScopeAllocate(sizeof(Dart_CObject) + additional_bytes));
   cobject->type = type;
@@ -990,14 +844,14 @@
 
 
 Dart_CObject* CObject::NewInt32(int32_t value) {
-  Dart_CObject* cobject = New(Dart_CObject::kInt32);
+  Dart_CObject* cobject = New(Dart_CObject_kInt32);
   cobject->value.as_int32 = value;
   return cobject;
 }
 
 
 Dart_CObject* CObject::NewInt64(int64_t value) {
-  Dart_CObject* cobject = New(Dart_CObject::kInt64);
+  Dart_CObject* cobject = New(Dart_CObject_kInt64);
   cobject->value.as_int64 = value;
   return cobject;
 }
@@ -1005,21 +859,21 @@
 
 Dart_CObject* CObject::NewIntptr(intptr_t value) {
   // Pointer values passed as intptr_t are always send as int64_t.
-  Dart_CObject* cobject = New(Dart_CObject::kInt64);
+  Dart_CObject* cobject = New(Dart_CObject_kInt64);
   cobject->value.as_int64 = value;
   return cobject;
 }
 
 
 Dart_CObject* CObject::NewDouble(double value) {
-  Dart_CObject* cobject = New(Dart_CObject::kDouble);
+  Dart_CObject* cobject = New(Dart_CObject_kDouble);
   cobject->value.as_double = value;
   return cobject;
 }
 
 
 Dart_CObject* CObject::NewString(int length) {
-  Dart_CObject* cobject = New(Dart_CObject::kString, length + 1);
+  Dart_CObject* cobject = New(Dart_CObject_kString, length + 1);
   cobject->value.as_string = reinterpret_cast<char*>(cobject + 1);
   return cobject;
 }
@@ -1035,7 +889,7 @@
 
 Dart_CObject* CObject::NewArray(int length) {
   Dart_CObject* cobject =
-      New(Dart_CObject::kArray, length * sizeof(Dart_CObject*));  // NOLINT
+      New(Dart_CObject_kArray, length * sizeof(Dart_CObject*));  // NOLINT
   cobject->value.as_array.length = length;
   cobject->value.as_array.values =
       reinterpret_cast<Dart_CObject**>(cobject + 1);
@@ -1044,8 +898,8 @@
 
 
 Dart_CObject* CObject::NewUint8Array(int length) {
-  Dart_CObject* cobject = New(Dart_CObject::kTypedData, length);
-  cobject->value.as_typed_data.type = Dart_CObject::kUint8Array;
+  Dart_CObject* cobject = New(Dart_CObject_kTypedData, length);
+  cobject->value.as_typed_data.type = Dart_TypedData_kUint8;
   cobject->value.as_typed_data.length = length;
   cobject->value.as_typed_data.values = reinterpret_cast<uint8_t*>(cobject + 1);
   return cobject;
@@ -1055,8 +909,8 @@
 Dart_CObject* CObject::NewExternalUint8Array(
     int64_t length, uint8_t* data, void* peer,
     Dart_WeakPersistentHandleFinalizer callback) {
-  Dart_CObject* cobject = New(Dart_CObject::kExternalTypedData);
-  cobject->value.as_external_typed_data.type = Dart_CObject::kUint8Array;
+  Dart_CObject* cobject = New(Dart_CObject_kExternalTypedData);
+  cobject->value.as_external_typed_data.type = Dart_TypedData_kUint8;
   cobject->value.as_external_typed_data.length = length;
   cobject->value.as_external_typed_data.data = data;
   cobject->value.as_external_typed_data.peer = peer;
@@ -1072,7 +926,7 @@
 
 
 void CObject::FreeIOBufferData(Dart_CObject* cobject) {
-  ASSERT(cobject->type == Dart_CObject::kExternalTypedData);
+  ASSERT(cobject->type == Dart_CObject_kExternalTypedData);
   cobject->value.as_external_typed_data.callback(
       NULL, cobject->value.as_external_typed_data.peer);
   cobject->value.as_external_typed_data.data = NULL;
diff --git a/runtime/bin/dartutils.h b/runtime/bin/dartutils.h
index dcc67d1..b84e773f 100644
--- a/runtime/bin/dartutils.h
+++ b/runtime/bin/dartutils.h
@@ -121,7 +121,7 @@
                                        Dart_Handle url);
   static Dart_Handle LoadScript(const char* script_uri,
                                 Dart_Handle builtin_lib);
-  static Dart_Handle LoadScriptHttp(const char* script_uri,
+  static Dart_Handle LoadScriptHttp(Dart_Handle script_uri,
                                     Dart_Handle builtin_lib);
   static Dart_Handle LoadSource(CommandLineOptions* url_mapping,
                                 Dart_Handle library,
@@ -168,15 +168,6 @@
   static Dart_Handle FilePathFromUri(Dart_Handle script_uri,
                                      Dart_Handle builtin_lib);
 
-  static Dart_Handle PathFromUri(Dart_Handle script_uri,
-                                 Dart_Handle builtin_lib);
-
-  static Dart_Handle DomainFromUri(Dart_Handle script_uri,
-                                   Dart_Handle builtin_lib);
-
-  static Dart_Handle PortFromUri(Dart_Handle script_uri,
-                                 Dart_Handle builtin_lib);
-
   static Dart_Handle ResolveUri(Dart_Handle library_url,
                                 Dart_Handle url,
                                 Dart_Handle builtin_lib);
@@ -228,35 +219,35 @@
   static const int kFileClosedError = 3;
 
   explicit CObject(Dart_CObject *cobject) : cobject_(cobject) {}
-  Dart_CObject::Type type() { return cobject_->type; }
-  Dart_CObject::TypedDataType byte_array_type() {
-    ASSERT(type() == Dart_CObject::kTypedData ||
-           type() == Dart_CObject::kExternalTypedData);
+  Dart_CObject_Type type() { return cobject_->type; }
+  Dart_TypedData_Type byte_array_type() {
+    ASSERT(type() == Dart_CObject_kTypedData ||
+           type() == Dart_CObject_kExternalTypedData);
     return cobject_->value.as_typed_data.type;
   }
 
-  bool IsNull() { return type() == Dart_CObject::kNull; }
-  bool IsBool() { return type() == Dart_CObject::kBool; }
-  bool IsInt32() { return type() == Dart_CObject::kInt32; }
-  bool IsInt64() { return type() == Dart_CObject::kInt64; }
+  bool IsNull() { return type() == Dart_CObject_kNull; }
+  bool IsBool() { return type() == Dart_CObject_kBool; }
+  bool IsInt32() { return type() == Dart_CObject_kInt32; }
+  bool IsInt64() { return type() == Dart_CObject_kInt64; }
   bool IsInt32OrInt64() { return IsInt32() || IsInt64(); }
   bool IsIntptr() { return IsInt32OrInt64(); }
-  bool IsBigint() { return type() == Dart_CObject::kBigint; }
-  bool IsDouble() { return type() == Dart_CObject::kDouble; }
-  bool IsString() { return type() == Dart_CObject::kString; }
-  bool IsArray() { return type() == Dart_CObject::kArray; }
-  bool IsTypedData() { return type() == Dart_CObject::kTypedData; }
+  bool IsBigint() { return type() == Dart_CObject_kBigint; }
+  bool IsDouble() { return type() == Dart_CObject_kDouble; }
+  bool IsString() { return type() == Dart_CObject_kString; }
+  bool IsArray() { return type() == Dart_CObject_kArray; }
+  bool IsTypedData() { return type() == Dart_CObject_kTypedData; }
   bool IsUint8Array() {
-    return type() == Dart_CObject::kTypedData &&
-           byte_array_type() == Dart_CObject::kUint8Array;
+    return type() == Dart_CObject_kTypedData &&
+           byte_array_type() == Dart_TypedData_kUint8;
   }
 
   bool IsTrue() {
-    return type() == Dart_CObject::kBool && cobject_->value.as_bool;
+    return type() == Dart_CObject_kBool && cobject_->value.as_bool;
   }
 
   bool IsFalse() {
-    return type() == Dart_CObject::kBool && !cobject_->value.as_bool;
+    return type() == Dart_CObject_kBool && !cobject_->value.as_bool;
   }
 
   void* operator new(size_t size) {
@@ -298,7 +289,7 @@
   Dart_CObject* cobject_;
 
  private:
-  static Dart_CObject* New(Dart_CObject::Type type, int additional_bytes = 0);
+  static Dart_CObject* New(Dart_CObject_Type type, int additional_bytes = 0);
 
   static Dart_CObject api_null_;
   static Dart_CObject api_true_;
@@ -314,40 +305,41 @@
 
 #define DECLARE_COBJECT_CONSTRUCTORS(t)                                        \
   explicit CObject##t(Dart_CObject *cobject) : CObject(cobject) {              \
-    ASSERT(type() == Dart_CObject::k##t);                                      \
+    ASSERT(type() == Dart_CObject_k##t);                                       \
     cobject_ = cobject;                                                        \
   }                                                                            \
   explicit CObject##t(CObject* cobject) : CObject() {                          \
     ASSERT(cobject != NULL);                                                   \
-    ASSERT(cobject->type() == Dart_CObject::k##t);                             \
+    ASSERT(cobject->type() == Dart_CObject_k##t);                              \
     cobject_ = cobject->AsApiCObject();                                        \
   }                                                                            \
 
 
 #define DECLARE_COBJECT_TYPED_DATA_CONSTRUCTORS(t)                             \
-  explicit CObject##t(Dart_CObject *cobject) : CObject(cobject) {              \
-    ASSERT(type() == Dart_CObject::kTypedData);                                \
-    ASSERT(byte_array_type() == Dart_CObject::k##t);                           \
+  explicit CObject##t##Array(Dart_CObject *cobject) : CObject(cobject) {       \
+    ASSERT(type() == Dart_CObject_kTypedData);                                 \
+    ASSERT(byte_array_type() == Dart_TypedData_k##t);                          \
     cobject_ = cobject;                                                        \
   }                                                                            \
-  explicit CObject##t(CObject* cobject) : CObject() {                          \
+  explicit CObject##t##Array(CObject* cobject) : CObject() {                   \
     ASSERT(cobject != NULL);                                                   \
-    ASSERT(cobject->type() == Dart_CObject::kTypedData);                       \
-    ASSERT(cobject->byte_array_type() == Dart_CObject::k##t);                  \
+    ASSERT(cobject->type() == Dart_CObject_kTypedData);                        \
+    ASSERT(cobject->byte_array_type() == Dart_TypedData_k##t);                 \
     cobject_ = cobject->AsApiCObject();                                        \
   }                                                                            \
 
 
 #define DECLARE_COBJECT_EXTERNAL_TYPED_DATA_CONSTRUCTORS(t)                    \
-  explicit CObjectExternal##t(Dart_CObject *cobject) : CObject(cobject) {      \
-    ASSERT(type() == Dart_CObject::kExternalTypedData);                        \
-    ASSERT(byte_array_type() == Dart_CObject::k##t);                           \
+  explicit CObjectExternal##t##Array(Dart_CObject *cobject)                    \
+      : CObject(cobject) {                                                     \
+    ASSERT(type() == Dart_CObject_kExternalTypedData);                         \
+    ASSERT(byte_array_type() == Dart_TypedData_k##t);                          \
     cobject_ = cobject;                                                        \
   }                                                                            \
-  explicit CObjectExternal##t(CObject* cobject) : CObject() {                  \
+  explicit CObjectExternal##t##Array(CObject* cobject) : CObject() {           \
     ASSERT(cobject != NULL);                                                   \
-    ASSERT(cobject->type() == Dart_CObject::kExternalTypedData);               \
-    ASSERT(cobject->byte_array_type() == Dart_CObject::k##t);                  \
+    ASSERT(cobject->type() == Dart_CObject_kExternalTypedData);                \
+    ASSERT(cobject->byte_array_type() == Dart_TypedData_k##t);                 \
     cobject_ = cobject->AsApiCObject();                                        \
   }                                                                            \
 
@@ -388,19 +380,19 @@
 class CObjectIntptr : public CObject {
  public:
   explicit CObjectIntptr(Dart_CObject *cobject) : CObject(cobject) {
-    ASSERT(type() == Dart_CObject::kInt32 || type() == Dart_CObject::kInt64);
+    ASSERT(type() == Dart_CObject_kInt32 || type() == Dart_CObject_kInt64);
     cobject_ = cobject;
   }
   explicit CObjectIntptr(CObject* cobject) : CObject() {
     ASSERT(cobject != NULL);
-    ASSERT(cobject->type() == Dart_CObject::kInt64 ||
-           cobject->type() == Dart_CObject::kInt32);
+    ASSERT(cobject->type() == Dart_CObject_kInt64 ||
+           cobject->type() == Dart_CObject_kInt32);
     cobject_ = cobject->AsApiCObject();
   }
 
   intptr_t Value()  {
     intptr_t result;
-    if (type() == Dart_CObject::kInt32) {
+    if (type() == Dart_CObject_kInt32) {
       result = cobject_->value.as_int32;
     } else {
       ASSERT(sizeof(result) == 8);
@@ -468,16 +460,16 @@
 class CObjectTypedData : public CObject {
  public:
   explicit CObjectTypedData(Dart_CObject *cobject) : CObject(cobject) {
-    ASSERT(type() == Dart_CObject::kTypedData);
+    ASSERT(type() == Dart_CObject_kTypedData);
     cobject_ = cobject;
   }
   explicit CObjectTypedData(CObject* cobject) : CObject() {
     ASSERT(cobject != NULL);
-    ASSERT(cobject->type() == Dart_CObject::kTypedData);
+    ASSERT(cobject->type() == Dart_CObject_kTypedData);
     cobject_ = cobject->AsApiCObject();
   }
 
-  Dart_CObject::TypedDataType Type() const {
+  Dart_TypedData_Type Type() const {
     return cobject_->value.as_typed_data.type;
   }
   int Length() const { return cobject_->value.as_typed_data.length; }
@@ -490,7 +482,7 @@
 
 class CObjectUint8Array : public CObject {
  public:
-  DECLARE_COBJECT_TYPED_DATA_CONSTRUCTORS(Uint8Array)
+  DECLARE_COBJECT_TYPED_DATA_CONSTRUCTORS(Uint8)
 
   int Length() const { return cobject_->value.as_typed_data.length; }
   uint8_t* Buffer() const { return cobject_->value.as_typed_data.values; }
@@ -502,7 +494,7 @@
 
 class CObjectExternalUint8Array : public CObject {
  public:
-  DECLARE_COBJECT_EXTERNAL_TYPED_DATA_CONSTRUCTORS(Uint8Array)
+  DECLARE_COBJECT_EXTERNAL_TYPED_DATA_CONSTRUCTORS(Uint8)
 
   int Length() const { return cobject_->value.as_external_typed_data.length; }
   void SetLength(uint64_t length) {
diff --git a/runtime/bin/directory.cc b/runtime/bin/directory.cc
index 310cf8f..d15d734 100644
--- a/runtime/bin/directory.cc
+++ b/runtime/bin/directory.cc
@@ -278,7 +278,7 @@
                              Dart_CObject* message) {
   CObject* response = CObject::IllegalArgumentError();
   CObjectArray request(message);
-  if (message->type == Dart_CObject::kArray) {
+  if (message->type == Dart_CObject_kArray) {
     if (request.Length() > 1 && request[0]->IsInt32()) {
       CObjectInt32 requestType(request[0]);
       switch (requestType.Value()) {
diff --git a/runtime/bin/file.cc b/runtime/bin/file.cc
index 67d67e3..a971f961 100644
--- a/runtime/bin/file.cc
+++ b/runtime/bin/file.cc
@@ -571,20 +571,27 @@
 
     int64_t stat_data[File::kStatSize];
     File::Stat(path, stat_data);
-    Dart_Handle returned_data = Dart_NewTypedData(kInt64, File::kStatSize);
-    if (Dart_IsError(returned_data)) Dart_PropagateError(returned_data);
-    Dart_TypedData_Type data_type_unused;
-    void* data_location;
-    intptr_t data_length_unused;
-    Dart_Handle status = Dart_TypedDataAcquireData(returned_data,
-                                                   &data_type_unused,
-                                                   &data_location,
-                                                   &data_length_unused);
-    if (Dart_IsError(status)) Dart_PropagateError(status);
-    memmove(data_location, stat_data, File::kStatSize * sizeof(int64_t));
-    status = Dart_TypedDataReleaseData(returned_data);
-    if (Dart_IsError(status)) Dart_PropagateError(status);
-    Dart_SetReturnValue(args, returned_data);
+    if (stat_data[File::kType] == File::kDoesNotExist) {
+      Dart_Handle err = DartUtils::NewDartOSError();
+      if (Dart_IsError(err)) Dart_PropagateError(err);
+      Dart_SetReturnValue(args, err);
+    } else {
+      Dart_Handle returned_data = Dart_NewTypedData(Dart_TypedData_kInt64,
+                                                    File::kStatSize);
+      if (Dart_IsError(returned_data)) Dart_PropagateError(returned_data);
+      Dart_TypedData_Type data_type_unused;
+      void* data_location;
+      intptr_t data_length_unused;
+      Dart_Handle status = Dart_TypedDataAcquireData(returned_data,
+                                                     &data_type_unused,
+                                                     &data_location,
+                                                     &data_length_unused);
+      if (Dart_IsError(status)) Dart_PropagateError(status);
+      memmove(data_location, stat_data, File::kStatSize * sizeof(int64_t));
+      status = Dart_TypedDataReleaseData(returned_data);
+      if (Dart_IsError(status)) Dart_PropagateError(status);
+      Dart_SetReturnValue(args, returned_data);
+    }
   } else {
     Dart_Handle err = DartUtils::NewDartArgumentError(
         "Non-string argument to FileSystemEntity.stat");
@@ -962,22 +969,22 @@
 }
 
 
-static int SizeInBytes(Dart_CObject::TypedDataType type) {
+static int SizeInBytes(Dart_TypedData_Type type) {
   switch (type) {
-    case Dart_CObject::kInt8Array:
-    case Dart_CObject::kUint8Array:
-    case Dart_CObject::kUint8ClampedArray:
+    case Dart_TypedData_kInt8:
+    case Dart_TypedData_kUint8:
+    case Dart_TypedData_kUint8Clamped:
       return 1;
-    case Dart_CObject::kInt16Array:
-    case Dart_CObject::kUint16Array:
+    case Dart_TypedData_kInt16:
+    case Dart_TypedData_kUint16:
       return 2;
-    case Dart_CObject::kInt32Array:
-    case Dart_CObject::kUint32Array:
-    case Dart_CObject::kFloat32Array:
+    case Dart_TypedData_kInt32:
+    case Dart_TypedData_kUint32:
+    case Dart_TypedData_kFloat32:
       return 4;
-    case Dart_CObject::kInt64Array:
-    case Dart_CObject::kUint64Array:
-    case Dart_CObject::kFloat64Array:
+    case Dart_TypedData_kInt64:
+    case Dart_TypedData_kUint64:
+    case Dart_TypedData_kFloat64:
       return 8;
     default:
       break;
@@ -1123,6 +1130,9 @@
     int64_t data[File::kStatSize];
     CObjectString path(request[1]);
     File::Stat(path.CString(), data);
+    if (data[File::kType] == File::kDoesNotExist) {
+      return CObject::NewOSError();
+    }
     CObjectArray* result =
         new CObjectArray(CObject::NewArray(File::kStatSize));
     for (int i = 0; i < File::kStatSize; ++i) {
@@ -1142,7 +1152,7 @@
                  Dart_CObject* message) {
   CObject* response = CObject::IllegalArgumentError();
   CObjectArray request(message);
-  if (message->type == Dart_CObject::kArray) {
+  if (message->type == Dart_CObject_kArray) {
     if (request.Length() > 1 && request[0]->IsInt32()) {
       CObjectInt32 requestType(request[0]);
       switch (requestType.Value()) {
diff --git a/runtime/bin/file_android.cc b/runtime/bin/file_android.cc
index ba7ac88..939929a 100644
--- a/runtime/bin/file_android.cc
+++ b/runtime/bin/file_android.cc
@@ -220,11 +220,6 @@
     data[kSize] = st.st_size;
   } else {
     data[kType] = kDoesNotExist;
-    data[kCreatedTime] = 0;
-    data[kModifiedTime] = 0;
-    data[kAccessedTime] = 0;
-    data[kMode] = 0;
-    data[kSize] = 0;
   }
 }
 
diff --git a/runtime/bin/file_linux.cc b/runtime/bin/file_linux.cc
index 7d974a4..8f1a114 100644
--- a/runtime/bin/file_linux.cc
+++ b/runtime/bin/file_linux.cc
@@ -221,11 +221,6 @@
     data[kSize] = st.st_size;
   } else {
     data[kType] = kDoesNotExist;
-    data[kCreatedTime] = 0;
-    data[kModifiedTime] = 0;
-    data[kAccessedTime] = 0;
-    data[kMode] = 0;
-    data[kSize] = 0;
   }
 }
 
diff --git a/runtime/bin/file_macos.cc b/runtime/bin/file_macos.cc
index 27f7177..e29c6ab 100644
--- a/runtime/bin/file_macos.cc
+++ b/runtime/bin/file_macos.cc
@@ -223,11 +223,6 @@
     data[kSize] = st.st_size;
   } else {
     data[kType] = kDoesNotExist;
-    data[kCreatedTime] = 0;
-    data[kModifiedTime] = 0;
-    data[kAccessedTime] = 0;
-    data[kMode] = 0;
-    data[kSize] = 0;
   }
 }
 
diff --git a/runtime/bin/file_win.cc b/runtime/bin/file_win.cc
index d0f4c82..d149c08 100644
--- a/runtime/bin/file_win.cc
+++ b/runtime/bin/file_win.cc
@@ -394,11 +394,6 @@
 void File::Stat(const char* name, int64_t* data) {
   File::Type type = GetType(name, false);
   data[kType] = type;
-  data[kCreatedTime] = 0;
-  data[kModifiedTime] = 0;
-  data[kAccessedTime] = 0;
-  data[kMode] = 0;
-  data[kSize] = 0;
   if (type != kDoesNotExist) {
     struct _stat64 st;
     const wchar_t* system_name = StringUtils::Utf8ToWide(name);
diff --git a/runtime/bin/filter_dummy.cc b/runtime/bin/filter_unsupported.cc
similarity index 100%
rename from runtime/bin/filter_dummy.cc
rename to runtime/bin/filter_unsupported.cc
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index 5e5b61a..0612f15 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -304,7 +304,7 @@
                                                            url_string);
 
   Builtin::BuiltinLibraryId libraryBuiltinId = BuiltinId(library_url_string);
-  if (tag == kCanonicalizeUrl) {
+  if (tag == Dart_kCanonicalizeUrl) {
     if (mapped_url_string) {
       return url;
     }
@@ -318,20 +318,20 @@
   Builtin::BuiltinLibraryId builtinId = BuiltinId(url_string);
   if (builtinId != Builtin::kInvalidLibrary) {
     // Special case for importing a builtin library.
-    if (tag == kImportTag) {
+    if (tag == Dart_kImportTag) {
       return Builtin::LoadAndCheckLibrary(builtinId);
     }
-    ASSERT(tag == kSourceTag);
+    ASSERT(tag == Dart_kSourceTag);
     return Dart_Error("Unable to part '%s' ", url_string);
   }
 
   if (libraryBuiltinId != Builtin::kInvalidLibrary) {
     // Special case for parting sources of a builtin library.
-    if (tag == kSourceTag) {
+    if (tag == Dart_kSourceTag) {
       return Dart_LoadSource(
           library, url, Builtin::PartSource(libraryBuiltinId, url_string));
     }
-    ASSERT(tag == kImportTag);
+    ASSERT(tag == Dart_kImportTag);
     return Dart_Error("Unable to import '%s' ", url_string);
   }
 
diff --git a/runtime/bin/io_buffer.cc b/runtime/bin/io_buffer.cc
index cbef566..dbc1047 100644
--- a/runtime/bin/io_buffer.cc
+++ b/runtime/bin/io_buffer.cc
@@ -10,7 +10,8 @@
 
 Dart_Handle IOBuffer::Allocate(intptr_t size, uint8_t **buffer) {
   uint8_t* data = Allocate(size);
-  Dart_Handle result = Dart_NewExternalTypedData(kUint8, data, size);
+  Dart_Handle result = Dart_NewExternalTypedData(
+      Dart_TypedData_kUint8, data, size);
   Dart_NewWeakPersistentHandle(result, data, IOBuffer::Finalizer);
 
   if (Dart_IsError(result)) {
diff --git a/runtime/bin/io_impl_sources.gypi b/runtime/bin/io_impl_sources.gypi
index 0eeaf5d..9565456 100644
--- a/runtime/bin/io_impl_sources.gypi
+++ b/runtime/bin/io_impl_sources.gypi
@@ -23,6 +23,7 @@
     'eventhandler_win.h',
     'filter.cc',
     'filter.h',
+    'filter_unsupported.cc',
     'net/nss_memio.cc',
     'net/nss_memio.h',
     'platform.cc',
@@ -45,5 +46,23 @@
     'socket_win.cc',
     'secure_socket.cc',
     'secure_socket.h',
+    'secure_socket_unsupported.cc',
+  ],
+  'conditions': [
+    ['dart_io_support==1', {
+      'sources!' : [
+        'filter_unsupported.cc',
+        'secure_socket_unsupported.cc',
+      ],
+    },{  # else dart_io_support == 0
+      'sources!' : [
+        'filter.cc',
+        'filter.h',
+        'net/nss_memio.cc',
+        'net/nss_memio.h',
+        'secure_socket.cc',
+        'secure_socket.h',
+      ],
+    }],
   ],
 }
diff --git a/runtime/bin/io_impl_sources_no_nss.gypi b/runtime/bin/io_impl_sources_no_nss.gypi
deleted file mode 100644
index 3222272..0000000
--- a/runtime/bin/io_impl_sources_no_nss.gypi
+++ /dev/null
@@ -1,45 +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 some C++ sources for the dart:io library.  The other
-# implementation files are in builtin_impl_sources.gypi.
-{
-  'sources': [
-    'common.cc',
-    'crypto.cc',
-    'crypto_android.cc',
-    'crypto_linux.cc',
-    'crypto_macos.cc',
-    'crypto_win.cc',
-    'eventhandler.cc',
-    'eventhandler.h',
-    'eventhandler_android.cc',
-    'eventhandler_linux.cc',
-    'eventhandler_linux.h',
-    'eventhandler_macos.cc',
-    'eventhandler_macos.h',
-    'eventhandler_win.cc',
-    'eventhandler_win.h',
-    'filter_dummy.cc',
-    'platform.cc',
-    'platform.h',
-    'platform_android.cc',
-    'platform_linux.cc',
-    'platform_macos.cc',
-    'platform_win.cc',
-    'process.cc',
-    'process.h',
-    'process_android.cc',
-    'process_linux.cc',
-    'process_macos.cc',
-    'process_win.cc',
-    'socket.cc',
-    'socket.h',
-    'socket_android.cc',
-    'socket_linux.cc',
-    'socket_macos.cc',
-    'socket_win.cc',
-    'secure_socket_dummy.cc',
-  ],
-}
diff --git a/runtime/bin/process_android.cc b/runtime/bin/process_android.cc
index 677097b..8fbc446 100644
--- a/runtime/bin/process_android.cc
+++ b/runtime/bin/process_android.cc
@@ -533,6 +533,14 @@
     TEMP_FAILURE_RETRY(close(read_err[1]));
     TEMP_FAILURE_RETRY(close(write_out[0]));
     TEMP_FAILURE_RETRY(close(write_out[1]));
+
+    // Since exec() failed, we're not interested in the exit code.
+    // We close the reading side of the exit code pipe here.
+    // GetProcessExitCodes will get a broken pipe error when it tries to write
+    // to the writing side of the pipe and it will ignore the error.
+    TEMP_FAILURE_RETRY(close(*exit_event));
+    *exit_event = -1;
+
     if (bytes_read == -1) {
       return errno;  // Read failed.
     } else {
diff --git a/runtime/bin/process_linux.cc b/runtime/bin/process_linux.cc
index 838dc27..e55cb5d 100644
--- a/runtime/bin/process_linux.cc
+++ b/runtime/bin/process_linux.cc
@@ -534,6 +534,14 @@
     TEMP_FAILURE_RETRY(close(read_err[1]));
     TEMP_FAILURE_RETRY(close(write_out[0]));
     TEMP_FAILURE_RETRY(close(write_out[1]));
+
+    // Since exec() failed, we're not interested in the exit code.
+    // We close the reading side of the exit code pipe here.
+    // GetProcessExitCodes will get a broken pipe error when it tries to write
+    // to the writing side of the pipe and it will ignore the error.
+    TEMP_FAILURE_RETRY(close(*exit_event));
+    *exit_event = -1;
+
     if (bytes_read == -1) {
       return errno;  // Read failed.
     } else {
diff --git a/runtime/bin/process_macos.cc b/runtime/bin/process_macos.cc
index 0022a8b..43dcc28 100644
--- a/runtime/bin/process_macos.cc
+++ b/runtime/bin/process_macos.cc
@@ -532,6 +532,14 @@
     VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
     VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
     VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+
+    // Since exec() failed, we're not interested in the exit code.
+    // We close the reading side of the exit code pipe here.
+    // GetProcessExitCodes will get a broken pipe error when it tries to write
+    // to the writing side of the pipe and it will ignore the error.
+    VOID_TEMP_FAILURE_RETRY(close(*exit_event));
+    *exit_event = -1;
+
     if (bytes_read == -1) {
       return errno;  // Read failed.
     } else {
diff --git a/runtime/bin/secure_socket.cc b/runtime/bin/secure_socket.cc
index e785620..4310aec 100644
--- a/runtime/bin/secure_socket.cc
+++ b/runtime/bin/secure_socket.cc
@@ -323,7 +323,7 @@
     ASSERT(dart_buffer_objects_[i] != NULL);
     buffers_[i] = new uint8_t[size];
     Dart_Handle data = ThrowIfError(
-        Dart_NewExternalTypedData(kUint8, buffers_[i], size));
+        Dart_NewExternalTypedData(Dart_TypedData_kUint8, buffers_[i], size));
     ThrowIfError(
         Dart_SetField(Dart_HandleFromPersistent(dart_buffer_objects_[i]),
                       data_identifier,
diff --git a/runtime/bin/secure_socket.h b/runtime/bin/secure_socket.h
index 0eecd3c..45334d6 100644
--- a/runtime/bin/secure_socket.h
+++ b/runtime/bin/secure_socket.h
@@ -35,17 +35,11 @@
 /* Handle an error reported from the NSS library. */
 static void ThrowPRException(const char* message) {
   PRErrorCode error_code = PR_GetError();
-  int error_length = PR_GetErrorTextLength();
-  char* error_message = static_cast<char*>(malloc(error_length + 1));
-  ASSERT(error_message != NULL);
-  int copied_length = PR_GetErrorText(error_message);
-  ASSERT(copied_length == error_length);
-  error_message[error_length] = '\0';
+  const char* error_message = PR_ErrorToString(error_code, PR_LANGUAGE_EN);
   OSError os_error_struct(error_code, error_message, OSError::kNSS);
   Dart_Handle os_error = DartUtils::NewDartOSError(&os_error_struct);
   Dart_Handle socket_io_exception =
       DartUtils::NewDartSocketIOException(message, os_error);
-  free(error_message);
   Dart_ThrowException(socket_io_exception);
 }
 
diff --git a/runtime/bin/secure_socket_dummy.cc b/runtime/bin/secure_socket_unsupported.cc
similarity index 100%
rename from runtime/bin/secure_socket_dummy.cc
rename to runtime/bin/secure_socket_unsupported.cc
diff --git a/runtime/bin/socket.cc b/runtime/bin/socket.cc
index 1134889..89e6b00 100644
--- a/runtime/bin/socket.cc
+++ b/runtime/bin/socket.cc
@@ -75,7 +75,7 @@
       Dart_ThrowException(error);
   }
   int len = SocketAddress::GetAddrLength(raw);
-  Dart_Handle result = Dart_NewTypedData(kUint8, len);
+  Dart_Handle result = Dart_NewTypedData(Dart_TypedData_kUint8, len);
   if (Dart_IsError(result)) Dart_PropagateError(result);
   Dart_ListSetAsBytes(result, 0, reinterpret_cast<uint8_t *>(&raw), len);
   Dart_SetReturnValue(args, result);
@@ -491,7 +491,7 @@
                    Dart_CObject* message) {
   CObject* response = CObject::IllegalArgumentError();
   CObjectArray request(message);
-  if (message->type == Dart_CObject::kArray) {
+  if (message->type == Dart_CObject_kArray) {
     if (request.Length() > 1 && request[0]->IsInt32()) {
       CObjectInt32 request_type(request[0]);
       switch (request_type.Value()) {
diff --git a/runtime/bin/test_extension.c b/runtime/bin/test_extension.c
new file mode 100644
index 0000000..a08a5fe
--- /dev/null
+++ b/runtime/bin/test_extension.c
@@ -0,0 +1,67 @@
+/* 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.
+ */
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "include/dart_api.h"
+
+#if defined(ASSERT)
+#error ASSERT already defined!
+#endif
+
+
+/* Native methods. */
+void IfNull(Dart_NativeArguments arguments) {
+  Dart_Handle object = Dart_GetNativeArgument(arguments, 0);
+  if (Dart_IsNull(object)) {
+    Dart_SetReturnValue(arguments, Dart_GetNativeArgument(arguments, 1));
+  } else {
+    Dart_SetReturnValue(arguments, object);
+  }
+}
+
+
+void ThrowMeTheBall(Dart_NativeArguments arguments) {
+  Dart_Handle object = Dart_GetNativeArgument(arguments, 0);
+  Dart_ThrowException(object);
+}
+
+
+/* Native resolver for the extension library. */
+Dart_NativeFunction ResolveName(Dart_Handle name, int argc) {
+  /* assert(Dart_IsString(name)); */
+  const char* c_name;
+  Dart_Handle check_error;
+
+  check_error = Dart_StringToCString(name, &c_name);
+  if (Dart_IsError(check_error)) {
+    Dart_PropagateError(check_error);
+  }
+  if ((strcmp("TestExtension_IfNull", c_name) == 0) && (argc == 2)) {
+    return IfNull;
+  }
+  if ((strcmp("TestExtension_ThrowMeTheBall", c_name) == 0) && (argc == 1)) {
+    return ThrowMeTheBall;
+  }
+  return NULL;
+}
+
+
+/* Native entry point for the extension library. */
+DART_EXPORT Dart_Handle test_extension_Init(Dart_Handle parent_library) {
+  Dart_Handle result_code;
+  if (Dart_IsError(parent_library)) {
+    return parent_library;
+  }
+
+  result_code = Dart_SetNativeResolver(parent_library, ResolveName);
+  if (Dart_IsError(result_code)) {
+    return result_code;
+  }
+
+  return parent_library;
+}
diff --git a/runtime/bin/test_extension.cc b/runtime/bin/test_extension.cc
deleted file mode 100644
index 327f015..0000000
--- a/runtime/bin/test_extension.cc
+++ /dev/null
@@ -1,59 +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.
-#include <string.h>
-
-#include "include/dart_api.h"
-
-
-namespace dart {
-namespace bin {
-
-Dart_NativeFunction ResolveName(Dart_Handle name, int argc);
-
-DART_EXPORT Dart_Handle test_extension_Init(Dart_Handle parent_library) {
-  if (Dart_IsError(parent_library)) { return parent_library; }
-
-  Dart_Handle result_code = Dart_SetNativeResolver(parent_library, ResolveName);
-  if (Dart_IsError(result_code)) return result_code;
-
-  return parent_library;
-}
-
-
-void IfNull(Dart_NativeArguments arguments) {
-  Dart_Handle object = Dart_GetNativeArgument(arguments, 0);
-  if (Dart_IsNull(object)) {
-    Dart_SetReturnValue(arguments, Dart_GetNativeArgument(arguments, 1));
-  } else {
-    Dart_SetReturnValue(arguments, object);
-  }
-}
-
-
-void ThrowMeTheBall(Dart_NativeArguments arguments) {
-  Dart_Handle object = Dart_GetNativeArgument(arguments, 0);
-  Dart_ThrowException(object);
-}
-
-
-Dart_NativeFunction ResolveName(Dart_Handle name, int argc) {
-  assert(Dart_IsString(name));
-  const char* cname;
-  Dart_Handle check_error;
-
-  check_error = Dart_StringToCString(name, &cname);
-  if (Dart_IsError(check_error)) {
-    Dart_PropagateError(check_error);
-  }
-  if ((strcmp("TestExtension_IfNull", cname) == 0) && (argc == 2)) {
-    return IfNull;
-  }
-  if ((strcmp("TestExtension_ThrowMeTheBall", cname) == 0) && (argc == 1)) {
-    return ThrowMeTheBall;
-  }
-  return NULL;
-}
-
-}  // namespace bin
-}  // namespace dart
diff --git a/runtime/bin/vmstats/bargraph.dart b/runtime/bin/vmstats/bargraph.dart
index 89b00a4..b9deb1e 100644
--- a/runtime/bin/vmstats/bargraph.dart
+++ b/runtime/bin/vmstats/bargraph.dart
@@ -31,7 +31,7 @@
 
   void addSample(List<int> segments) {
     if (segments.length != _elements.length) {
-      throw new RuntimeError('invalid sample size for graph');
+      throw new ArgumentError('invalid sample size for graph');
     }
     _model.addSample(segments);
   }
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index abb5a6c..afbceaa 100755
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -1,6 +1,8 @@
-// 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.
+/*
+ * 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.
+ */
 
 #ifndef INCLUDE_DART_API_H_
 #define INCLUDE_DART_API_H_
@@ -24,6 +26,11 @@
 #if defined(__CYGWIN__)
 #error Tool chain and platform not supported.
 #elif defined(_WIN32)
+// Define bool if necessary.
+#ifndef __cplusplus
+typedef unsigned __int8 bool;
+#endif
+// Define integer types.
 typedef signed __int8 int8_t;
 typedef signed __int16 int16_t;
 typedef signed __int32 int32_t;
@@ -38,8 +45,8 @@
 #define DART_EXPORT DART_EXTERN_C
 #endif
 #else
-// __STDC_FORMAT_MACROS has to be defined before including <inttypes.h> to
-// enable platform independent printf format specifiers.
+/* __STDC_FORMAT_MACROS has to be defined before including <inttypes.h> to
+ * enable platform independent printf format specifiers. */
 #ifndef __STDC_FORMAT_MACROS
 #define __STDC_FORMAT_MACROS
 #endif
@@ -58,7 +65,7 @@
 
 #include <assert.h>
 
-// --- Handles ---
+/* --- Handles --- */
 
 /**
  * An object reference managed by the Dart VM garbage collector.
@@ -283,8 +290,8 @@
  */
 DART_EXPORT Dart_Handle Dart_NewUnhandledExceptionError(Dart_Handle exception);
 
-// Deprecated.
-// TODO(turnidge): Remove all uses and delete.
+/* Deprecated. */
+/* TODO(turnidge): Remove all uses and delete. */
 DART_EXPORT Dart_Handle Dart_Error(const char* format, ...);
 
 /**
@@ -314,17 +321,17 @@
  *   error handle is returned.
  */
 DART_EXPORT Dart_Handle Dart_PropagateError(Dart_Handle handle);
-// TODO(turnidge): Should this really return an error handle?
-// Consider just terminating.
+/* TODO(turnidge): Should this really return an error handle? */
+/* Consider just terminating. */
 
-// Internal routine used for reporting error handles.
+/* Internal routine used for reporting error handles. */
 DART_EXPORT void _Dart_ReportErrorHandle(const char* file,
                                          int line,
                                          const char* handle_string,
                                          const char* error);
 
-// TODO(turnidge): Move DART_CHECK_VALID to some sort of dart_utils
-// header instead of this header.
+/* TODO(turnidge): Move DART_CHECK_VALID to some sort of dart_utils
+ * header instead of this header. */
 /**
  * Aborts the process if 'handle' is an error handle.
  *
@@ -476,7 +483,7 @@
     Dart_WeakPersistentHandle* values,
     intptr_t num_values);
 
-// --- Garbage Collection Callbacks ---
+/* --- Garbage Collection Callbacks --- */
 
 /**
  * Callbacks signal the beginning and end of a garbage collection.
@@ -546,7 +553,7 @@
 DART_EXPORT Dart_Handle Dart_RemoveGcEpilogueCallback(
     Dart_GcEpilogueCallback callback);
 
-// --- Initialization and Globals ---
+/* --- Initialization and Globals --- */
 
 /**
  * Gets the version string for the Dart VM.
@@ -627,7 +634,7 @@
  *   unwound (currently unimplemented).
  */
 typedef bool (*Dart_IsolateInterruptCallback)();
-// TODO(turnidge): Define and implement unwinding.
+/* TODO(turnidge): Define and implement unwinding. */
 
 /**
  * An isolate unhandled exception callback function.
@@ -737,7 +744,7 @@
  */
 DART_EXPORT bool Dart_IsVMFlagSet(const char* flag_name);
 
-// --- Isolates ---
+/* --- Isolates --- */
 
 /**
  * Creates a new isolate. The new isolate becomes the current isolate.
@@ -767,8 +774,8 @@
                                             const uint8_t* snapshot,
                                             void* callback_data,
                                             char** error);
-// TODO(turnidge): Document behavior when there is already a current
-// isolate.
+/* TODO(turnidge): Document behavior when there is already a current
+ * isolate. */
 
 /**
  * Shuts down the current isolate. After this call, the current
@@ -777,7 +784,7 @@
  * Requires there to be a current isolate.
  */
 DART_EXPORT void Dart_ShutdownIsolate();
-// TODO(turnidge): Document behavior when there is no current isolate.
+/* TODO(turnidge): Document behavior when there is no current isolate. */
 
 /**
  * Returns the current isolate. Will return NULL if there is no
@@ -806,9 +813,9 @@
  * Requires there to be no current isolate.
  */
 DART_EXPORT void Dart_EnterIsolate(Dart_Isolate isolate);
-// TODO(turnidge): Describe what happens if two threads attempt to
-// enter the same isolate simultaneously. Check for this in the code.
-// Describe whether isolates are allowed to migrate.
+/* TODO(turnidge): Describe what happens if two threads attempt to
+ * enter the same isolate simultaneously. Check for this in the code.
+ * Describe whether isolates are allowed to migrate. */
 
 /**
  * Exits an isolate. After this call, Dart_CurrentIsolate will
@@ -817,8 +824,8 @@
  * Requires there to be a current isolate.
  */
 DART_EXPORT void Dart_ExitIsolate();
-// TODO(turnidge): We don't want users of the api to be able to exit a
-// "pure" dart isolate. Implement and document.
+/* TODO(turnidge): We don't want users of the api to be able to exit a
+ * "pure" dart isolate. Implement and document. */
 
 /**
  * Creates a full snapshot of the current isolate heap.
@@ -887,7 +894,7 @@
 DART_EXPORT bool Dart_IsolateMakeRunnable(Dart_Isolate isolate);
 
 
-// --- Messages and Ports ---
+/* --- Messages and Ports --- */
 
 /**
  * A port is used to send or receive inter-isolate messages
@@ -921,8 +928,8 @@
  */
 DART_EXPORT void Dart_SetMessageNotifyCallback(
     Dart_MessageNotifyCallback message_notify_callback);
-// TODO(turnidge): Consider moving this to isolate creation so that it
-// is impossible to mess up.
+/* TODO(turnidge): Consider moving this to isolate creation so that it
+ * is impossible to mess up. */
 
 /**
  * Handles the next pending message for the current isolate.
@@ -950,7 +957,7 @@
  *   error handle is returned.
  */
 DART_EXPORT Dart_Handle Dart_RunLoop();
-// TODO(turnidge): Should this be removed from the public api?
+/* TODO(turnidge): Should this be removed from the public api? */
 
 /**
  * Gets the main port id for the current isolate.
@@ -977,140 +984,6 @@
  */
 DART_EXPORT bool Dart_Post(Dart_Port port_id, Dart_Handle object);
 
-// --- Message sending/receiving from native code ----
-
-/**
- * A Dart_CObject is used for representing Dart objects as native C
- * data outside the Dart heap. These objects are totally detached from
- * the Dart heap. Only a subset of the Dart objects have a
- * representation as a Dart_CObject.
- *
- * The string encoding in the 'value.as_string' is UTF-8.
- *
- * All the different types from dart:typed_data are exposed as type
- * kTypedData. The specific type from dart:typed_data is in the type
- * field of the as_typed_data structure. The length in the
- * as_typed_data structure is always in bytes.
- */
-typedef struct _Dart_CObject {
-  enum Type {
-    kNull = 0,
-    kBool,
-    kInt32,
-    kInt64,
-    kBigint,
-    kDouble,
-    kString,
-    kArray,
-    kTypedData,
-    kExternalTypedData,
-    kUnsupported,
-    kNumberOfTypes
-  } type;
-
-  enum TypedDataType {
-    kInt8Array = 0,
-    kUint8Array,
-    kUint8ClampedArray,
-    kInt16Array,
-    kUint16Array,
-    kInt32Array,
-    kUint32Array,
-    kInt64Array,
-    kUint64Array,
-    kFloat32Array,
-    kFloat64Array,
-    kNumberOfTypedDataTypes
-  };
-
-  union {
-    bool as_bool;
-    int32_t as_int32;
-    int64_t as_int64;
-    double as_double;
-    char* as_string;
-    char* as_bigint;
-    struct {
-      int length;
-      struct _Dart_CObject** values;
-    } as_array;
-    struct {
-      TypedDataType type;
-      int length;
-      uint8_t* values;
-    } as_typed_data;
-    struct {
-      TypedDataType type;
-      int length;
-      uint8_t* data;
-      void* peer;
-      Dart_WeakPersistentHandleFinalizer callback;
-    } as_external_typed_data;
-  } value;
-} Dart_CObject;
-
-/**
- * Posts a message on some port. The message will contain the
- * Dart_CObject object graph rooted in 'message'.
- *
- * While the message is being sent the state of the graph of
- * Dart_CObject structures rooted in 'message' should not be accessed,
- * as the message generation will make temporary modifications to the
- * data. When the message has been sent the graph will be fully
- * restored.
- *
- * \param port_id The destination port.
- * \param message The message to send.
- *
- * \return True if the message was posted.
- */
-DART_EXPORT bool Dart_PostCObject(Dart_Port port_id, Dart_CObject* message);
-
-/**
- * A native message handler.
- *
- * This handler is associated with a native port by calling
- * Dart_NewNativePort.
- *
- * The message received is decoded into the message structure. The
- * lifetime of the message data is controlled by the caller. All the
- * data references from the message are allocated by the caller and
- * will be reclaimed when returning to it.
- */
-
-typedef void (*Dart_NativeMessageHandler)(Dart_Port dest_port_id,
-                                          Dart_Port reply_port_id,
-                                          Dart_CObject* message);
-
-/**
- * Creates a new native port.  When messages are received on this
- * native port, then they will be dispatched to the provided native
- * message handler.
- *
- * \param name The name of this port in debugging messages.
- * \param handler The C handler to run when messages arrive on the port.
- * \param handle_concurrently Is it okay to process requests on this
- *                            native port concurrently?
- *
- * \return If successful, returns the port id for the native port.  In
- *   case of error, returns ILLEGAL_PORT.
- */
-DART_EXPORT Dart_Port Dart_NewNativePort(const char* name,
-                                         Dart_NativeMessageHandler handler,
-                                         bool handle_concurrently);
-// TODO(turnidge): Currently handle_concurrently is ignored.
-
-/**
- * Closes the native port with the given id.
- *
- * The port must have been allocated by a call to Dart_NewNativePort.
- *
- * \param native_port_id The id of the native port to close.
- *
- * \return Returns true if the port was closed successfully.
- */
-DART_EXPORT bool Dart_CloseNativePort(Dart_Port native_port_id);
-
 /**
  * Returns a new SendPort with the provided port id.
  */
@@ -1123,7 +996,7 @@
  */
 DART_EXPORT Dart_Handle Dart_GetReceivePort(Dart_Port port_id);
 
-// --- Scopes ----
+/* --- Scopes ---- */
 
 /**
  * Enters a new scope.
@@ -1169,7 +1042,7 @@
  */
 DART_EXPORT uint8_t* Dart_ScopeAllocate(intptr_t size);
 
-// --- Objects ----
+/* --- Objects ---- */
 
 /**
  * Returns the null object.
@@ -1220,13 +1093,13 @@
                                           Dart_Handle type,
                                           bool* instanceof);
 
-// --- Instances ----
-// For the purposes of the embedding api, not all objects returned are
-// Dart language objects.  Within the api, we use the term 'Instance'
-// to indicate handles which refer to true Dart language objects.
-//
-// TODO(turnidge): Reorganize the "Object" section above, pulling down
-// any functions that more properly belong here.
+/* --- Instances ----
+ * For the purposes of the embedding api, not all objects returned are
+ * Dart language objects.  Within the api, we use the term 'Instance'
+ * to indicate handles which refer to true Dart language objects.
+ *
+ * TODO(turnidge): Reorganize the "Object" section above, pulling down
+ * any functions that more properly belong here. */
 
 /**
  * Does this handle refer to some Dart language object?
@@ -1243,14 +1116,14 @@
  */
 DART_EXPORT Dart_Handle Dart_InstanceGetClass(Dart_Handle instance);
 
-// --- Numbers ----
+/* --- Numbers ---- */
 
 /**
  * Is this object a Number?
  */
 DART_EXPORT bool Dart_IsNumber(Dart_Handle object);
 
-// --- Integers ----
+/* --- Integers ---- */
 
 /**
  * Is this object an Integer?
@@ -1340,7 +1213,7 @@
 DART_EXPORT Dart_Handle Dart_IntegerToHexCString(Dart_Handle integer,
                                                  const char** value);
 
-// --- Booleans ----
+/* --- Booleans ---- */
 
 /**
  * Returns the True object.
@@ -1385,7 +1258,7 @@
  */
 DART_EXPORT Dart_Handle Dart_BooleanValue(Dart_Handle boolean_obj, bool* value);
 
-// --- Doubles ---
+/* --- Doubles --- */
 
 /**
  * Is this object a Double?
@@ -1412,7 +1285,7 @@
  */
 DART_EXPORT Dart_Handle Dart_DoubleValue(Dart_Handle double_obj, double* value);
 
-// --- Strings ---
+/* --- Strings --- */
 
 /**
  * Is this object a String?
@@ -1446,8 +1319,8 @@
  *   an error handle.
  */
 DART_EXPORT Dart_Handle Dart_NewStringFromCString(const char* str);
-// TODO(turnidge): Document what happens when we run out of memory
-// during this call.
+/* TODO(turnidge): Document what happens when we run out of memory
+ * during this call. */
 
 /**
  * Returns a String built from an array of UTF-8 encoded characters.
@@ -1639,7 +1512,7 @@
                                                 Dart_PeerFinalizer cback);
 
 
-// --- Lists ---
+/* --- Lists --- */
 
 /**
  * Is this object a List?
@@ -1717,23 +1590,23 @@
                                             uint8_t* native_array,
                                             intptr_t length);
 
-// --- Typed Data ---
+/* --- Typed Data --- */
 
 typedef enum {
-  kByteData = 0,
-  kInt8,
-  kUint8,
-  kUint8Clamped,
-  kInt16,
-  kUint16,
-  kInt32,
-  kUint32,
-  kInt64,
-  kUint64,
-  kFloat32,
-  kFloat64,
-  kFloat32x4,
-  kInvalid
+  Dart_TypedData_kByteData = 0,
+  Dart_TypedData_kInt8,
+  Dart_TypedData_kUint8,
+  Dart_TypedData_kUint8Clamped,
+  Dart_TypedData_kInt16,
+  Dart_TypedData_kUint16,
+  Dart_TypedData_kInt32,
+  Dart_TypedData_kUint32,
+  Dart_TypedData_kInt64,
+  Dart_TypedData_kUint64,
+  Dart_TypedData_kFloat32,
+  Dart_TypedData_kFloat64,
+  Dart_TypedData_kFloat32x4,
+  Dart_TypedData_kInvalid
 } Dart_TypedData_Type;
 
 /**
@@ -1816,7 +1689,7 @@
 DART_EXPORT Dart_Handle Dart_TypedDataReleaseData(Dart_Handle object);
 
 
-// --- Closures ---
+/* --- Closures --- */
 
 /**
  * Is this object a Closure?
@@ -1844,7 +1717,7 @@
                                            int number_of_arguments,
                                            Dart_Handle* arguments);
 
-// --- Classes and Interfaces ---
+/* --- Classes and Interfaces --- */
 
 /**
  * Is this a class handle?
@@ -1919,7 +1792,7 @@
  */
 DART_EXPORT Dart_Handle Dart_ClassGetFunctionTypeSignature(Dart_Handle clazz);
 
-// --- Function and Variable Declarations ---
+/* --- Function and Variable Declarations --- */
 
 /**
  * Returns a list of the names of all functions or methods declared in
@@ -2009,7 +1882,7 @@
  */
 DART_EXPORT Dart_Handle Dart_FunctionIsConstructor(Dart_Handle function,
                                                    bool* is_constructor);
-// TODO(turnidge): Document behavior for factory constructors too.
+/* TODO(turnidge): Document behavior for factory constructors too. */
 
 /**
  * Determines whether a function or method is a getter.
@@ -2185,9 +2058,9 @@
  *   argument is not a valid handle.
  */
 DART_EXPORT Dart_Handle Dart_TypeVariableUpperBound(Dart_Handle type_variable);
-// TODO(turnidge): Finish documentation.
+/* TODO(turnidge): Finish documentation. */
 
-// --- Constructors, Methods, and Fields ---
+/* --- Constructors, Methods, and Fields --- */
 
 /**
  * Invokes a constructor, creating a new object.
@@ -2237,7 +2110,7 @@
                                     Dart_Handle name,
                                     int number_of_arguments,
                                     Dart_Handle* arguments);
-// TODO(turnidge): Document how to invoke operators.
+/* TODO(turnidge): Document how to invoke operators. */
 
 /**
  * Gets the value of a field.
@@ -2316,9 +2189,9 @@
                                                     int index,
                                                     intptr_t value);
 
-// --- Exceptions ----
-// TODO(turnidge): Remove these functions from the api and replace all
-// uses with Dart_NewUnhandledExceptionError.
+/* --- Exceptions ----
+ * TODO(turnidge): Remove these functions from the api and replace all
+ * uses with Dart_NewUnhandledExceptionError. */
 
 /**
  * Throws an exception.
@@ -2351,7 +2224,7 @@
 DART_EXPORT Dart_Handle Dart_RethrowException(Dart_Handle exception,
                                               Dart_Handle stacktrace);
 
-// --- Native functions ---
+/* --- Native functions --- */
 
 /**
  * The arguments to a native function.
@@ -2368,7 +2241,7 @@
  */
 DART_EXPORT Dart_Handle Dart_GetNativeArgument(Dart_NativeArguments args,
                                                int index);
-// TODO(turnidge): Specify the behavior of an out-of-bounds access.
+/* TODO(turnidge): Specify the behavior of an out-of-bounds access. */
 
 /**
  * Gets the number of native arguments.
@@ -2398,20 +2271,20 @@
  */
 typedef Dart_NativeFunction (*Dart_NativeEntryResolver)(Dart_Handle name,
                                                         int num_of_arguments);
-// TODO(turnidge): Consider renaming to NativeFunctionResolver or
-// NativeResolver.
+/* TODO(turnidge): Consider renaming to NativeFunctionResolver or
+ * NativeResolver. */
 
-// --- Scripts and Libraries ---
-// TODO(turnidge): Finish documenting this section.
+/* --- Scripts and Libraries ---
+ * TODO(turnidge): Finish documenting this section. */
 
 typedef enum {
-  kLibraryTag = 0,
-  kImportTag,
-  kSourceTag,
-  kCanonicalizeUrl
+  Dart_kLibraryTag = 0,
+  Dart_kImportTag,
+  Dart_kSourceTag,
+  Dart_kCanonicalizeUrl
 } Dart_LibraryTag;
 
-// TODO(turnidge): Document.
+/* TODO(turnidge): Document. */
 typedef Dart_Handle (*Dart_LibraryTagHandler)(Dart_LibraryTag tag,
                                               Dart_Handle library,
                                               Dart_Handle url);
@@ -2502,8 +2375,8 @@
  */
 DART_EXPORT Dart_Handle Dart_GetClass(Dart_Handle library,
                                       Dart_Handle class_name);
-// TODO(turnidge): Consider returning Dart_Null() when the class is
-// not found to distinguish that from a true error case.
+/* TODO(turnidge): Consider returning Dart_Null() when the class is
+ * not found to distinguish that from a true error case. */
 
 /**
  * Returns the name of a library as declared in the #library directive.
@@ -2525,8 +2398,8 @@
 DART_EXPORT Dart_Handle Dart_LibraryGetClassNames(Dart_Handle library);
 
 DART_EXPORT Dart_Handle Dart_LookupLibrary(Dart_Handle url);
-// TODO(turnidge): Consider returning Dart_Null() when the library is
-// not found to distinguish that from a true error case.
+/* TODO(turnidge): Consider returning Dart_Null() when the library is
+ * not found to distinguish that from a true error case. */
 
 DART_EXPORT Dart_Handle Dart_LoadLibrary(Dart_Handle url,
                                          Dart_Handle source);
@@ -2558,7 +2431,7 @@
 DART_EXPORT Dart_Handle Dart_LoadSource(Dart_Handle library,
                                         Dart_Handle url,
                                         Dart_Handle source);
-// TODO(turnidge): Rename to Dart_LibraryLoadSource?
+/* TODO(turnidge): Rename to Dart_LibraryLoadSource? */
 
 
 /**
@@ -2583,20 +2456,20 @@
 DART_EXPORT Dart_Handle Dart_SetNativeResolver(
     Dart_Handle library,
     Dart_NativeEntryResolver resolver);
-// TODO(turnidge): Rename to Dart_LibrarySetNativeResolver?
+/* TODO(turnidge): Rename to Dart_LibrarySetNativeResolver? */
 
-// --- Profiling support ----
+/* --- Profiling support ---- */
 
-// External pprof support for gathering and dumping symbolic
-// information that can be used for better profile reports for
-// dynamically generated code.
+/* External pprof support for gathering and dumping symbolic
+ * information that can be used for better profile reports for
+ * dynamically generated code. */
 DART_EXPORT void Dart_InitPprofSupport();
 DART_EXPORT void Dart_GetPprofSymbolInfo(void** buffer, int* buffer_size);
 
-// Support for generating symbol maps for use by the Linux perf tool.
+/* Support for generating symbol maps for use by the Linux perf tool. */
 DART_EXPORT void Dart_InitPerfEventsSupport(void* perf_events_file);
 
-// --- Heap Profiler ---
+/* --- Heap Profiler --- */
 
 /**
  * Generates a heap profile.
@@ -2611,7 +2484,7 @@
 DART_EXPORT Dart_Handle Dart_HeapProfile(Dart_FileWriteCallback callback,
                                          void* stream);
 
-// --- Peers ---
+/* --- Peers --- */
 
 /**
  * The peer field is a lazily allocated field intendend for storage of
@@ -2644,4 +2517,124 @@
  */
 DART_EXPORT Dart_Handle Dart_SetPeer(Dart_Handle object, void* peer);
 
-#endif  // INCLUDE_DART_API_H_
+/* --- Message sending/receiving from native code ---- */
+
+/**
+ * A Dart_CObject is used for representing Dart objects as native C
+ * data outside the Dart heap. These objects are totally detached from
+ * the Dart heap. Only a subset of the Dart objects have a
+ * representation as a Dart_CObject.
+ *
+ * The string encoding in the 'value.as_string' is UTF-8.
+ *
+ * All the different types from dart:typed_data are exposed as type
+ * kTypedData. The specific type from dart:typed_data is in the type
+ * field of the as_typed_data structure. The length in the
+ * as_typed_data structure is always in bytes.
+ */
+typedef enum {
+  Dart_CObject_kNull = 0,
+  Dart_CObject_kBool,
+  Dart_CObject_kInt32,
+  Dart_CObject_kInt64,
+  Dart_CObject_kBigint,
+  Dart_CObject_kDouble,
+  Dart_CObject_kString,
+  Dart_CObject_kArray,
+  Dart_CObject_kTypedData,
+  Dart_CObject_kExternalTypedData,
+  Dart_CObject_kUnsupported,
+  Dart_CObject_kNumberOfTypes
+} Dart_CObject_Type;
+
+typedef struct _Dart_CObject {
+  Dart_CObject_Type type;
+  union {
+    bool as_bool;
+    int32_t as_int32;
+    int64_t as_int64;
+    double as_double;
+    char* as_string;
+    char* as_bigint;
+    struct {
+      int length;
+      struct _Dart_CObject** values;
+    } as_array;
+    struct {
+      Dart_TypedData_Type type;
+      int length;
+      uint8_t* values;
+    } as_typed_data;
+    struct {
+      Dart_TypedData_Type type;
+      int length;
+      uint8_t* data;
+      void* peer;
+      Dart_WeakPersistentHandleFinalizer callback;
+    } as_external_typed_data;
+  } value;
+} Dart_CObject;
+
+/**
+ * Posts a message on some port. The message will contain the
+ * Dart_CObject object graph rooted in 'message'.
+ *
+ * While the message is being sent the state of the graph of
+ * Dart_CObject structures rooted in 'message' should not be accessed,
+ * as the message generation will make temporary modifications to the
+ * data. When the message has been sent the graph will be fully
+ * restored.
+ *
+ * \param port_id The destination port.
+ * \param message The message to send.
+ *
+ * \return True if the message was posted.
+ */
+DART_EXPORT bool Dart_PostCObject(Dart_Port port_id, Dart_CObject* message);
+
+/**
+ * A native message handler.
+ *
+ * This handler is associated with a native port by calling
+ * Dart_NewNativePort.
+ *
+ * The message received is decoded into the message structure. The
+ * lifetime of the message data is controlled by the caller. All the
+ * data references from the message are allocated by the caller and
+ * will be reclaimed when returning to it.
+ */
+
+typedef void (*Dart_NativeMessageHandler)(Dart_Port dest_port_id,
+Dart_Port reply_port_id,
+Dart_CObject* message);
+
+/**
+ * Creates a new native port.  When messages are received on this
+ * native port, then they will be dispatched to the provided native
+ * message handler.
+ *
+ * \param name The name of this port in debugging messages.
+ * \param handler The C handler to run when messages arrive on the port.
+ * \param handle_concurrently Is it okay to process requests on this
+ *                            native port concurrently?
+ *
+ * \return If successful, returns the port id for the native port.  In
+ *   case of error, returns ILLEGAL_PORT.
+ */
+DART_EXPORT Dart_Port Dart_NewNativePort(const char* name,
+                                         Dart_NativeMessageHandler handler,
+                                         bool handle_concurrently);
+/* TODO(turnidge): Currently handle_concurrently is ignored. */
+
+/**
+ * Closes the native port with the given id.
+ *
+ * The port must have been allocated by a call to Dart_NewNativePort.
+ *
+ * \param native_port_id The id of the native port to close.
+ *
+ * \return Returns true if the port was closed successfully.
+ */
+DART_EXPORT bool Dart_CloseNativePort(Dart_Port native_port_id);
+
+#endif  /* INCLUDE_DART_API_H_ */  /* NOLINT */
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index e631a3e..8880d2306 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -138,7 +138,7 @@
   Dart_LibraryTagHandler handler = isolate->library_tag_handler();
   if (handler != NULL) {
     Dart_EnterScope();
-    Dart_Handle result = handler(kCanonicalizeUrl,
+    Dart_Handle result = handler(Dart_kCanonicalizeUrl,
                                  Api::NewHandle(isolate, library.raw()),
                                  Api::NewHandle(isolate, uri.raw()));
     const Object& obj = Object::Handle(Api::UnwrapHandle(result));
diff --git a/runtime/tests/vm/dart/isolate_unhandled_exception_test.dart b/runtime/tests/vm/dart/isolate_unhandled_exception_test.dart
index f7b0c04..798221e 100644
--- a/runtime/tests/vm/dart/isolate_unhandled_exception_test.dart
+++ b/runtime/tests/vm/dart/isolate_unhandled_exception_test.dart
@@ -21,7 +21,7 @@
   port.receive((message, replyTo) {
     if (message == 'throw exception') {
       replyTo.call('throwing exception');
-      throw new RuntimeError('ignore this exception');
+      throw new UnsupportedError('ignore this exception');
     }
     replyTo.call('hello');
     port.close();
diff --git a/runtime/tests/vm/dart/isolate_unhandled_exception_test2.dart b/runtime/tests/vm/dart/isolate_unhandled_exception_test2.dart
index 6fc0a11..7fe1c86 100644
--- a/runtime/tests/vm/dart/isolate_unhandled_exception_test2.dart
+++ b/runtime/tests/vm/dart/isolate_unhandled_exception_test2.dart
@@ -19,7 +19,7 @@
   port.receive((message, replyTo) {
     if (message == 'throw exception') {
       replyTo.call('throwing exception');
-      throw new RuntimeError('ignore this exception');
+      throw new UnsupportedError('ignore this exception');
     }
     replyTo.call('hello');
     port.close();
diff --git a/runtime/tests/vm/dart/isolate_unhandled_exception_uri_helper.dart b/runtime/tests/vm/dart/isolate_unhandled_exception_uri_helper.dart
index a994f13..b8088a8 100644
--- a/runtime/tests/vm/dart/isolate_unhandled_exception_uri_helper.dart
+++ b/runtime/tests/vm/dart/isolate_unhandled_exception_uri_helper.dart
@@ -13,7 +13,7 @@
   port.receive((message, replyTo) {
     if (message == 'throw exception') {
       replyTo.call('throwing exception');
-      throw new RuntimeError('ignore this exception');
+      throw new UnsupportedError('ignore this exception');
     }
     replyTo.call('hello');
     port.close();
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index b849809..dedbd9c 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -54,10 +54,7 @@
 # Skip until we stabilize language tests.
 *: Skip
 
-[ $arch == arm ]
-*: Skip
-
-[ $arch == simarm ]
+[ $arch == simarm || $arch == arm ]
 # Bug in optimized code generation.
 dart/byte_array_test: Fail
 dart/byte_array_optimized_test: Fail
diff --git a/runtime/third_party/double-conversion/src/utils.h b/runtime/third_party/double-conversion/src/utils.h
index cd3e330..9ac374a 100644
--- a/runtime/third_party/double-conversion/src/utils.h
+++ b/runtime/third_party/double-conversion/src/utils.h
@@ -54,7 +54,7 @@
 // On Linux,x86 89255e-22 != Div_double(89255.0/1e22)
 #if defined(_M_X64) || defined(__x86_64__) || \
     defined(__ARMEL__) || \
-    defined(_MIPS_ARCH_MIPS32R2)
+    defined(_MIPS_ARCH_MIPS32)
 #define DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS 1
 #elif defined(_M_IX86) || defined(__i386__)
 #if defined(_WIN32)
diff --git a/runtime/vm/assembler_mips.cc b/runtime/vm/assembler_mips.cc
index 200e777..889eea1 100644
--- a/runtime/vm/assembler_mips.cc
+++ b/runtime/vm/assembler_mips.cc
@@ -12,9 +12,11 @@
 
 namespace dart {
 
+#if defined(USING_SIMULATOR)
 DECLARE_FLAG(bool, trace_sim);
+#endif
 DEFINE_FLAG(bool, print_stop_message, false, "Print stop message.");
-
+DECLARE_FLAG(bool, inline_alloc);
 
 void Assembler::InitializeMemoryWithBreakpoints(uword data, int length) {
   ASSERT(Utils::IsAligned(data, 4));
@@ -395,6 +397,43 @@
 }
 
 
+void Assembler::TryAllocate(const Class& cls,
+                            Label* failure,
+                            Register instance_reg) {
+  ASSERT(failure != NULL);
+  if (FLAG_inline_alloc) {
+    Heap* heap = Isolate::Current()->heap();
+    const intptr_t instance_size = cls.instance_size();
+    LoadImmediate(instance_reg, heap->TopAddress());
+    lw(instance_reg, Address(instance_reg, 0));
+    AddImmediate(instance_reg, instance_size);
+
+    // instance_reg: potential next object start.
+    LoadImmediate(TMP, heap->EndAddress());
+    lw(TMP, Address(TMP, 0));
+    // Fail if heap end unsigned less than or equal to instance_reg.
+    BranchUnsignedLessEqual(TMP, instance_reg, failure);
+
+    // Successfully allocated the object, now update top to point to
+    // next object start and store the class in the class field of object.
+    LoadImmediate(TMP, heap->TopAddress());
+    sw(instance_reg, Address(TMP, 0));
+
+    ASSERT(instance_size >= kHeapObjectTag);
+    AddImmediate(instance_reg, -instance_size + kHeapObjectTag);
+
+    uword tags = 0;
+    tags = RawObject::SizeTag::update(instance_size, tags);
+    ASSERT(cls.id() != kIllegalCid);
+    tags = RawObject::ClassIdTag::update(cls.id(), tags);
+    LoadImmediate(TMP, tags);
+    sw(TMP, FieldAddress(instance_reg, Object::tags_offset()));
+  } else {
+    b(failure);
+  }
+}
+
+
 void Assembler::CallRuntime(const RuntimeEntry& entry) {
   entry.Call(this);
 }
@@ -575,7 +614,9 @@
 
 
 void Assembler::TraceSimMsg(const char* message) {
-  //  Don't bother adding in the messages unless tracing is enabled.
+  // Don't bother adding in the messages unless tracing is enabled, and we are
+  // running in the simulator.
+#if defined(USING_SIMULATOR)
   if (FLAG_trace_sim) {
     Label msg;
     b(&msg);
@@ -583,6 +624,7 @@
     Bind(&msg);
     break_(Instr::kMsgMessageCode);
   }
+#endif
 }
 
 }  // namespace dart
diff --git a/runtime/vm/assembler_mips.h b/runtime/vm/assembler_mips.h
index c48f1bd..8becc75 100644
--- a/runtime/vm/assembler_mips.h
+++ b/runtime/vm/assembler_mips.h
@@ -187,10 +187,7 @@
   // Only the tags field of the object is initialized.
   void TryAllocate(const Class& cls,
                    Label* failure,
-                   bool near_jump,
-                   Register instance_reg) {
-    UNIMPLEMENTED();
-  }
+                   Register instance_reg);
 
   // Debugging and bringup support.
   void Stop(const char* message);
@@ -523,6 +520,14 @@
     EmitFpuLoadStore(LWC1, ft, addr);
   }
 
+  void madd(Register rs, Register rt) {
+    EmitRType(SPECIAL2, rs, rt, R0, 0, MADD);
+  }
+
+  void maddu(Register rs, Register rt) {
+    EmitRType(SPECIAL2, rs, rt, R0, 0, MADDU);
+  }
+
   void mfc1(Register rt, FRegister fs) {
     Emit(COP1 << kOpcodeShift |
          COP1_MF << kCop1SubShift |
@@ -567,6 +572,14 @@
          fs << kFsShift);
   }
 
+  void mthi(Register rs) {
+    EmitRType(SPECIAL, rs, R0, R0, 0, MTHI);
+  }
+
+  void mtlo(Register rs) {
+    EmitRType(SPECIAL, rs, R0, R0, 0, MTLO);
+  }
+
   void muld(DRegister dd, DRegister ds, DRegister dt) {
     FRegister fd = static_cast<FRegister>(dd * 2);
     FRegister fs = static_cast<FRegister>(ds * 2);
@@ -803,6 +816,7 @@
   }
 
   void AddImmediate(Register rd, Register rs, int32_t value) {
+    if (value == 0) return;
     if (Utils::IsInt(kImmBits, value)) {
       addiu(rd, rs, Immediate(value));
     } else {
diff --git a/runtime/vm/assembler_mips_test.cc b/runtime/vm/assembler_mips_test.cc
index 445ab8e..3152e4a 100644
--- a/runtime/vm/assembler_mips_test.cc
+++ b/runtime/vm/assembler_mips_test.cc
@@ -134,6 +134,34 @@
 }
 
 
+ASSEMBLER_TEST_GENERATE(MtloMflo, assembler) {
+  __ LoadImmediate(T0, 42);
+  __ mtlo(T0);
+  __ mflo(V0);
+  __ jr(RA);
+}
+
+
+ASSEMBLER_TEST_RUN(MtloMflo, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(MthiMfhi, assembler) {
+  __ LoadImmediate(T0, 42);
+  __ mthi(T0);
+  __ mfhi(V0);
+  __ jr(RA);
+}
+
+
+ASSEMBLER_TEST_RUN(MthiMfhi, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
+}
+
+
 ASSEMBLER_TEST_GENERATE(Divu, assembler) {
   __ addiu(R1, ZR, Immediate(27));
   __ addiu(R2, ZR, Immediate(9));
@@ -520,6 +548,23 @@
 }
 
 
+ASSEMBLER_TEST_GENERATE(Madd_neg, assembler) {
+  __ LoadImmediate(R1, -6);
+  __ LoadImmediate(R2, 7);
+  __ mult(R1, R2);
+  __ madd(R1, R2);
+  __ mflo(V0);
+  __ mfhi(V1);
+  __ jr(RA);
+}
+
+
+ASSEMBLER_TEST_RUN(Madd_neg, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(-84, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
+}
+
+
 ASSEMBLER_TEST_GENERATE(Subu, assembler) {
   __ LoadImmediate(R1, 737);
   __ LoadImmediate(R2, 695);
diff --git a/runtime/vm/bigint_operations_test.cc b/runtime/vm/bigint_operations_test.cc
index b43ff90..54dd297 100644
--- a/runtime/vm/bigint_operations_test.cc
+++ b/runtime/vm/bigint_operations_test.cc
@@ -1340,7 +1340,9 @@
 }
 
 
-#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
+#if defined(TARGET_ARCH_IA32) ||                                               \
+    defined(TARGET_ARCH_X64) ||                                                \
+    defined(TARGET_ARCH_ARM)
 static void TestBigintMultiplyDivide(const char* a,
                                      const char* b,
                                      const char* product) {
diff --git a/runtime/vm/bootstrap.cc b/runtime/vm/bootstrap.cc
index e174416..0277d61 100644
--- a/runtime/vm/bootstrap.cc
+++ b/runtime/vm/bootstrap.cc
@@ -191,13 +191,13 @@
   if (!Dart_IsString(uri)) {
     return Dart_NewApiError("uri is not a string");
   }
-  if (tag == kCanonicalizeUrl) {
+  if (tag == Dart_kCanonicalizeUrl) {
     // In the boot strap loader we do not try and do any canonicalization.
     return uri;
   }
   const String& uri_str = Api::UnwrapStringHandle(isolate, uri);
   ASSERT(!uri_str.IsNull());
-  if (tag == kImportTag) {
+  if (tag == Dart_kImportTag) {
     // We expect the core bootstrap libraries to only import other
     // core bootstrap libraries.
     // We have precreated all the bootstrap library objects hence
@@ -206,7 +206,7 @@
     return Dart_NewApiError("Invalid import of '%s' in a bootstrap library",
                             uri_str.ToCString());
   }
-  ASSERT(tag == kSourceTag);
+  ASSERT(tag == Dart_kSourceTag);
   const Library& lib = Api::UnwrapLibraryHandle(isolate, library);
   ASSERT(!lib.IsNull());
   return LoadPartSource(isolate, lib, uri_str);
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index cc4df17f..05a16e8 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -97,9 +97,11 @@
     super_type = cls.super_type();
     if (!super_type.IsNull()) {
       if (!super_type.IsMalformed() &&
-          super_type.HasResolvedTypeClass() &&
-          Class::Handle(super_type.type_class()).is_finalized()) {
-        AddSuperType(super_type, finalized_super_classes);
+          super_type.HasResolvedTypeClass()) {
+        cls ^= super_type.type_class();
+        if (cls.is_finalized()) {
+          AddSuperType(super_type, finalized_super_classes);
+        }
       }
     }
   }
@@ -374,7 +376,8 @@
 
   // Update redirection data with resolved target.
   factory.SetRedirectionTarget(target);
-  factory.SetRedirectionIdentifier(String::Handle());  // Not needed anymore.
+  // Not needed anymore.
+  factory.SetRedirectionIdentifier(String::null_object());
   if (!target.IsRedirectingFactory()) {
     return;
   }
@@ -882,7 +885,7 @@
                                   parameterized_type_name.ToCString()));
     return BoundedType::New(parameterized_type,
                             malformed_bound,
-                            TypeParameter::Handle());
+                            TypeParameter::null_object());
   }
 
   if (finalization >= kCanonicalize) {
@@ -1438,6 +1441,7 @@
   // Finalize interface types (but not necessarily interface classes).
   Array& interface_types = Array::Handle(cls.interfaces());
   AbstractType& interface_type = AbstractType::Handle();
+  AbstractType& seen_interf = AbstractType::Handle();
   for (intptr_t i = 0; i < interface_types.Length(); i++) {
     interface_type ^= interface_types.At(i);
     interface_type = FinalizeType(cls, interface_type, kCanonicalizeWellFormed);
@@ -1456,7 +1460,6 @@
                   String::Handle(super_type.Name()).ToCString(),
                   String::Handle(cls.Name()).ToCString());
     }
-    AbstractType& seen_interf = AbstractType::Handle();
     for (intptr_t j = 0; j < i; j++) {
       seen_interf ^= interface_types.At(j);
       if (interface_type.Equals(seen_interf)) {
@@ -1623,10 +1626,11 @@
   ASSERT(type.IsType());
   CollectTypeArguments(cls, Type::Cast(type), type_args);
   const Array& mixins = Array::Handle(mixin_app.mixin_types());
+  Class& mixin_app_class = Class::Handle();
   for (int i = 0; i < mixins.Length(); i++) {
     type ^= mixins.At(i);
     ASSERT(type.HasResolvedTypeClass());  // Newly created class in parser.
-    const Class& mixin_app_class = Class::Handle(type.type_class());
+    mixin_app_class ^= type.type_class();
     type = mixin_app_class.mixin();
     ASSERT(!type.IsNull());
     ResolveType(cls, type, kCanonicalizeWellFormed);
@@ -1650,12 +1654,10 @@
   // mixin types. This super type replaces the MixinAppType object
   // in the class that extends the mixin application.
   type ^= mixins.At(mixins.Length() - 1);
-  const Class& resolved_mixin_app_class = Class::Handle(type.type_class());
-  Type& resolved_mixin_app_type = Type::Handle();
-  resolved_mixin_app_type = Type::New(resolved_mixin_app_class,
-                                      mixin_app_args,
-                                      mixin_app.token_pos());
-  return resolved_mixin_app_type.raw();
+  mixin_app_class ^= type.type_class();
+  return Type::New(mixin_app_class,
+                   mixin_app_args,
+                   mixin_app.token_pos());
 }
 
 
@@ -1915,7 +1917,7 @@
   if (FLAG_enable_type_checks || !type.HasResolvedTypeClass()) {
     type.set_malformed_error(error);
   }
-  type.set_arguments(AbstractTypeArguments::Handle());
+  type.set_arguments(AbstractTypeArguments::null_object());
   if (!type.IsFinalized()) {
     type.SetIsFinalized();
     // Do not canonicalize malformed types, since they may not be resolved.
diff --git a/runtime/vm/code_descriptors_test.cc b/runtime/vm/code_descriptors_test.cc
index d9c5087..88b5b76 100644
--- a/runtime/vm/code_descriptors_test.cc
+++ b/runtime/vm/code_descriptors_test.cc
@@ -132,7 +132,7 @@
     stackmap_table_builder->AddEntry(3, stack_bitmap, 0);
 
     const Error& error =
-        Error::Handle(Compiler::CompileParsedFunction(*parsed_function));
+        Error::Handle(Compiler::CompileParsedFunction(parsed_function));
     EXPECT(error.IsNull());
     const Code& code = Code::Handle(function.CurrentCode());
 
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 53bc843..05e4b78 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -240,9 +240,10 @@
 
 
 // Return false if bailed out.
-static bool CompileParsedFunctionHelper(const ParsedFunction& parsed_function,
+static bool CompileParsedFunctionHelper(ParsedFunction* parsed_function,
                                         bool optimized) {
-  if (optimized && !parsed_function.function().is_optimizable()) {
+  const Function& function = parsed_function->function();
+  if (optimized && !function.is_optimizable()) {
     return false;
   }
   TimerScope timer(FLAG_compiler_stats, &CompilerStats::codegen_timer);
@@ -264,15 +265,15 @@
                        isolate);
       Array& ic_data_array = Array::Handle();
       if (optimized) {
-        ASSERT(parsed_function.function().HasCode());
+        ASSERT(function.HasCode());
         // Extract type feedback before the graph is built, as the graph
         // builder uses it to attach it to nodes.
         // Do not use type feedback to optimize a function that was
         // deoptimized too often.
-        if (parsed_function.function().deoptimization_counter() <
+        if (function.deoptimization_counter() <
             FLAG_deoptimization_counter_threshold) {
           const Code& unoptimized_code =
-              Code::Handle(parsed_function.function().unoptimized_code());
+              Code::Handle(function.unoptimized_code());
           ic_data_array = unoptimized_code.ExtractTypeFeedbackArray();
         }
       }
@@ -396,7 +397,7 @@
         }
       }
       if (FLAG_loop_invariant_code_motion &&
-          (parsed_function.function().deoptimization_counter() <
+          (function.deoptimization_counter() <
            (FLAG_deoptimization_counter_threshold - 1))) {
         LICM licm(flow_graph);
         licm.Optimize();
@@ -485,7 +486,6 @@
       TimerScope timer(FLAG_compiler_stats,
                        &CompilerStats::codefinalizer_timer,
                        isolate);
-      const Function& function = parsed_function.function();
       const Code& code = Code::Handle(
           Code::FinalizeCode(function, &assembler, optimized));
       code.set_is_optimized(optimized);
@@ -700,7 +700,7 @@
     }
 
     const bool success =
-        CompileParsedFunctionHelper(*parsed_function, optimized);
+        CompileParsedFunctionHelper(parsed_function, optimized);
     if (optimized && !success) {
       // Optimizer bailed out. Disable optimizations and to never try again.
       if (FLAG_trace_compiler) {
@@ -762,7 +762,7 @@
 
 
 RawError* Compiler::CompileParsedFunction(
-    const ParsedFunction& parsed_function) {
+    ParsedFunction* parsed_function) {
   Isolate* isolate = Isolate::Current();
   LongJump* base = isolate->long_jump_base();
   LongJump jump;
@@ -771,7 +771,7 @@
     // Non-optimized code generator.
     CompileParsedFunctionHelper(parsed_function, false);
     if (FLAG_disassemble) {
-      DisassembleCode(parsed_function.function(), false);
+      DisassembleCode(parsed_function->function(), false);
     }
     isolate->set_long_jump_base(base);
     return Error::null();
@@ -851,13 +851,12 @@
     ParsedFunction* parsed_function = new ParsedFunction(func);
     parsed_function->SetNodeSequence(fragment);
     parsed_function->set_default_parameter_values(Array::ZoneHandle());
-    parsed_function->set_expression_temp_var(
-        ParsedFunction::CreateExpressionTempVar(0));
+    parsed_function->EnsureExpressionTemp();
     fragment->scope()->AddVariable(parsed_function->expression_temp_var());
     parsed_function->AllocateVariables();
 
     // Non-optimized code generator.
-    CompileParsedFunctionHelper(*parsed_function, false);
+    CompileParsedFunctionHelper(parsed_function, false);
 
     const Object& result = Object::Handle(
         DartEntry::InvokeFunction(func, Object::empty_array()));
diff --git a/runtime/vm/compiler.h b/runtime/vm/compiler.h
index 6ac55c7..352ac4f 100644
--- a/runtime/vm/compiler.h
+++ b/runtime/vm/compiler.h
@@ -50,7 +50,7 @@
   // sets its code field.
   //
   // Returns Error::null() if there is no compilation error.
-  static RawError* CompileParsedFunction(const ParsedFunction& parsed_function);
+  static RawError* CompileParsedFunction(ParsedFunction* parsed_function);
 
   // Generates and executes code for a given code fragment, e.g. a
   // compile time constant expression. Returns the result returned
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index 0d69e3c..a1c3f9e 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -129,13 +129,16 @@
 };
 
 
+// Register aliases for floating point scratch registers.
+const DRegister DTMP = D0;  // Overlaps with STMP.
+const SRegister STMP = S0;
+
 // Architecture independent aliases.
 typedef DRegister FpuRegister;
-const FpuRegister FpuTMP = D0;
+const FpuRegister FpuTMP = DTMP;
 const int kNumberOfFpuRegisters = kNumberOfDRegisters;
 const FpuRegister kNoFpuRegister = kNoDRegister;
 
-
 // Register aliases.
 const Register TMP = IP;  // Used as scratch register by assembler.
 const Register CTX = R9;  // Caches current context in generated code.
diff --git a/runtime/vm/constants_mips.h b/runtime/vm/constants_mips.h
index 64a92c3..e016f7b 100644
--- a/runtime/vm/constants_mips.h
+++ b/runtime/vm/constants_mips.h
@@ -379,6 +379,8 @@
   TNE = 54,
 
   // SPECIAL2 opcodes.
+  MADD = 0,
+  MADDU = 1,
   CLZ = 32,
   CLO = 33,
 };
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index fd7f2da..0afd8df 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -2362,70 +2362,70 @@
   Dart_TypedData_Type type;
   switch (class_id) {
     case kByteDataViewCid :
-      type = kByteData;
+      type = Dart_TypedData_kByteData;
       break;
     case kTypedDataInt8ArrayCid :
     case kTypedDataInt8ArrayViewCid :
     case kExternalTypedDataInt8ArrayCid :
-      type = kInt8;
+      type = Dart_TypedData_kInt8;
       break;
     case kTypedDataUint8ArrayCid :
     case kTypedDataUint8ArrayViewCid :
     case kExternalTypedDataUint8ArrayCid :
-      type = kUint8;
+      type = Dart_TypedData_kUint8;
       break;
     case kTypedDataUint8ClampedArrayCid :
     case kTypedDataUint8ClampedArrayViewCid :
     case kExternalTypedDataUint8ClampedArrayCid :
-      type = kUint8Clamped;
+      type = Dart_TypedData_kUint8Clamped;
       break;
     case kTypedDataInt16ArrayCid :
     case kTypedDataInt16ArrayViewCid :
     case kExternalTypedDataInt16ArrayCid :
-      type = kInt16;
+      type = Dart_TypedData_kInt16;
       break;
     case kTypedDataUint16ArrayCid :
     case kTypedDataUint16ArrayViewCid :
     case kExternalTypedDataUint16ArrayCid :
-      type = kUint16;
+      type = Dart_TypedData_kUint16;
       break;
     case kTypedDataInt32ArrayCid :
     case kTypedDataInt32ArrayViewCid :
     case kExternalTypedDataInt32ArrayCid :
-      type = kInt32;
+      type = Dart_TypedData_kInt32;
       break;
     case kTypedDataUint32ArrayCid :
     case kTypedDataUint32ArrayViewCid :
     case kExternalTypedDataUint32ArrayCid :
-      type = kUint32;
+      type = Dart_TypedData_kUint32;
       break;
     case kTypedDataInt64ArrayCid :
     case kTypedDataInt64ArrayViewCid :
     case kExternalTypedDataInt64ArrayCid :
-      type = kInt64;
+      type = Dart_TypedData_kInt64;
       break;
     case kTypedDataUint64ArrayCid :
     case kTypedDataUint64ArrayViewCid :
     case kExternalTypedDataUint64ArrayCid :
-      type = kUint64;
+      type = Dart_TypedData_kUint64;
       break;
     case kTypedDataFloat32ArrayCid :
     case kTypedDataFloat32ArrayViewCid :
     case kExternalTypedDataFloat32ArrayCid :
-      type = kFloat32;
+      type = Dart_TypedData_kFloat32;
       break;
     case kTypedDataFloat64ArrayCid :
     case kTypedDataFloat64ArrayViewCid :
     case kExternalTypedDataFloat64ArrayCid :
-      type = kFloat64;
+      type = Dart_TypedData_kFloat64;
       break;
     case kTypedDataFloat32x4ArrayCid :
     case kTypedDataFloat32x4ArrayViewCid :
     case kExternalTypedDataFloat32x4ArrayCid :
-      type = kFloat32x4;
+      type = Dart_TypedData_kFloat32x4;
       break;
     default:
-      type = kInvalid;
+      type = Dart_TypedData_kInvalid;
       break;
   }
   return type;
@@ -2438,7 +2438,7 @@
       RawObject::IsTypedDataViewClassId(class_id)) {
     return GetType(class_id);
   }
-  return kInvalid;
+  return Dart_TypedData_kInvalid;
 }
 
 
@@ -2449,7 +2449,7 @@
       RawObject::IsTypedDataViewClassId(class_id)) {
     return GetType(class_id);
   }
-  return kInvalid;
+  return Dart_TypedData_kInvalid;
 }
 
 
@@ -2551,31 +2551,31 @@
   DARTSCOPE(isolate);
   CHECK_CALLBACK_STATE(isolate);
   switch (type) {
-    case kByteData :
+    case Dart_TypedData_kByteData :
       return NewByteData(isolate, length);
-    case kInt8 :
+    case Dart_TypedData_kInt8 :
       return NewTypedData(isolate, kTypedDataInt8ArrayCid, length);
-    case kUint8 :
+    case Dart_TypedData_kUint8 :
       return NewTypedData(isolate, kTypedDataUint8ArrayCid, length);
-    case kUint8Clamped :
+    case Dart_TypedData_kUint8Clamped :
       return NewTypedData(isolate, kTypedDataUint8ClampedArrayCid, length);
-    case kInt16 :
+    case Dart_TypedData_kInt16 :
       return NewTypedData(isolate, kTypedDataInt16ArrayCid, length);
-    case kUint16 :
+    case Dart_TypedData_kUint16 :
       return NewTypedData(isolate, kTypedDataUint16ArrayCid, length);
-    case kInt32 :
+    case Dart_TypedData_kInt32 :
       return NewTypedData(isolate, kTypedDataInt32ArrayCid, length);
-    case kUint32 :
+    case Dart_TypedData_kUint32 :
       return NewTypedData(isolate, kTypedDataUint32ArrayCid, length);
-    case kInt64 :
+    case Dart_TypedData_kInt64 :
       return NewTypedData(isolate, kTypedDataInt64ArrayCid, length);
-    case kUint64 :
+    case Dart_TypedData_kUint64 :
       return NewTypedData(isolate, kTypedDataUint64ArrayCid, length);
-    case kFloat32 :
+    case Dart_TypedData_kFloat32 :
       return NewTypedData(isolate, kTypedDataFloat32ArrayCid,  length);
-    case kFloat64 :
+    case Dart_TypedData_kFloat64 :
       return NewTypedData(isolate, kTypedDataFloat64ArrayCid, length);
-    case kFloat32x4:
+    case Dart_TypedData_kFloat32x4:
       return NewTypedData(isolate, kTypedDataFloat32x4ArrayCid, length);
     default:
       return Api::NewError("%s expects argument 'type' to be of 'TypedData'",
@@ -2597,64 +2597,64 @@
   }
   CHECK_CALLBACK_STATE(isolate);
   switch (type) {
-    case kByteData:
+    case Dart_TypedData_kByteData:
       return NewExternalByteData(isolate, data, length);
-    case kInt8:
+    case Dart_TypedData_kInt8:
       return NewExternalTypedData(isolate,
                                   kExternalTypedDataInt8ArrayCid,
                                   data,
                                   length);
-    case kUint8:
+    case Dart_TypedData_kUint8:
       return NewExternalTypedData(isolate,
                                   kExternalTypedDataUint8ArrayCid,
                                   data,
                                   length);
-    case kUint8Clamped:
+    case Dart_TypedData_kUint8Clamped:
       return NewExternalTypedData(isolate,
                                   kExternalTypedDataUint8ClampedArrayCid,
                                   data,
                                   length);
-    case kInt16:
+    case Dart_TypedData_kInt16:
       return NewExternalTypedData(isolate,
                                   kExternalTypedDataInt16ArrayCid,
                                   data,
                                   length);
-    case kUint16:
+    case Dart_TypedData_kUint16:
       return NewExternalTypedData(isolate,
                                   kExternalTypedDataUint16ArrayCid,
                                   data,
                                   length);
-    case kInt32:
+    case Dart_TypedData_kInt32:
       return NewExternalTypedData(isolate,
                                   kExternalTypedDataInt32ArrayCid,
                                   data,
                                   length);
-    case kUint32:
+    case Dart_TypedData_kUint32:
       return NewExternalTypedData(isolate,
                                   kExternalTypedDataUint32ArrayCid,
                                   data,
                                   length);
-    case kInt64:
+    case Dart_TypedData_kInt64:
       return NewExternalTypedData(isolate,
                                   kExternalTypedDataInt64ArrayCid,
                                   data,
                                   length);
-    case kUint64:
+    case Dart_TypedData_kUint64:
       return NewExternalTypedData(isolate,
                                   kExternalTypedDataUint64ArrayCid,
                                   data,
                                   length);
-    case kFloat32:
+    case Dart_TypedData_kFloat32:
       return NewExternalTypedData(isolate,
                                   kExternalTypedDataFloat32ArrayCid,
                                   data,
                                   length);
-    case kFloat64:
+    case Dart_TypedData_kFloat64:
       return NewExternalTypedData(isolate,
                                   kExternalTypedDataFloat64ArrayCid,
                                   data,
                                   length);
-    case kFloat32x4:
+    case Dart_TypedData_kFloat32x4:
       return NewExternalTypedData(isolate,
                                   kExternalTypedDataFloat32x4ArrayCid,
                                   data,
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 9368382..e77d6df 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -800,12 +800,16 @@
 
 
 TEST_CASE(TypedDataAccess) {
-  EXPECT_EQ(kInvalid, Dart_GetTypeOfTypedData(Dart_True()));
-  EXPECT_EQ(kInvalid, Dart_GetTypeOfExternalTypedData(Dart_False()));
-  Dart_Handle byte_array1 = Dart_NewTypedData(kUint8, 10);
+  EXPECT_EQ(Dart_TypedData_kInvalid,
+            Dart_GetTypeOfTypedData(Dart_True()));
+  EXPECT_EQ(Dart_TypedData_kInvalid,
+            Dart_GetTypeOfExternalTypedData(Dart_False()));
+  Dart_Handle byte_array1 = Dart_NewTypedData(Dart_TypedData_kUint8, 10);
   EXPECT_VALID(byte_array1);
-  EXPECT_EQ(kUint8, Dart_GetTypeOfTypedData(byte_array1));
-  EXPECT_EQ(kInvalid, Dart_GetTypeOfExternalTypedData(byte_array1));
+  EXPECT_EQ(Dart_TypedData_kUint8,
+            Dart_GetTypeOfTypedData(byte_array1));
+  EXPECT_EQ(Dart_TypedData_kInvalid,
+            Dart_GetTypeOfExternalTypedData(byte_array1));
   EXPECT(Dart_IsList(byte_array1));
 
   intptr_t length = 0;
@@ -832,7 +836,7 @@
     EXPECT_EQ(i + 1, int64_t_value);
   }
 
-  Dart_Handle byte_array2 = Dart_NewTypedData(kUint8, 10);
+  Dart_Handle byte_array2 = Dart_NewTypedData(Dart_TypedData_kUint8, 10);
   bool is_equal = false;
   Dart_ObjectEquals(byte_array1, byte_array2, &is_equal);
   EXPECT(!is_equal);
@@ -872,9 +876,9 @@
 
 static void ByteDataNativeFunction(Dart_NativeArguments args) {
   Dart_EnterScope();
-  Dart_Handle byte_data = Dart_NewTypedData(kByteData, kLength);
+  Dart_Handle byte_data = Dart_NewTypedData(Dart_TypedData_kByteData, kLength);
   EXPECT_VALID(byte_data);
-  EXPECT_EQ(kByteData, Dart_GetTypeOfTypedData(byte_data));
+  EXPECT_EQ(Dart_TypedData_kByteData, Dart_GetTypeOfTypedData(byte_data));
   Dart_SetReturnValue(args, byte_data);
   Dart_ExitScope();
 }
@@ -929,11 +933,11 @@
 
 static void ExternalByteDataNativeFunction(Dart_NativeArguments args) {
   Dart_EnterScope();
-  Dart_Handle external_byte_data = Dart_NewExternalTypedData(kByteData,
-                                                             data,
-                                                             16);
+  Dart_Handle external_byte_data = Dart_NewExternalTypedData(
+      Dart_TypedData_kByteData, data, 16);
   EXPECT_VALID(external_byte_data);
-  EXPECT_EQ(kByteData, Dart_GetTypeOfTypedData(external_byte_data));
+  EXPECT_EQ(Dart_TypedData_kByteData,
+            Dart_GetTypeOfTypedData(external_byte_data));
   Dart_SetReturnValue(args, external_byte_data);
   Dart_ExitScope();
 }
@@ -994,7 +998,7 @@
 
 TEST_CASE(TypedDataDirectAccess) {
   Dart_Handle str = Dart_NewStringFromCString("junk");
-  Dart_Handle byte_array = Dart_NewTypedData(kUint8, 10);
+  Dart_Handle byte_array = Dart_NewTypedData(Dart_TypedData_kUint8, 10);
   EXPECT_VALID(byte_array);
   Dart_Handle result;
   result = Dart_TypedDataAcquireData(byte_array, NULL, NULL, NULL);
@@ -1098,16 +1102,16 @@
   Dart_Handle list_access_test_obj;
   list_access_test_obj = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(list_access_test_obj);
-  TestDirectAccess(lib, list_access_test_obj, kInt8);
+  TestDirectAccess(lib, list_access_test_obj, Dart_TypedData_kInt8);
 
   // Test with an external typed data object.
   uint8_t data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
   intptr_t data_length = ARRAY_SIZE(data);
   Dart_Handle ext_list_access_test_obj;
-  ext_list_access_test_obj = Dart_NewExternalTypedData(kUint8,
+  ext_list_access_test_obj = Dart_NewExternalTypedData(Dart_TypedData_kUint8,
                                                        data, data_length);
   EXPECT_VALID(ext_list_access_test_obj);
-  TestDirectAccess(lib, ext_list_access_test_obj, kUint8);
+  TestDirectAccess(lib, ext_list_access_test_obj, Dart_TypedData_kUint8);
 }
 
 
@@ -1146,7 +1150,7 @@
   Dart_Handle list_access_test_obj;
   list_access_test_obj = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(list_access_test_obj);
-  TestDirectAccess(lib, list_access_test_obj, kInt8);
+  TestDirectAccess(lib, list_access_test_obj, Dart_TypedData_kInt8);
 }
 
 
@@ -1185,7 +1189,7 @@
   Dart_Handle list_access_test_obj;
   list_access_test_obj = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(list_access_test_obj);
-  TestDirectAccess(lib, list_access_test_obj, kByteData);
+  TestDirectAccess(lib, list_access_test_obj, Dart_TypedData_kByteData);
 }
 
 
@@ -1250,8 +1254,9 @@
   uint8_t data[] = { 0, 11, 22, 33, 44, 55, 66, 77 };
   intptr_t data_length = ARRAY_SIZE(data);
 
-  Dart_Handle obj = Dart_NewExternalTypedData(kUint8, data, data_length);
-  ExternalTypedDataAccessTests(obj, kUint8, data, data_length);
+  Dart_Handle obj = Dart_NewExternalTypedData(
+      Dart_TypedData_kUint8, data, data_length);
+  ExternalTypedDataAccessTests(obj, Dart_TypedData_kUint8, data, data_length);
 }
 
 
@@ -1259,8 +1264,10 @@
   uint8_t data[] = { 0, 11, 22, 33, 44, 55, 66, 77 };
   intptr_t data_length = ARRAY_SIZE(data);
 
-  Dart_Handle obj = Dart_NewExternalTypedData(kUint8Clamped, data, data_length);
-  ExternalTypedDataAccessTests(obj, kUint8Clamped, data, data_length);
+  Dart_Handle obj = Dart_NewExternalTypedData(
+      Dart_TypedData_kUint8Clamped, data, data_length);
+  ExternalTypedDataAccessTests(obj, Dart_TypedData_kUint8Clamped,
+                               data, data_length);
 }
 
 
@@ -1279,7 +1286,7 @@
 
   uint8_t data[] = { 0, 11, 22, 33, 44, 55, 66, 77 };
   intptr_t data_length = ARRAY_SIZE(data);
-  Dart_Handle obj = Dart_NewExternalTypedData(kUint8Clamped,
+  Dart_Handle obj = Dart_NewExternalTypedData(Dart_TypedData_kUint8Clamped,
                                               data, data_length);
   EXPECT_VALID(obj);
   Dart_Handle result;
@@ -1312,7 +1319,7 @@
     Dart_EnterScope();
     uint8_t data[] = { 1, 2, 3, 4 };
     Dart_Handle obj = Dart_NewExternalTypedData(
-        kUint8,
+        Dart_TypedData_kUint8,
         data,
         ARRAY_SIZE(data));
     Dart_NewWeakPersistentHandle(obj, &peer, ExternalTypedDataFinalizer);
@@ -1332,7 +1339,7 @@
   intptr_t len;
   Dart_TypedData_Type type;
   EXPECT_VALID(Dart_TypedDataAcquireData(obj, &type, &raw_data, &len));
-  EXPECT_EQ(kFloat32x4, type);
+  EXPECT_EQ(Dart_TypedData_kFloat32x4, type);
   EXPECT_EQ(len, 10);
   float* float_data = reinterpret_cast<float*>(raw_data);
   for (int i = 0; i < len * 4; i++) {
@@ -1355,7 +1362,7 @@
   EXPECT_VALID(obj);
   CheckFloat32x4Data(obj);
 
-  obj = Dart_NewTypedData(kFloat32x4, 10);
+  obj = Dart_NewTypedData(Dart_TypedData_kFloat32x4, 10);
   EXPECT_VALID(obj);
   CheckFloat32x4Data(obj);
 
@@ -1368,7 +1375,8 @@
   // Dart_NewExternalTypedData.
   Dart_EnterScope();
   {
-    Dart_Handle lcl = Dart_NewExternalTypedData(kFloat32x4, data, 10);
+    Dart_Handle lcl = Dart_NewExternalTypedData(
+        Dart_TypedData_kFloat32x4, data, 10);
     Dart_NewWeakPersistentHandle(lcl, &peer, ExternalTypedDataFinalizer);
     CheckFloat32x4Data(lcl);
   }
@@ -5268,7 +5276,7 @@
 static Dart_Handle library_handler(Dart_LibraryTag tag,
                                    Dart_Handle library,
                                    Dart_Handle url) {
-  if (tag == kCanonicalizeUrl) {
+  if (tag == Dart_kCanonicalizeUrl) {
     return url;
   }
   return Api::Success();
@@ -5368,7 +5376,7 @@
 static Dart_Handle import_library_handler(Dart_LibraryTag tag,
                                           Dart_Handle library,
                                           Dart_Handle url) {
-  if (tag == kCanonicalizeUrl) {
+  if (tag == Dart_kCanonicalizeUrl) {
     return url;
   }
   EXPECT(Dart_IsString(url));
@@ -6427,12 +6435,12 @@
                            Dart_CObject *message) {
   // Gets a null message.
   EXPECT_NOTNULL(message);
-  EXPECT_EQ(Dart_CObject::kNull, message->type);
+  EXPECT_EQ(Dart_CObject_kNull, message->type);
 
   // Post integer value.
   Dart_CObject* response =
       reinterpret_cast<Dart_CObject*>(Dart_ScopeAllocate(sizeof(Dart_CObject)));
-  response->type = Dart_CObject::kInt32;
+  response->type = Dart_CObject_kInt32;
   response->value.as_int32 = 123;
   Dart_PostCObject(reply_port_id, response);
 }
@@ -6443,12 +6451,12 @@
                            Dart_CObject* message) {
   // Gets a null message.
   EXPECT_NOTNULL(message);
-  EXPECT_EQ(Dart_CObject::kNull, message->type);
+  EXPECT_EQ(Dart_CObject_kNull, message->type);
 
   // Post integer value.
   Dart_CObject* response =
       reinterpret_cast<Dart_CObject*>(Dart_ScopeAllocate(sizeof(Dart_CObject)));
-  response->type = Dart_CObject::kInt32;
+  response->type = Dart_CObject_kInt32;
   response->value.as_int32 = 321;
   Dart_PostCObject(reply_port_id, response);
 }
diff --git a/runtime/vm/dart_api_message.cc b/runtime/vm/dart_api_message.cc
index c28bd7c..390e9fb 100644
--- a/runtime/vm/dart_api_message.cc
+++ b/runtime/vm/dart_api_message.cc
@@ -30,9 +30,9 @@
   memset(&type_arguments_marker, 0, sizeof(type_arguments_marker));
   memset(&dynamic_type_marker, 0, sizeof(dynamic_type_marker));
   type_arguments_marker.type =
-      static_cast<Dart_CObject::Type>(Dart_CObject_Internal::kTypeArguments);
+      static_cast<Dart_CObject_Type>(Dart_CObject_Internal::kTypeArguments);
   dynamic_type_marker.type =
-      static_cast<Dart_CObject::Type>(Dart_CObject_Internal::kDynamicType);
+      static_cast<Dart_CObject_Type>(Dart_CObject_Internal::kDynamicType);
 }
 
 
@@ -51,7 +51,7 @@
 }
 
 
-Dart_CObject* ApiMessageReader::AllocateDartCObject(Dart_CObject::Type type) {
+Dart_CObject* ApiMessageReader::AllocateDartCObject(Dart_CObject_Type type) {
   Dart_CObject* value =
       reinterpret_cast<Dart_CObject*>(alloc_(NULL, 0, sizeof(Dart_CObject)));
   ASSERT(value != NULL);
@@ -61,31 +61,31 @@
 
 
 Dart_CObject* ApiMessageReader::AllocateDartCObjectUnsupported() {
-  return AllocateDartCObject(Dart_CObject::kUnsupported);
+  return AllocateDartCObject(Dart_CObject_kUnsupported);
 }
 
 
 Dart_CObject* ApiMessageReader::AllocateDartCObjectNull() {
-  return AllocateDartCObject(Dart_CObject::kNull);
+  return AllocateDartCObject(Dart_CObject_kNull);
 }
 
 
 Dart_CObject* ApiMessageReader::AllocateDartCObjectBool(bool val) {
-  Dart_CObject* value = AllocateDartCObject(Dart_CObject::kBool);
+  Dart_CObject* value = AllocateDartCObject(Dart_CObject_kBool);
   value->value.as_bool = val;
   return value;
 }
 
 
 Dart_CObject* ApiMessageReader::AllocateDartCObjectInt32(int32_t val) {
-  Dart_CObject* value = AllocateDartCObject(Dart_CObject::kInt32);
+  Dart_CObject* value = AllocateDartCObject(Dart_CObject_kInt32);
   value->value.as_int32 = val;
   return value;
 }
 
 
 Dart_CObject* ApiMessageReader::AllocateDartCObjectInt64(int64_t val) {
-  Dart_CObject* value = AllocateDartCObject(Dart_CObject::kInt64);
+  Dart_CObject* value = AllocateDartCObject(Dart_CObject_kInt64);
   value->value.as_int64 = val;
   return value;
 }
@@ -99,13 +99,13 @@
       reinterpret_cast<Dart_CObject*>(
           alloc_(NULL, 0, sizeof(Dart_CObject) + length + 1));
   value->value.as_bigint = reinterpret_cast<char*>(value) + sizeof(*value);
-  value->type = Dart_CObject::kBigint;
+  value->type = Dart_CObject_kBigint;
   return value;
 }
 
 
 Dart_CObject* ApiMessageReader::AllocateDartCObjectDouble(double val) {
-  Dart_CObject* value = AllocateDartCObject(Dart_CObject::kDouble);
+  Dart_CObject* value = AllocateDartCObject(Dart_CObject_kDouble);
   value->value.as_double = val;
   return value;
 }
@@ -120,27 +120,27 @@
           alloc_(NULL, 0, sizeof(Dart_CObject) + length + 1));
   ASSERT(value != NULL);
   value->value.as_string = reinterpret_cast<char*>(value) + sizeof(*value);
-  value->type = Dart_CObject::kString;
+  value->type = Dart_CObject_kString;
   return value;
 }
 
 
-static int GetTypedDataSizeInBytes(Dart_CObject::TypedDataType type) {
+static int GetTypedDataSizeInBytes(Dart_TypedData_Type type) {
   switch (type) {
-    case Dart_CObject::kInt8Array:
-    case Dart_CObject::kUint8Array:
-    case Dart_CObject::kUint8ClampedArray:
+    case Dart_TypedData_kInt8:
+    case Dart_TypedData_kUint8:
+    case Dart_TypedData_kUint8Clamped:
       return 1;
-    case Dart_CObject::kInt16Array:
-    case Dart_CObject::kUint16Array:
+    case Dart_TypedData_kInt16:
+    case Dart_TypedData_kUint16:
       return 2;
-    case Dart_CObject::kInt32Array:
-    case Dart_CObject::kUint32Array:
-    case Dart_CObject::kFloat32Array:
+    case Dart_TypedData_kInt32:
+    case Dart_TypedData_kUint32:
+    case Dart_TypedData_kFloat32:
       return 4;
-    case Dart_CObject::kInt64Array:
-    case Dart_CObject::kUint64Array:
-    case Dart_CObject::kFloat64Array:
+    case Dart_TypedData_kInt64:
+    case Dart_TypedData_kUint64:
+    case Dart_TypedData_kFloat64:
       return 8;
     default:
       break;
@@ -151,7 +151,7 @@
 
 
 Dart_CObject* ApiMessageReader::AllocateDartCObjectTypedData(
-    Dart_CObject::TypedDataType type, intptr_t length) {
+    Dart_TypedData_Type type, intptr_t length) {
   // Allocate a Dart_CObject structure followed by an array of bytes
   // for the byte array content. The pointer to the byte array content
   // is set up to this area.
@@ -160,7 +160,7 @@
       reinterpret_cast<Dart_CObject*>(
           alloc_(NULL, 0, sizeof(Dart_CObject) + length_in_bytes));
   ASSERT(value != NULL);
-  value->type = Dart_CObject::kTypedData;
+  value->type = Dart_CObject_kTypedData;
   value->value.as_typed_data.type = type;
   value->value.as_typed_data.length = length_in_bytes;
   if (length > 0) {
@@ -181,7 +181,7 @@
       reinterpret_cast<Dart_CObject*>(
           alloc_(NULL, 0, sizeof(Dart_CObject) + length * sizeof(value)));
   ASSERT(value != NULL);
-  value->type = Dart_CObject::kArray;
+  value->type = Dart_CObject_kArray;
   value->value.as_array.length = length;
   if (length > 0) {
     value->value.as_array.values = reinterpret_cast<Dart_CObject**>(value + 1);
@@ -198,7 +198,7 @@
       reinterpret_cast<Dart_CObject_Internal*>(
           alloc_(NULL, 0, sizeof(Dart_CObject_Internal)));
   ASSERT(value != NULL);
-  value->type = static_cast<Dart_CObject::Type>(type);
+  value->type = static_cast<Dart_CObject_Type>(type);
   return value;
 }
 
@@ -219,25 +219,25 @@
 }
 
 
-static Dart_CObject::TypedDataType GetTypedDataTypeFromView(
+static Dart_TypedData_Type GetTypedDataTypeFromView(
     Dart_CObject_Internal* object) {
   struct {
     const char* name;
-    Dart_CObject::TypedDataType type;
+    Dart_TypedData_Type type;
   } view_class_names[] = {
-    { "_Int8ArrayView", Dart_CObject::kInt8Array },
-    { "_Uint8ArrayView", Dart_CObject::kUint8Array },
-    { "_Uint8ClampedArrayView", Dart_CObject::kUint8ClampedArray },
-    { "_Int16ArrayView", Dart_CObject::kInt16Array },
-    { "_Uint16ArrayView", Dart_CObject::kUint16Array },
-    { "_Int32ArrayView", Dart_CObject::kInt32Array },
-    { "_Uint32ArrayView", Dart_CObject::kUint32Array },
-    { "_Int64ArrayView", Dart_CObject::kInt64Array },
-    { "_Uint64ArrayView", Dart_CObject::kUint64Array },
-    { "_ByteDataView", Dart_CObject::kUint8Array },
-    { "_Float32ArrayView", Dart_CObject::kFloat32Array },
-    { "_Float64ArrayView", Dart_CObject::kFloat64Array },
-    { NULL, Dart_CObject::kNumberOfTypedDataTypes },
+    { "_Int8ArrayView", Dart_TypedData_kInt8 },
+    { "_Uint8ArrayView", Dart_TypedData_kUint8 },
+    { "_Uint8ClampedArrayView", Dart_TypedData_kUint8Clamped },
+    { "_Int16ArrayView", Dart_TypedData_kInt16 },
+    { "_Uint16ArrayView", Dart_TypedData_kUint16 },
+    { "_Int32ArrayView", Dart_TypedData_kInt32 },
+    { "_Uint32ArrayView", Dart_TypedData_kUint32 },
+    { "_Int64ArrayView", Dart_TypedData_kInt64 },
+    { "_Uint64ArrayView", Dart_TypedData_kUint64 },
+    { "_ByteDataView", Dart_TypedData_kUint8 },
+    { "_Float32ArrayView", Dart_TypedData_kFloat32 },
+    { "_Float64ArrayView", Dart_TypedData_kFloat64 },
+    { NULL, Dart_TypedData_kInvalid },
   };
 
   char* library_url =
@@ -245,7 +245,7 @@
   char* class_name =
       object->cls->internal.as_class.class_name->value.as_string;
   if (strcmp("dart:typed_data", library_url) != 0) {
-    return Dart_CObject::kNumberOfTypedDataTypes;
+    return Dart_TypedData_kInvalid;
   }
   int i = 0;
   while (view_class_names[i].name != NULL) {
@@ -256,7 +256,7 @@
     }
     i++;
   }
-  return Dart_CObject::kNumberOfTypedDataTypes;
+  return Dart_TypedData_kInvalid;
 }
 
 
@@ -279,17 +279,17 @@
       // Read class of object.
       object->cls = reinterpret_cast<Dart_CObject_Internal*>(ReadObjectImpl());
       ASSERT(object->cls->type ==
-             static_cast<Dart_CObject::Type>(Dart_CObject_Internal::kClass));
+             static_cast<Dart_CObject_Type>(Dart_CObject_Internal::kClass));
     }
     ASSERT(object->type ==
-           static_cast<Dart_CObject::Type>(
+           static_cast<Dart_CObject_Type>(
                Dart_CObject_Internal::kUninitialized));
 
     // Handle typed data views.
-    Dart_CObject::TypedDataType type = GetTypedDataTypeFromView(object);
-    if (type != Dart_CObject::kNumberOfTypedDataTypes) {
+    Dart_TypedData_Type type = GetTypedDataTypeFromView(object);
+    if (type != Dart_TypedData_kInvalid) {
       object->type =
-          static_cast<Dart_CObject::Type>(Dart_CObject_Internal::kView);
+          static_cast<Dart_CObject_Type>(Dart_CObject_Internal::kView);
       ReadObjectImpl();  // Skip type arguments.
       object->internal.as_view.buffer = ReadObjectImpl();
       object->internal.as_view.offset_in_bytes = ReadSmiValue();
@@ -299,10 +299,10 @@
       // The buffer is fully read now as typed data objects are
       // serialized in-line.
       Dart_CObject* buffer = object->internal.as_view.buffer;
-      ASSERT(buffer->type == Dart_CObject::kTypedData);
+      ASSERT(buffer->type == Dart_CObject_kTypedData);
 
       // Now turn the view into a byte array.
-      object->type = Dart_CObject::kTypedData;
+      object->type = Dart_CObject_kTypedData;
       object->value.as_typed_data.type = type;
       object->value.as_typed_data.length =
           object->internal.as_view.length *
@@ -331,7 +331,7 @@
     // updated (currently type_arguments is leaked).
     Dart_CObject* type_arguments = ReadObjectImpl();
     if (type_arguments != &type_arguments_marker &&
-        type_arguments->type != Dart_CObject::kNull) {
+        type_arguments->type != Dart_CObject_kNull) {
       return AllocateDartCObjectUnsupported();
     }
     for (int i = 0; i < len; i++) {
@@ -405,7 +405,7 @@
     // Read class of object.
     object->cls = reinterpret_cast<Dart_CObject_Internal*>(ReadObjectImpl());
     ASSERT(object->cls->type ==
-           static_cast<Dart_CObject::Type>(Dart_CObject_Internal::kClass));
+           static_cast<Dart_CObject_Type>(Dart_CObject_Internal::kClass));
     return object;
   }
   ASSERT((class_header & kSmiTagMask) != 0);
@@ -453,10 +453,10 @@
       AddBackRef(object_id, object, kIsDeserialized);
       object->internal.as_class.library_url = ReadObjectImpl();
       ASSERT(object->internal.as_class.library_url->type ==
-             Dart_CObject::kString);
+             Dart_CObject_kString);
       object->internal.as_class.class_name = ReadObjectImpl();
       ASSERT(object->internal.as_class.class_name->type ==
-             Dart_CObject::kString);
+             Dart_CObject_kString);
       return object;
     }
     case kTypeArgumentsCid: {
@@ -465,7 +465,7 @@
       Dart_CObject* value = &type_arguments_marker;
       AddBackRef(object_id, value, kIsDeserialized);
       Dart_CObject* length = ReadObjectImpl();
-      ASSERT(length->type == Dart_CObject::kInt32);
+      ASSERT(length->type == Dart_CObject_kInt32);
       for (int i = 0; i < length->value.as_int32; i++) {
         Dart_CObject* type = ReadObjectImpl();
         if (type != &dynamic_type_marker) {
@@ -486,9 +486,9 @@
       USE(type_state);
       Dart_CObject* parameterized_class = ReadObjectImpl();
       // The type parameter is finalized, therefore parameterized_class is null.
-      ASSERT(parameterized_class->type == Dart_CObject::kNull);
+      ASSERT(parameterized_class->type == Dart_CObject_kNull);
       Dart_CObject* name = ReadObjectImpl();
-      ASSERT(name->type == Dart_CObject::kString);
+      ASSERT(name->type == Dart_CObject_kString);
       return value;
     }
     case kMintCid: {
@@ -582,7 +582,7 @@
     {                                                                          \
       intptr_t len = ReadSmiValue();                                           \
       Dart_CObject* object =                                                   \
-          AllocateDartCObjectTypedData(Dart_CObject::k##type##Array, len);     \
+          AllocateDartCObjectTypedData(Dart_TypedData_k##type, len);     \
       AddBackRef(object_id, object, kIsDeserialized);                          \
       if (len > 0) {                                                           \
         ctype* p =                                                             \
@@ -654,7 +654,7 @@
       AddBackRef(object_id, value, kIsDeserialized);
       // Read the content of the GrowableObjectArray.
       Dart_CObject* content = ReadObjectImpl();
-      ASSERT(content->type == Dart_CObject::kArray);
+      ASSERT(content->type == Dart_CObject_kArray);
       // Make the empty array allocated point to the backing store content.
       value->value.as_array.length = len;
       value->value.as_array.values = content->value.as_array.values;
@@ -767,14 +767,14 @@
   // an offset for making marking of object id 0 possible.
   ASSERT(!IsCObjectMarked(object));
   intptr_t mark_value = object_id + kDartCObjectMarkOffset;
-  object->type = static_cast<Dart_CObject::Type>(
+  object->type = static_cast<Dart_CObject_Type>(
       ((mark_value) << kDartCObjectTypeBits) | object->type);
 }
 
 
 void ApiMessageWriter::UnmarkCObject(Dart_CObject* object) {
   ASSERT(IsCObjectMarked(object));
-  object->type = static_cast<Dart_CObject::Type>(
+  object->type = static_cast<Dart_CObject_Type>(
       object->type & kDartCObjectTypeMask);
 }
 
@@ -796,7 +796,7 @@
 void ApiMessageWriter::UnmarkAllCObjects(Dart_CObject* object) {
   if (!IsCObjectMarked(object)) return;
   UnmarkCObject(object);
-  if (object->type == Dart_CObject::kArray) {
+  if (object->type == Dart_CObject_kArray) {
     for (int i = 0; i < object->value.as_array.length; i++) {
       Dart_CObject* element = object->value.as_array.values[i];
       UnmarkAllCObjects(element);
@@ -885,8 +885,8 @@
     return true;
   }
 
-  Dart_CObject::Type type = object->type;
-  if (type == Dart_CObject::kArray) {
+  Dart_CObject_Type type = object->type;
+  if (type == Dart_CObject_kArray) {
     // Write out the serialization header value for this object.
     WriteInlinedHeader(object);
     // Write out the class and tags information.
@@ -914,8 +914,8 @@
     return true;
   }
 
-  Dart_CObject::Type type = object->type;
-  if (type == Dart_CObject::kArray) {
+  Dart_CObject_Type type = object->type;
+  if (type == Dart_CObject_kArray) {
     // Write out the serialization header value for this object.
     WriteInlinedHeader(object);
     // Write out the class information.
@@ -932,9 +932,9 @@
 
 bool ApiMessageWriter::WriteForwardedCObject(Dart_CObject* object) {
   ASSERT(IsCObjectMarked(object));
-  Dart_CObject::Type type =
-      static_cast<Dart_CObject::Type>(object->type & kDartCObjectTypeMask);
-  ASSERT(type == Dart_CObject::kArray);
+  Dart_CObject_Type type =
+      static_cast<Dart_CObject_Type>(object->type & kDartCObjectTypeMask);
+  ASSERT(type == Dart_CObject_kArray);
 
   // Write out the serialization header value for this object.
   intptr_t object_id = GetMarkedCObjectMark(object);
@@ -956,25 +956,25 @@
 
 
 bool ApiMessageWriter::WriteCObjectInlined(Dart_CObject* object,
-                                           Dart_CObject::Type type) {
+                                           Dart_CObject_Type type) {
   switch (type) {
-    case Dart_CObject::kNull:
+    case Dart_CObject_kNull:
       WriteNullObject();
       break;
-    case Dart_CObject::kBool:
+    case Dart_CObject_kBool:
       if (object->value.as_bool) {
         WriteVMIsolateObject(kTrueValue);
       } else {
         WriteVMIsolateObject(kFalseValue);
       }
       break;
-    case Dart_CObject::kInt32:
+    case Dart_CObject_kInt32:
       WriteInt32(object);
       break;
-    case Dart_CObject::kInt64:
+    case Dart_CObject_kInt64:
       WriteInt64(object);
       break;
-    case Dart_CObject::kBigint: {
+    case Dart_CObject_kBigint: {
       // Write out the serialization header value for this object.
       WriteInlinedHeader(object);
       // Write out the class and tags information.
@@ -989,7 +989,7 @@
       }
       break;
     }
-    case Dart_CObject::kDouble:
+    case Dart_CObject_kDouble:
       // Write out the serialization header value for this object.
       WriteInlinedHeader(object);
       // Write out the class and tags information.
@@ -998,7 +998,7 @@
       // Write double value.
       Write<double>(object->value.as_double);
       break;
-    case Dart_CObject::kString: {
+    case Dart_CObject_kString: {
       const uint8_t* utf8_str =
           reinterpret_cast<const uint8_t*>(object->value.as_string);
       intptr_t utf8_len = strlen(object->value.as_string);
@@ -1042,16 +1042,16 @@
       }
       break;
     }
-    case Dart_CObject::kTypedData: {
+    case Dart_CObject_kTypedData: {
       // Write out the serialization header value for this object.
       WriteInlinedHeader(object);
       // Write out the class and tags information.
       intptr_t class_id;
       switch (object->value.as_typed_data.type) {
-        case Dart_CObject::kInt8Array:
+        case Dart_TypedData_kInt8:
           class_id = kTypedDataInt8ArrayCid;
           break;
-        case Dart_CObject::kUint8Array:
+        case Dart_TypedData_kUint8:
           class_id = kTypedDataUint8ArrayCid;
           break;
         default:
@@ -1069,7 +1069,7 @@
       }
       break;
     }
-    case Dart_CObject::kExternalTypedData: {
+    case Dart_CObject_kExternalTypedData: {
       // TODO(ager): we are writing C pointers into the message in
       // order to post external arrays through ports. We need to make
       // sure that messages containing pointers can never be posted
diff --git a/runtime/vm/dart_api_message.h b/runtime/vm/dart_api_message.h
index 3ad8fb9..876c474 100644
--- a/runtime/vm/dart_api_message.h
+++ b/runtime/vm/dart_api_message.h
@@ -16,7 +16,7 @@
 // that graph.
 struct Dart_CObject_Internal : public Dart_CObject {
   enum Type {
-    kTypeArguments = Dart_CObject::kNumberOfTypes,
+    kTypeArguments = Dart_CObject_kNumberOfTypes,
     kDynamicType,
     kClass,
     kView,
@@ -70,7 +70,7 @@
   // Allocates a Dart_CObject object.
   Dart_CObject* AllocateDartCObject();
   // Allocates a Dart_CObject object with the specified type.
-  Dart_CObject* AllocateDartCObject(Dart_CObject::Type type);
+  Dart_CObject* AllocateDartCObject(Dart_CObject_Type type);
   // Allocates a Dart_CObject object representing an unsupported
   // object in the API message.
   Dart_CObject* AllocateDartCObjectUnsupported();
@@ -90,7 +90,7 @@
   Dart_CObject* AllocateDartCObjectString(intptr_t length);
   // Allocates a C Dart_CObject object for a typed data.
   Dart_CObject* AllocateDartCObjectTypedData(
-      Dart_CObject::TypedDataType type, intptr_t length);
+      Dart_TypedData_Type type, intptr_t length);
   // Allocates a C array of Dart_CObject objects.
   Dart_CObject* AllocateDartCObjectArray(intptr_t length);
   // Allocates a Dart_CObject_Internal object with the specified type.
@@ -120,7 +120,7 @@
   Dart_CObject* GetBackRef(intptr_t id);
 
   Dart_CObject_Internal* AsInternal(Dart_CObject* object) {
-    ASSERT(object->type >= Dart_CObject::kNumberOfTypes);
+    ASSERT(object->type >= Dart_CObject_kNumberOfTypes);
     return reinterpret_cast<Dart_CObject_Internal*>(object);
   }
 
@@ -143,7 +143,7 @@
       : BaseWriter(buffer, alloc, kInitialSize),
         object_id_(0), forward_list_(NULL),
         forward_list_length_(0), forward_id_(0) {
-    ASSERT(kDartCObjectTypeMask >= Dart_CObject::kNumberOfTypes - 1);
+    ASSERT(kDartCObjectTypeMask >= Dart_CObject_kNumberOfTypes - 1);
   }
   ~ApiMessageWriter() {
     ::free(forward_list_);
@@ -177,7 +177,7 @@
   bool WriteCObject(Dart_CObject* object);
   bool WriteCObjectRef(Dart_CObject* object);
   bool WriteForwardedCObject(Dart_CObject* object);
-  bool WriteCObjectInlined(Dart_CObject* object, Dart_CObject::Type type);
+  bool WriteCObjectInlined(Dart_CObject* object, Dart_CObject_Type type);
 
   intptr_t object_id_;
   Dart_CObject** forward_list_;
diff --git a/runtime/vm/disassembler_mips.cc b/runtime/vm/disassembler_mips.cc
index f6d7051..ecbea4f 100644
--- a/runtime/vm/disassembler_mips.cc
+++ b/runtime/vm/disassembler_mips.cc
@@ -337,6 +337,14 @@
       Format(instr, "movz 'rd, 'rs, 'rt");
       break;
     }
+    case MTHI: {
+      Format(instr, "mthi 'rs");
+      break;
+    }
+    case MTLO: {
+      Format(instr, "mtlo 'rs");
+      break;
+    }
     case MULT: {
       Format(instr, "mult 'rs, 'rt");
       break;
@@ -430,6 +438,14 @@
 void MIPSDecoder::DecodeSpecial2(Instr* instr) {
   ASSERT(instr->OpcodeField() == SPECIAL2);
   switch (instr->FunctionField()) {
+    case MADD: {
+      Format(instr, "madd 'rs, 'rt");
+      break;
+    }
+    case MADDU: {
+      Format(instr, "maddu 'rs, 'rt");
+      break;
+    }
     case CLO: {
       Format(instr, "clo 'rd, 'rs");
       break;
diff --git a/runtime/vm/flow_graph.cc b/runtime/vm/flow_graph.cc
index d78ff5b..96ef188 100644
--- a/runtime/vm/flow_graph.cc
+++ b/runtime/vm/flow_graph.cc
@@ -27,7 +27,7 @@
   : parent_(),
     current_ssa_temp_index_(0),
     max_block_id_(max_block_id),
-    parsed_function_(builder.parsed_function()),
+    parsed_function_(*builder.parsed_function()),
     num_copied_params_(builder.num_copied_params()),
     num_non_copied_params_(builder.num_non_copied_params()),
     num_stack_locals_(builder.num_stack_locals()),
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index 42cd547..ed90651 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -41,17 +41,17 @@
 }
 
 
-FlowGraphBuilder::FlowGraphBuilder(const ParsedFunction& parsed_function,
+FlowGraphBuilder::FlowGraphBuilder(ParsedFunction* parsed_function,
                                    const Array& ic_data_array,
                                    InlineExitCollector* exit_collector)
   : parsed_function_(parsed_function),
     ic_data_array_(ic_data_array),
-    num_copied_params_(parsed_function.num_copied_params()),
+    num_copied_params_(parsed_function->num_copied_params()),
     // All parameters are copied if any parameter is.
     num_non_copied_params_((num_copied_params_ == 0)
-        ? parsed_function.function().num_fixed_parameters()
+        ? parsed_function->function().num_fixed_parameters()
         : 0),
-    num_stack_locals_(parsed_function.num_stack_locals()),
+    num_stack_locals_(parsed_function->num_stack_locals()),
     exit_collector_(exit_collector),
     last_used_block_id_(0),  // 0 is used for the graph entry.
     context_level_(0),
@@ -522,13 +522,13 @@
 
 
 Definition* EffectGraphVisitor::BuildStoreExprTemp(Value* value) {
-  return BuildStoreTemp(*owner()->parsed_function().expression_temp_var(),
+  return BuildStoreTemp(*owner()->parsed_function()->expression_temp_var(),
                         value);
 }
 
 
 Definition* EffectGraphVisitor::BuildLoadExprTemp() {
-  return BuildLoadLocal(*owner()->parsed_function().expression_temp_var());
+  return BuildLoadLocal(*owner()->parsed_function()->expression_temp_var());
 }
 
 
@@ -769,7 +769,7 @@
 
 
 void EffectGraphVisitor::InlineBailout(const char* reason) {
-  owner()->parsed_function().function().set_is_inlinable(false);
+  owner()->parsed_function()->function().set_is_inlinable(false);
   if (owner()->IsInlining()) owner()->Bailout(reason);
 }
 
@@ -791,7 +791,7 @@
 
   Value* return_value = for_value.value();
   if (FLAG_enable_type_checks) {
-    const Function& function = owner()->parsed_function().function();
+    const Function& function = owner()->parsed_function()->function();
     const bool is_implicit_dynamic_getter =
         (!function.is_static() &&
         ((function.kind() == RawFunction::kImplicitGetter) ||
@@ -804,7 +804,7 @@
     if (!is_implicit_dynamic_getter && !function.IsConstructor()) {
       const AbstractType& dst_type =
           AbstractType::ZoneHandle(
-              owner()->parsed_function().function().result_type());
+              owner()->parsed_function()->function().result_type());
       return_value = BuildAssignableValue(node->value()->token_pos(),
                                           return_value,
                                           dst_type,
@@ -814,9 +814,9 @@
 
   intptr_t current_context_level = owner()->context_level();
   ASSERT(current_context_level >= 0);
-  if (owner()->parsed_function().saved_entry_context_var() != NULL) {
+  if (owner()->parsed_function()->saved_entry_context_var() != NULL) {
     // CTX on entry was saved, but not linked as context parent.
-    BuildLoadContext(*owner()->parsed_function().saved_entry_context_var());
+    BuildLoadContext(*owner()->parsed_function()->saved_entry_context_var());
   } else {
     while (current_context_level-- > 0) {
       UnchainContext();
@@ -886,7 +886,7 @@
 
   const bool eliminated = value->Type()->IsAssignableTo(dst_type);
   if (FLAG_trace_type_check_elimination) {
-    FlowGraphPrinter::PrintTypeCheck(owner()->parsed_function(),
+    FlowGraphPrinter::PrintTypeCheck(*owner()->parsed_function(),
                                      token_pos,
                                      value,
                                      dst_type,
@@ -1034,7 +1034,7 @@
     PushArgumentInstr** push_instantiator_result,
     PushArgumentInstr** push_instantiator_type_arguments_result) {
   const Class& instantiator_class = Class::Handle(
-      owner()->parsed_function().function().Owner());
+      owner()->parsed_function()->function().Owner());
   // Since called only when type tested against is not instantiated.
   ASSERT(instantiator_class.NumTypeParameters() > 0);
   Value* instantiator_type_arguments = NULL;
@@ -1064,7 +1064,7 @@
   Value* instantiator = NULL;
   Value* instantiator_type_arguments = NULL;
   const Class& instantiator_class = Class::Handle(
-      owner()->parsed_function().function().Owner());
+      owner()->parsed_function()->function().Owner());
   // Since called only when type tested against is not instantiated.
   ASSERT(instantiator_class.NumTypeParameters() > 0);
   instantiator = BuildInstantiator();
@@ -1838,33 +1838,28 @@
 }
 
 
-class TempLocalScope : public ValueObject {
- public:
-  TempLocalScope(EffectGraphVisitor* visitor, Value* value)
-      : visitor_(visitor) {
-    ASSERT(value->definition()->temp_index() == visitor->temp_index() - 1);
-    intptr_t index = visitor->GetCurrentTempLocalIndex();
-    char name[64];
-    OS::SNPrint(name, 64, ":tmp_local%"Pd, index);
-    var_ = new LocalVariable(0, String::ZoneHandle(Symbols::New(name)),
-                             Type::ZoneHandle(Type::DynamicType()));
-    var_->set_index(index);
-    visitor->Do(new PushTempInstr(value));
-    visitor->AllocateTempIndex();
-  }
+LocalVariable* EffectGraphVisitor::EnterTempLocalScope(Value* value) {
+  Do(new PushTempInstr(value));
+  AllocateTempIndex();
 
-  LocalVariable* var() const { return var_; }
+  ASSERT(value->definition()->temp_index() == temp_index() - 1);
+  intptr_t index = GetCurrentTempLocalIndex();
+  char name[64];
+  OS::SNPrint(name, 64, ":tmp_local%"Pd, index);
+  LocalVariable*  var =
+      new LocalVariable(0, String::ZoneHandle(Symbols::New(name)),
+                        Type::ZoneHandle(Type::DynamicType()));
+  var->set_index(index);
+  return var;
+}
 
-  ~TempLocalScope() {
-    Value* result = visitor_->Bind(new LoadLocalInstr(*var_));
-    visitor_->DeallocateTempIndex(1);
-    visitor_->ReturnDefinition(new DropTempsInstr(1, result));
-  }
 
- private:
-  EffectGraphVisitor* visitor_;
-  LocalVariable* var_;
-};
+Definition* EffectGraphVisitor::ExitTempLocalScope(LocalVariable* var) {
+    Value* tmp = Bind(new LoadLocalInstr(*var));
+    DeallocateTempIndex(1);
+    ASSERT(GetCurrentTempLocalIndex() == var->index());
+    return new DropTempsInstr(1, tmp);
+}
 
 
 void EffectGraphVisitor::BuildLetTempExpressions(LetNode* node) {
@@ -1926,11 +1921,11 @@
                                                   element_type);
   Value* array_val = Bind(create);
 
-  { TempLocalScope tmp(this, array_val);
+  { LocalVariable* tmp_var = EnterTempLocalScope(array_val);
     const intptr_t class_id = create->Type()->ToCid();
     const intptr_t deopt_id = Isolate::kNoDeoptId;
     for (int i = 0; i < node->length(); ++i) {
-      Value* array = Bind(new LoadLocalInstr(*tmp.var()));
+      Value* array = Bind(new LoadLocalInstr(*tmp_var));
       Value* index = Bind(new ConstantInstr(Smi::ZoneHandle(Smi::New(i))));
       ValueGraphVisitor for_value(owner(), temp_index());
       node->ElementAt(i)->Visit(&for_value);
@@ -1946,6 +1941,7 @@
           emit_store_barrier, index_scale, class_id, deopt_id);
       Do(store);
     }
+    ReturnDefinition(ExitTempLocalScope(tmp_var));
   }
 }
 
@@ -2000,7 +1996,7 @@
   if (requires_type_arguments) {
     ASSERT(!function.IsImplicitStaticClosureFunction());
     const Class& instantiator_class = Class::Handle(
-        owner()->parsed_function().function().Owner());
+        owner()->parsed_function()->function().Owner());
     type_arguments = BuildInstantiatorTypeArguments(node->token_pos(),
                                                     instantiator_class,
                                                     NULL);
@@ -2121,8 +2117,8 @@
   BuildPushArguments(*node->arguments(), arguments);
 
   // Save context around the call.
-  ASSERT(owner()->parsed_function().saved_current_context_var() != NULL);
-  BuildStoreContext(*owner()->parsed_function().saved_current_context_var());
+  ASSERT(owner()->parsed_function()->saved_current_context_var() != NULL);
+  BuildStoreContext(*owner()->parsed_function()->saved_current_context_var());
   return new ClosureCallInstr(node, arguments);
 }
 
@@ -2130,16 +2126,16 @@
 void EffectGraphVisitor::VisitClosureCallNode(ClosureCallNode* node) {
   Do(BuildClosureCall(node));
   // Restore context from saved location.
-  ASSERT(owner()->parsed_function().saved_current_context_var() != NULL);
-  BuildLoadContext(*owner()->parsed_function().saved_current_context_var());
+  ASSERT(owner()->parsed_function()->saved_current_context_var() != NULL);
+  BuildLoadContext(*owner()->parsed_function()->saved_current_context_var());
 }
 
 
 void ValueGraphVisitor::VisitClosureCallNode(ClosureCallNode* node) {
   Value* result = Bind(BuildClosureCall(node));
   // Restore context from temp.
-  ASSERT(owner()->parsed_function().saved_current_context_var() != NULL);
-  BuildLoadContext(*owner()->parsed_function().saved_current_context_var());
+  ASSERT(owner()->parsed_function()->saved_current_context_var() != NULL);
+  BuildLoadContext(*owner()->parsed_function()->saved_current_context_var());
   ReturnValue(result);
 }
 
@@ -2304,12 +2300,12 @@
 
 Value* EffectGraphVisitor::BuildInstantiator() {
   const Class& instantiator_class = Class::Handle(
-      owner()->parsed_function().function().Owner());
+      owner()->parsed_function()->function().Owner());
   if (instantiator_class.NumTypeParameters() == 0) {
     return NULL;
   }
   Function& outer_function =
-      Function::Handle(owner()->parsed_function().function().raw());
+      Function::Handle(owner()->parsed_function()->function().raw());
   while (outer_function.IsLocalFunction()) {
     outer_function = outer_function.parent_function();
   }
@@ -2317,9 +2313,9 @@
     return NULL;
   }
 
-  ASSERT(owner()->parsed_function().instantiator() != NULL);
+  ASSERT(owner()->parsed_function()->instantiator() != NULL);
   ValueGraphVisitor for_instantiator(owner(), temp_index());
-  owner()->parsed_function().instantiator()->Visit(&for_instantiator);
+  owner()->parsed_function()->instantiator()->Visit(&for_instantiator);
   Append(for_instantiator);
   return for_instantiator.value();
 }
@@ -2345,16 +2341,16 @@
     return Bind(new ConstantInstr(type_arguments));
   }
   Function& outer_function =
-      Function::Handle(owner()->parsed_function().function().raw());
+      Function::Handle(owner()->parsed_function()->function().raw());
   while (outer_function.IsLocalFunction()) {
     outer_function = outer_function.parent_function();
   }
   if (outer_function.IsFactory()) {
     // No instantiator for factories.
     ASSERT(instantiator == NULL);
-    ASSERT(owner()->parsed_function().instantiator() != NULL);
+    ASSERT(owner()->parsed_function()->instantiator() != NULL);
     ValueGraphVisitor for_instantiator(owner(), temp_index());
-    owner()->parsed_function().instantiator()->Visit(&for_instantiator);
+    owner()->parsed_function()->instantiator()->Visit(&for_instantiator);
     Append(for_instantiator);
     return for_instantiator.value();
   }
@@ -2384,7 +2380,7 @@
   }
   // The type arguments are uninstantiated.
   const Class& instantiator_class = Class::ZoneHandle(
-      owner()->parsed_function().function().Owner());
+      owner()->parsed_function()->function().Owner());
   Value* instantiator_value =
       BuildInstantiatorTypeArguments(token_pos, instantiator_class, NULL);
   const bool use_instantiator_type_args =
@@ -2419,9 +2415,9 @@
 
   // The type arguments are uninstantiated. We use expression_temp_var to save
   // the instantiator type arguments because they have two uses.
-  ASSERT(owner()->parsed_function().expression_temp_var() != NULL);
+  ASSERT(owner()->parsed_function()->expression_temp_var() != NULL);
   const Class& instantiator_class = Class::Handle(
-      owner()->parsed_function().function().Owner());
+      owner()->parsed_function()->function().Owner());
   Value* type_arguments_val = BuildInstantiatorTypeArguments(
       node->token_pos(), instantiator_class, NULL);
 
@@ -2482,10 +2478,11 @@
   //   tn       <- LoadLocal(temp)
 
   Value* allocate = BuildObjectAllocation(node);
-  { TempLocalScope tmp(this, allocate);
-    Value* allocated_tmp = Bind(new LoadLocalInstr(*tmp.var()));
+  { LocalVariable* tmp_var = EnterTempLocalScope(allocate);
+    Value* allocated_tmp = Bind(new LoadLocalInstr(*tmp_var));
     PushArgumentInstr* push_allocated_value = PushArgument(allocated_tmp);
     BuildConstructorCall(node, push_allocated_value);
+    ReturnDefinition(ExitTempLocalScope(tmp_var));
   }
 }
 
@@ -2582,10 +2579,12 @@
       // Resolve and call noSuchMethod.
       ArgumentListNode* arguments = new ArgumentListNode(node->token_pos());
       arguments->Add(node->receiver());
-      StaticCallInstr* call = BuildStaticNoSuchMethodCall(node->cls(),
-                                                          node->receiver(),
-                                                          getter_name,
-                                                          arguments);
+      StaticCallInstr* call =
+          BuildStaticNoSuchMethodCall(node->cls(),
+                                      node->receiver(),
+                                      getter_name,
+                                      arguments,
+                                      false);  // Don't save last argument.
       ReturnDefinition(call);
       return;
     } else {
@@ -2656,10 +2655,12 @@
       ArgumentListNode* arguments = new ArgumentListNode(node->token_pos());
       arguments->Add(node->receiver());
       arguments->Add(node->value());
-      call = BuildStaticNoSuchMethodCall(node->cls(),
-                                         node->receiver(),
-                                         setter_name,
-                                         arguments);
+      call = BuildStaticNoSuchMethodCall(
+          node->cls(),
+          node->receiver(),
+          setter_name,
+          arguments,
+          result_is_needed);  // Save last arg if result is needed.
     } else {
       // Throw a NoSuchMethodError.
       call = BuildThrowNoSuchMethodError(
@@ -2891,7 +2892,8 @@
           BuildStaticNoSuchMethodCall(node->super_class(),
                                       node->array(),
                                       Symbols::IndexToken(),
-                                      arguments);
+                                      arguments,
+                                      false);  // Don't save last arg.
       ReturnDefinition(call);
       return;
     }
@@ -2945,29 +2947,16 @@
       ArgumentListNode* arguments = new ArgumentListNode(node->token_pos());
       arguments->Add(node->array());
       arguments->Add(node->index_expr());
-
-      // Even though noSuchMethod most likely does not return,
-      // we save the stored value if the result is needed.
-      if (result_is_needed) {
-        ValueGraphVisitor for_value(owner(), temp_index());
-        node->value()->Visit(&for_value);
-        Append(for_value);
-        Do(BuildStoreExprTemp(for_value.value()));
-
-        const LocalVariable* temp =
-            owner()->parsed_function().expression_temp_var();
-        AstNode* value = new LoadLocalNode(node->token_pos(), temp);
-        arguments->Add(value);
-      } else {
-        arguments->Add(node->value());
-      }
-      StaticCallInstr* call =
-          BuildStaticNoSuchMethodCall(node->super_class(),
-                                      node->array(),
-                                      Symbols::AssignIndexToken(),
-                                      arguments);
+      arguments->Add(node->value());
+      StaticCallInstr* call = BuildStaticNoSuchMethodCall(
+          node->super_class(),
+          node->array(),
+          Symbols::AssignIndexToken(),
+          arguments,
+          result_is_needed);  // Save last arg if result is needed.
       if (result_is_needed) {
         Do(call);
+        // BuildStaticNoSuchMethodCall stores the value in expression_temp.
         return BuildLoadExprTemp();
       } else {
         return call;
@@ -3046,8 +3035,8 @@
 
 
 bool EffectGraphVisitor::MustSaveRestoreContext(SequenceNode* node) const {
-  return (node == owner()->parsed_function().node_sequence()) &&
-         (owner()->parsed_function().saved_entry_context_var() != NULL);
+  return (node == owner()->parsed_function()->node_sequence()) &&
+         (owner()->parsed_function()->saved_entry_context_var() != NULL);
 }
 
 
@@ -3087,7 +3076,7 @@
     // In this case, the parser pre-allocates a variable to save the context.
     if (MustSaveRestoreContext(node)) {
       Value* current_context = Bind(new CurrentContextInstr());
-      Do(BuildStoreTemp(*owner()->parsed_function().saved_entry_context_var(),
+      Do(BuildStoreTemp(*owner()->parsed_function()->saved_entry_context_var(),
                         current_context));
       Value* null_context = Bind(new ConstantInstr(Object::ZoneHandle()));
       AddInstruction(new StoreContextInstr(null_context));
@@ -3098,14 +3087,15 @@
 
     // If this node_sequence is the body of the function being compiled, copy
     // the captured parameters from the frame into the context.
-    if (node == owner()->parsed_function().node_sequence()) {
+    if (node == owner()->parsed_function()->node_sequence()) {
       ASSERT(scope->context_level() == 1);
-      const Function& function = owner()->parsed_function().function();
+      const Function& function = owner()->parsed_function()->function();
       int num_params = function.NumParameters();
       int param_frame_index = (num_params == function.num_fixed_parameters()) ?
           (kParamEndSlotFromFp + num_params) : kFirstLocalSlotFromFp;
       // Handle the saved arguments descriptor as an additional parameter.
-      if (owner()->parsed_function().GetSavedArgumentsDescriptorVar() != NULL) {
+      if (owner()->parsed_function()->GetSavedArgumentsDescriptorVar() !=
+          NULL) {
         ASSERT(param_frame_index == kFirstLocalSlotFromFp);
         num_params++;
       }
@@ -3137,8 +3127,8 @@
   }
 
   if (FLAG_enable_type_checks &&
-      (node == owner()->parsed_function().node_sequence())) {
-    const Function& function = owner()->parsed_function().function();
+      (node == owner()->parsed_function()->node_sequence())) {
+    const Function& function = owner()->parsed_function()->function();
     const int num_params = function.NumParameters();
     int pos = 0;
     if (function.IsConstructor()) {
@@ -3186,7 +3176,7 @@
   if (is_open()) {
     if (MustSaveRestoreContext(node)) {
       ASSERT(num_context_variables > 0);
-      BuildLoadContext(*owner()->parsed_function().saved_entry_context_var());
+      BuildLoadContext(*owner()->parsed_function()->saved_entry_context_var());
     } else if (num_context_variables > 0) {
       UnchainContext();
     }
@@ -3205,7 +3195,7 @@
 
   // The outermost function sequence cannot contain a label.
   ASSERT((node->label() == NULL) ||
-         (node != owner()->parsed_function().node_sequence()));
+         (node != owner()->parsed_function()->node_sequence()));
   owner()->set_context_level(previous_context_level);
 }
 
@@ -3317,72 +3307,30 @@
     const Class& target_class,
     AstNode* receiver,
     const String& method_name,
-    ArgumentListNode* method_arguments) {
-  // Build the graph to allocate an InvocationMirror object by calling
-  // the static allocation method.
-  const Library& corelib = Library::Handle(Library::CoreLibrary());
-  const Class& mirror_class = Class::Handle(
-      corelib.LookupClassAllowPrivate(Symbols::InvocationMirror()));
-  ASSERT(!mirror_class.IsNull());
-  const Function& allocation_function = Function::ZoneHandle(
-      Resolver::ResolveStaticByName(
-          mirror_class,
-          PrivateCoreLibName(Symbols::AllocateInvocationMirror()),
-          Resolver::kIsQualified));
-  ASSERT(!allocation_function.IsNull());
-
-  // Evaluate the receiver before the arguments. This will be used
-  // as an argument to the noSuchMethod call.
-  ValueGraphVisitor for_receiver(owner(), temp_index());
-  receiver->Visit(&for_receiver);
-  Append(for_receiver);
-  PushArgumentInstr* push_receiver = PushArgument(for_receiver.value());
-
-  // Allocate the arguments and pass them into the construction
-  // of the InvocationMirror.
-  const intptr_t args_pos = method_arguments->token_pos();
-  ArgumentListNode* arguments = new ArgumentListNode(args_pos);
-  // The first argument is the original method name.
-  arguments->Add(new LiteralNode(args_pos, method_name));
-  // The second argument is the arguments descriptor of the original method.
-  const Array& args_descriptor =
-      Array::ZoneHandle(ArgumentsDescriptor::New(method_arguments->length(),
-                                                 method_arguments->names()));
-  arguments->Add(new LiteralNode(args_pos, args_descriptor));
-  // The third argument is an array containing the original method arguments,
-  // including the receiver.
-  ArrayNode* args_array = new ArrayNode(
-      args_pos,
-      Type::ZoneHandle(Type::ArrayType()));
-  for (intptr_t i = 0; i < method_arguments->length(); i++) {
-    args_array->AddElement(method_arguments->NodeAt(i));
+    ArgumentListNode* method_arguments,
+    bool save_last_arg) {
+  intptr_t args_pos = method_arguments->token_pos();
+  LocalVariable* temp = NULL;
+  if (save_last_arg) {
+    temp = owner()->parsed_function()->EnsureExpressionTemp();
   }
-  arguments->Add(args_array);
-  ZoneGrowableArray<PushArgumentInstr*>* allocation_args =
-      new ZoneGrowableArray<PushArgumentInstr*>(arguments->length());
-  BuildPushArguments(*arguments, allocation_args);
-  StaticCallInstr* allocation = new StaticCallInstr(args_pos,
-                                                    allocation_function,
-                                                    Array::ZoneHandle(),
-                                                    allocation_args);
-  Value* invocation_mirror = Bind(allocation);
-  PushArgumentInstr* push_invocation_mirror = PushArgument(invocation_mirror);
-  // Lookup noSuchMethod and call it with the receiver and the InvocationMirror.
+  ArgumentListNode* args =
+      Parser::BuildNoSuchMethodArguments(args_pos,
+                                         method_name,
+                                         *method_arguments,
+                                         temp);
   const Function& no_such_method_func = Function::ZoneHandle(
       Resolver::ResolveDynamicAnyArgs(target_class, Symbols::NoSuchMethod()));
   // We are guaranteed to find noSuchMethod of class Object.
   ASSERT(!no_such_method_func.IsNull());
-  ZoneGrowableArray<PushArgumentInstr*>* args =
+  ZoneGrowableArray<PushArgumentInstr*>* push_arguments =
       new ZoneGrowableArray<PushArgumentInstr*>(2);
-  args->Add(push_receiver);
-  args->Add(push_invocation_mirror);
+  BuildPushArguments(*args, push_arguments);
   return new StaticCallInstr(args_pos,
                              no_such_method_func,
                              Array::ZoneHandle(),
-                             args);
+                             push_arguments);
 }
-
-
 StaticCallInstr* EffectGraphVisitor::BuildThrowNoSuchMethodError(
     intptr_t token_pos,
     const Class& function_class,
@@ -3511,14 +3459,14 @@
 FlowGraph* FlowGraphBuilder::BuildGraph() {
   if (FLAG_print_ast) {
     // Print the function ast before IL generation.
-    AstPrinter::PrintFunctionNodes(parsed_function());
+    AstPrinter::PrintFunctionNodes(*parsed_function());
   }
   // Compilation can be nested, preserve the computation-id.
-  const Function& function = parsed_function().function();
+  const Function& function = parsed_function()->function();
   TargetEntryInstr* normal_entry =
       new TargetEntryInstr(AllocateBlockId(),
                            CatchClauseNode::kInvalidTryIndex);
-  graph_entry_ = new GraphEntryInstr(parsed_function(), normal_entry);
+  graph_entry_ = new GraphEntryInstr(*parsed_function(), normal_entry);
   EffectGraphVisitor for_effect(this, 0);
   // This check may be deleted if the generated code is leaf.
   CheckStackOverflowInstr* check =
@@ -3526,7 +3474,7 @@
   // If we are inlining don't actually attach the stack check. We must still
   // create the stack check in order to allocate a deopt id.
   if (!IsInlining()) for_effect.AddInstruction(check);
-  parsed_function().node_sequence()->Visit(&for_effect);
+  parsed_function()->node_sequence()->Visit(&for_effect);
   AppendFragment(normal_entry, for_effect);
   // Check that the graph is properly terminated.
   ASSERT(!for_effect.is_open());
@@ -3537,7 +3485,7 @@
 
 void FlowGraphBuilder::Bailout(const char* reason) {
   const char* kFormat = "FlowGraphBuilder Bailout: %s %s";
-  const char* function_name = parsed_function_.function().ToCString();
+  const char* function_name = parsed_function_->function().ToCString();
   intptr_t len = OS::SNPrint(NULL, 0, kFormat, function_name, reason) + 1;
   char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
   OS::SNPrint(chars, len, kFormat, function_name, reason);
diff --git a/runtime/vm/flow_graph_builder.h b/runtime/vm/flow_graph_builder.h
index a24a3d2..e087659 100644
--- a/runtime/vm/flow_graph_builder.h
+++ b/runtime/vm/flow_graph_builder.h
@@ -101,13 +101,13 @@
 class FlowGraphBuilder: public ValueObject {
  public:
   // The inlining context is NULL if not inlining.
-  FlowGraphBuilder(const ParsedFunction& parsed_function,
+  FlowGraphBuilder(ParsedFunction* parsed_function,
                    const Array& ic_data_array,
                    InlineExitCollector* exit_collector);
 
   FlowGraph* BuildGraph();
 
-  const ParsedFunction& parsed_function() const { return parsed_function_; }
+  ParsedFunction* parsed_function() const { return parsed_function_; }
   const Array& ic_data_array() const { return ic_data_array_; }
 
   void Bailout(const char* reason);
@@ -151,7 +151,7 @@
     return parameter_count() + num_stack_locals_;
   }
 
-  const ParsedFunction& parsed_function_;
+  ParsedFunction* parsed_function_;
   const Array& ic_data_array_;
 
   const intptr_t num_copied_params_;
@@ -341,7 +341,8 @@
       const Class& target_class,
       AstNode* receiver,
       const String& method_name,
-      ArgumentListNode* method_arguments);
+      ArgumentListNode* method_arguments,
+      bool save_last_arg);
 
   StaticCallInstr* BuildThrowNoSuchMethodError(intptr_t token_pos,
                                                const Class& function_class,
@@ -362,6 +363,11 @@
                         const AbstractType& dst_type,
                         const String& dst_name);
 
+  // Helpers for allocating and deallocating temporary locals on top of the
+  // expression stack.
+  LocalVariable* EnterTempLocalScope(Value* value);
+  Definition* ExitTempLocalScope(LocalVariable* var);
+
   void BuildLetTempExpressions(LetNode* node);
 
  private:
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index 07981a1..eab7bc6 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -1640,8 +1640,8 @@
       __ vldrd(destination.fpu_reg(), source.ToStackSlotAddress());
     } else {
       ASSERT(destination.IsDoubleStackSlot());
-      __ vldrd(FpuTMP, source.ToStackSlotAddress());
-      __ vstrd(FpuTMP, destination.ToStackSlotAddress());
+      __ vldrd(DTMP, source.ToStackSlotAddress());
+      __ vstrd(DTMP, destination.ToStackSlotAddress());
     }
   } else if (source.IsQuadStackSlot()) {
     UNIMPLEMENTED();
@@ -1678,9 +1678,9 @@
   } else if (source.IsStackSlot() && destination.IsStackSlot()) {
     Exchange(destination.ToStackSlotAddress(), source.ToStackSlotAddress());
   } else if (source.IsFpuRegister() && destination.IsFpuRegister()) {
-    __ vmovd(FpuTMP, source.fpu_reg());
+    __ vmovd(DTMP, source.fpu_reg());
     __ vmovd(source.fpu_reg(), destination.fpu_reg());
-    __ vmovd(destination.fpu_reg(), FpuTMP);
+    __ vmovd(destination.fpu_reg(), DTMP);
   } else if (source.IsFpuRegister() || destination.IsFpuRegister()) {
     ASSERT(destination.IsDoubleStackSlot() ||
            destination.IsQuadStackSlot() ||
@@ -1695,9 +1695,9 @@
         : source.ToStackSlotAddress();
 
     if (double_width) {
-      __ vldrd(FpuTMP, slot_address);
+      __ vldrd(DTMP, slot_address);
       __ vstrd(reg, slot_address);
-      __ vmovd(reg, FpuTMP);
+      __ vmovd(reg, DTMP);
     } else {
       UNIMPLEMENTED();
     }
@@ -1705,10 +1705,10 @@
     const Address& source_slot_address = source.ToStackSlotAddress();
     const Address& destination_slot_address = destination.ToStackSlotAddress();
 
-    ScratchFpuRegisterScope ensure_scratch(this, FpuTMP);
-    __ vldrd(FpuTMP, source_slot_address);
+    ScratchFpuRegisterScope ensure_scratch(this, DTMP);
+    __ vldrd(DTMP, source_slot_address);
     __ vldrd(ensure_scratch.reg(), destination_slot_address);
-    __ vstrd(FpuTMP, destination_slot_address);
+    __ vstrd(DTMP, destination_slot_address);
     __ vstrd(ensure_scratch.reg(), source_slot_address);
   } else if (source.IsQuadStackSlot() && destination.IsQuadStackSlot()) {
     UNIMPLEMENTED();
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
index 42d34aa..449370f 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -1414,7 +1414,7 @@
                                                           intptr_t index_scale,
                                                           Register array,
                                                           intptr_t index) {
-  UNIMPLEMENTED();
+  UNREACHABLE();
   return FieldAddress(array, index);
 }
 
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index 80a93ee..8eb247b 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -25,7 +25,7 @@
 // Flags for inlining heuristics.
 DEFINE_FLAG(int, inlining_depth_threshold, 3,
     "Inline function calls up to threshold nesting depth");
-DEFINE_FLAG(int, inlining_size_threshold, 22,
+DEFINE_FLAG(int, inlining_size_threshold, 20,
     "Always inline functions that have threshold or fewer instructions");
 DEFINE_FLAG(int, inlining_callee_call_sites_threshold, 1,
     "Always inline functions containing threshold or fewer calls.");
@@ -494,7 +494,7 @@
       // Build the callee graph.
       InlineExitCollector* exit_collector =
           new InlineExitCollector(caller_graph_, call);
-      FlowGraphBuilder builder(*parsed_function, ic_data_array, exit_collector);
+      FlowGraphBuilder builder(parsed_function, ic_data_array, exit_collector);
       builder.SetInitialBlockId(caller_graph_->max_block_id());
       FlowGraph* callee_graph;
       {
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index d998fec..99fc0d3 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -1052,9 +1052,6 @@
 
   MoveOperands* MoveOperandsAt(intptr_t index) const { return moves_[index]; }
 
-  void SetSrcSlotAt(intptr_t index, const Location& loc);
-  void SetDestSlotAt(intptr_t index, const Location& loc);
-
   intptr_t NumMoves() const { return moves_.length(); }
 
   virtual void PrintTo(BufferFormatter* f) const;
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index 0f9444a..e3971af 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -491,7 +491,7 @@
     case HI: return LS;
     case CS: return CC;
     default:
-      UNIMPLEMENTED();
+      UNREACHABLE();
       return EQ;
   }
 }
@@ -579,7 +579,7 @@
 
 // Emit code when ICData's targets are all Object == (which is ===).
 static void EmitCheckedStrictEqual(FlowGraphCompiler* compiler,
-                                   const ICData& ic_data,
+                                   const ICData& orig_ic_data,
                                    const LocationSummary& locs,
                                    Token::Kind kind,
                                    BranchInstr* branch,
@@ -600,6 +600,7 @@
   __ b(&identity_compare, EQ);
 
   __ LoadClassId(temp, left);
+  const ICData& ic_data = ICData::Handle(orig_ic_data.AsUnaryClassChecks());
   const intptr_t len = ic_data.NumberOfChecks();
   for (intptr_t i = 0; i < len; i++) {
     __ CompareImmediate(temp, ic_data.GetReceiverClassIdAt(i));
@@ -683,7 +684,7 @@
     case HI: return CC;
     case CS: return LS;
     default:
-      UNIMPLEMENTED();
+      UNREACHABLE();
       return EQ;
   }
 }
@@ -1122,7 +1123,7 @@
                              : CompileType::Int();
 
     default:
-      UNIMPLEMENTED();
+      UNREACHABLE();
       return CompileType::Dynamic();
   }
 }
@@ -1153,7 +1154,7 @@
     case kTypedDataFloat32x4ArrayCid:
       return kUnboxedFloat32x4;
     default:
-      UNIMPLEMENTED();
+      UNREACHABLE();
       return kTagged;
   }
 }
@@ -1236,8 +1237,8 @@
         // vldrs does not support indexed addressing.
         __ add(index.reg(), index.reg(), ShifterOperand(array));
         element_address = Address(index.reg(), 0);
-        __ vldrs(S0, element_address);
-        __ vcvtds(result, S0);
+        __ vldrs(STMP, element_address);
+        __ vcvtds(result, STMP);
         break;
       case kTypedDataFloat64ArrayCid:
         // vldrd does not support indexed addressing.
@@ -1329,7 +1330,7 @@
     case kTypedDataFloat32x4ArrayCid:
       return kUnboxedFloat32x4;
     default:
-      UNIMPLEMENTED();
+      UNREACHABLE();
       return kTagged;
   }
 }
@@ -2575,8 +2576,8 @@
     __ LoadDFromOffset(result, value, Double::value_offset() - kHeapObjectTag);
   } else if (value_cid == kSmiCid) {
     __ SmiUntag(value);  // Untag input before conversion.
-    __ vmovsr(S0, value);
-    __ vcvtdi(result, S0);
+    __ vmovsr(STMP, value);
+    __ vcvtdi(result, STMP);
   } else {
     Label* deopt = compiler->AddDeoptStub(deopt_id_, kDeoptBinaryDoubleOp);
     Register temp = locs()->temp(0).reg();
@@ -2590,8 +2591,8 @@
     __ Bind(&is_smi);
     // TODO(regis): Why do we preserve value here but not above?
     __ mov(IP, ShifterOperand(value, ASR, 1));  // Copy and untag.
-    __ vmovsr(S0, IP);
-    __ vcvtdi(result, S0);
+    __ vmovsr(STMP, IP);
+    __ vcvtdi(result, STMP);
     __ Bind(&done);
   }
 }
@@ -2941,8 +2942,8 @@
   Register value = locs()->in(0).reg();
   FpuRegister result = locs()->out().fpu_reg();
   __ SmiUntag(value);
-  __ vmovsr(S0, value);
-  __ vcvtdi(result, S0);
+  __ vmovsr(STMP, value);
+  __ vcvtdi(result, STMP);
 }
 
 
@@ -2962,9 +2963,9 @@
   Register value_obj = locs()->in(0).reg();
   ASSERT(result == R0);
   ASSERT(result != value_obj);
-  __ LoadDFromOffset(D0, value_obj, Double::value_offset() - kHeapObjectTag);
-  __ vcvtid(S0, D0);
-  __ vmovrs(result, S0);
+  __ LoadDFromOffset(DTMP, value_obj, Double::value_offset() - kHeapObjectTag);
+  __ vcvtid(STMP, DTMP);
+  __ vmovrs(result, STMP);
   // Overflow is signaled with minint.
   Label do_call, done;
   // Check for overflow and that it fits into Smi.
@@ -3005,8 +3006,8 @@
   Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptDoubleToSmi);
   Register result = locs()->out().reg();
   DRegister value = locs()->in(0).fpu_reg();
-  __ vcvtid(S0, value);
-  __ vmovrs(result, S0);
+  __ vcvtid(STMP, value);
+  __ vmovrs(result, STMP);
   // Check for overflow and that it fits into Smi.
   __ CompareImmediate(result, 0xC0000000);
   __ b(deopt, MI);
@@ -3074,14 +3075,12 @@
     __ b(&skip_call);
   }
   __ Bind(&do_call);
-  // TODO(regis): Using D0 as the reserved scratch value is not a good idea.
-  __ vmovd(D0, locs()->in(0).fpu_reg());
-  if (InputCount() == 2) {
-    __ vmovd(D1, locs()->in(1).fpu_reg());
-  }
-  UNIMPLEMENTED();  // TODO(regis): We need to support double type leaf calls.
+  __ vmovrrd(R0, R1, locs()->in(0).fpu_reg());
+  __ vmovrrd(R2, R3, locs()->in(1).fpu_reg());
+  // TODO(regis): This leaf runtime call is not yet supported by the simulator.
+  // We need a new leaf floating point runtime call kind.
   __ CallRuntime(TargetFunction());
-  __ vmovd(locs()->out().fpu_reg(), D0);
+  __ vmovdrr(locs()->out().fpu_reg(), R0, R1);
   __ Bind(&skip_call);
 }
 
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index 1d1ad45..1124c02 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -533,7 +533,7 @@
 
 // Emit code when ICData's targets are all Object == (which is ===).
 static void EmitCheckedStrictEqual(FlowGraphCompiler* compiler,
-                                   const ICData& ic_data,
+                                   const ICData& orig_ic_data,
                                    const LocationSummary& locs,
                                    Token::Kind kind,
                                    BranchInstr* branch,
@@ -555,6 +555,7 @@
   __ j(EQUAL, &identity_compare);
 
   __ LoadClassId(temp, left);
+  const ICData& ic_data = ICData::Handle(orig_ic_data.AsUnaryClassChecks());
   const intptr_t len = ic_data.NumberOfChecks();
   for (intptr_t i = 0; i < len; i++) {
     __ cmpl(temp, Immediate(ic_data.GetReceiverClassIdAt(i)));
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index 6318124..1ca8f2e 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -689,7 +689,7 @@
 
 // Emit code when ICData's targets are all Object == (which is ===).
 static void EmitCheckedStrictEqual(FlowGraphCompiler* compiler,
-                                   const ICData& ic_data,
+                                   const ICData& orig_ic_data,
                                    const LocationSummary& locs,
                                    Token::Kind kind,
                                    BranchInstr* branch,
@@ -711,6 +711,7 @@
   __ j(EQUAL, &identity_compare);
 
   __ LoadClassId(temp, left);
+  const ICData& ic_data = ICData::Handle(orig_ic_data.AsUnaryClassChecks());
   const intptr_t len = ic_data.NumberOfChecks();
   for (intptr_t i = 0; i < len; i++) {
     __ cmpq(temp, Immediate(ic_data.GetReceiverClassIdAt(i)));
diff --git a/runtime/vm/intrinsifier_arm.cc b/runtime/vm/intrinsifier_arm.cc
index 2e551ab..1d6a9d3 100644
--- a/runtime/vm/intrinsifier_arm.cc
+++ b/runtime/vm/intrinsifier_arm.cc
@@ -1390,13 +1390,13 @@
       FlowGraphCompiler::DataOffsetFor(kTypedDataUint32ArrayCid);
 
   __ LoadImmediate(R0, a_int32_value);
-  __ LoadFromOffset(kLoadWord, R2, R1, disp_0 - 1);
-  __ LoadFromOffset(kLoadWord, R3, R1, disp_1 - 1);
+  __ LoadFromOffset(kLoadWord, R2, R1, disp_0 - kHeapObjectTag);
+  __ LoadFromOffset(kLoadWord, R3, R1, disp_1 - kHeapObjectTag);
   __ mov(R6, ShifterOperand(R3, ASR, 31));  // Sign extend into R6.
   // 64-bit multiply and accumulate into R6:R3.
   __ smlal(R3, R6, R0, R2);  // R6:R3 <- R6:R3 + R0 * R2.
-  __ StoreToOffset(kStoreWord, R3, R1, disp_0 - 1);
-  __ StoreToOffset(kStoreWord, R6, R1, disp_1 - 1);
+  __ StoreToOffset(kStoreWord, R3, R1, disp_0 - kHeapObjectTag);
+  __ StoreToOffset(kStoreWord, R6, R1, disp_1 - kHeapObjectTag);
   __ Ret();
   return true;
 }
diff --git a/runtime/vm/intrinsifier_mips.cc b/runtime/vm/intrinsifier_mips.cc
index d2d00bb..82c06b3 100644
--- a/runtime/vm/intrinsifier_mips.cc
+++ b/runtime/vm/intrinsifier_mips.cc
@@ -6,297 +6,1411 @@
 #if defined(TARGET_ARCH_MIPS)
 
 #include "vm/intrinsifier.h"
+
+#include "vm/assembler.h"
+#include "vm/flow_graph_compiler.h"
 #include "vm/object.h"
+#include "vm/object_store.h"
+#include "vm/symbols.h"
 
 namespace dart {
 
+DECLARE_FLAG(bool, enable_type_checks);
+
+
+#define __ assembler->
+
 bool Intrinsifier::ObjectArray_Allocate(Assembler* assembler) {
+  const intptr_t kTypeArgumentsOffset = 1 * kWordSize;
+  const intptr_t kArrayLengthOffset = 0 * kWordSize;
+  Label fall_through;
+
+  // Compute the size to be allocated, it is based on the array length
+  // and is computed as:
+  // RoundedAllocationSize((array_length * kwordSize) + sizeof(RawArray)).
+  __ lw(T3, Address(SP, kArrayLengthOffset));  // Array length.
+
+  // Check that length is a positive Smi.
+  __ andi(CMPRES, T3, Immediate(kSmiTagMask));
+  __ bne(CMPRES, ZR, &fall_through);
+  __ bltz(T3, &fall_through);
+
+  // Check for maximum allowed length.
+  const intptr_t max_len =
+      reinterpret_cast<int32_t>(Smi::New(Array::kMaxElements));
+  __ BranchUnsignedGreater(T3, max_len, &fall_through);
+
+  const intptr_t fixed_size = sizeof(RawArray) + kObjectAlignment - 1;
+  __ LoadImmediate(T2, fixed_size);
+  __ sll(T3, T3, 1);  // T3 is  a Smi.
+  __ addu(T2, T2, T3);
+  ASSERT(kSmiTagShift == 1);
+  __ LoadImmediate(T3, ~(kObjectAlignment - 1));
+  __ and_(T2, T2, T3);
+
+  // T2: Allocation size.
+
+  Isolate* isolate = Isolate::Current();
+  Heap* heap = isolate->heap();
+
+  __ LoadImmediate(T3, heap->TopAddress());
+  __ lw(T0, Address(T3, 0));  // Potential new object start.
+
+  __ AdduDetectOverflow(T1, T0, T2, CMPRES);  // Potential next object start.
+  __ bltz(CMPRES, &fall_through);  // CMPRES < 0 on overflow.
+
+  // Check if the allocation fits into the remaining space.
+  // T0: potential new object start.
+  // T1: potential next object start.
+  // T2: allocation size.
+  __ LoadImmediate(T4, heap->TopAddress());
+  __ lw(T4, Address(T4, 0));
+  __ BranchUnsignedGreaterEqual(T1, T4, &fall_through);
+
+  // Successfully allocated the object(s), now update top to point to
+  // next object start and initialize the object.
+  __ sw(T1, Address(T3, 0));
+  __ addiu(T0, T0, Immediate(kHeapObjectTag));
+
+  // Initialize the tags.
+  // T0: new object start as a tagged pointer.
+  // T1: new object end address.
+  // T2: allocation size.
+  {
+    Label overflow, done;
+    const intptr_t shift = RawObject::kSizeTagBit - kObjectAlignmentLog2;
+    const Class& cls = Class::Handle(isolate->object_store()->array_class());
+
+    __ BranchUnsignedGreater(T2, RawObject::SizeTag::kMaxSizeTag, &overflow);
+    __ b(&done);
+    __ delay_slot()->sll(T2, T2, shift);
+    __ Bind(&overflow);
+    __ mov(T2, ZR);
+    __ Bind(&done);
+
+    // Get the class index and insert it into the tags.
+    // T2: size and bit tags.
+    __ LoadImmediate(TMP1, RawObject::ClassIdTag::encode(cls.id()));
+    __ or_(T2, T2, TMP1);
+    __ sw(T2, FieldAddress(T0, Array::tags_offset()));  // Store tags.
+  }
+
+  // T0: new object start as a tagged pointer.
+  // T1: new object end address.
+  // Store the type argument field.
+  __ lw(T2, Address(SP, kTypeArgumentsOffset));  // Type argument.
+  __ StoreIntoObjectNoBarrier(T0,
+                              FieldAddress(T0, Array::type_arguments_offset()),
+                              T2);
+
+  // Set the length field.
+  __ lw(T2, Address(SP, kArrayLengthOffset));  // Array Length.
+  __ StoreIntoObjectNoBarrier(T0,
+                              FieldAddress(T0, Array::length_offset()),
+                              T2);
+
+  // Initialize all array elements to raw_null.
+  // T0: new object start as a tagged pointer.
+  // T1: new object end address.
+  // T2: iterator which initially points to the start of the variable
+  // data area to be initialized.
+  // NULLREG: null
+  __ AddImmediate(T2, T0, sizeof(RawArray) - kHeapObjectTag);
+
+  Label done;
+  Label init_loop;
+  __ Bind(&init_loop);
+  __ BranchUnsignedGreaterEqual(T2, T1, &done);
+  __ sw(NULLREG, Address(T2, 0));
+  __ b(&init_loop);
+  __ delay_slot()->addiu(T2, T2, Immediate(kWordSize));
+  __ Bind(&done);
+
+  __ Ret();  // Returns the newly allocated object in V0.
+  __ delay_slot()->mov(V0, T0);
+  __ Bind(&fall_through);
   return false;
 }
 
 
 bool Intrinsifier::Array_getLength(Assembler* assembler) {
-  return false;
+  __ lw(V0, Address(SP, 0 * kWordSize));
+  __ Ret();
+  __ delay_slot()->lw(V0, FieldAddress(V0, Array::length_offset()));
+  return true;
 }
 
 
 bool Intrinsifier::ImmutableArray_getLength(Assembler* assembler) {
-  return false;
+  return Array_getLength(assembler);
 }
 
 
 bool Intrinsifier::Array_getIndexed(Assembler* assembler) {
+  Label fall_through;
+
+  __ lw(T0, Address(SP, + 0 * kWordSize));  // Index
+
+  __ andi(CMPRES, T0, Immediate(kSmiTagMask));
+  __ bne(CMPRES, ZR, &fall_through);  // Index is not an smi, fall through
+  __ delay_slot()->lw(T1, Address(SP, + 1 * kWordSize));  // Array
+
+  // range check
+  __ lw(T2, FieldAddress(T1, Array::length_offset()));
+  __ BranchUnsignedGreaterEqual(T0, T2, &fall_through);
+
+  ASSERT(kSmiTagShift == 1);
+  // array element at T1 + T0*2 + Array::data_offset - 1
+  __ sll(T2, T0, 1);
+  __ addu(T2, T1, T2);
+  __ Ret();
+  __ delay_slot()->lw(V0, FieldAddress(T2, Array::data_offset()));
+  __ Bind(&fall_through);
   return false;
 }
 
 
 bool Intrinsifier::ImmutableArray_getIndexed(Assembler* assembler) {
-  return false;
+  return Array_getIndexed(assembler);
 }
 
 
+static intptr_t ComputeObjectArrayTypeArgumentsOffset() {
+  const Library& core_lib = Library::Handle(Library::CoreLibrary());
+  const Class& cls =
+      Class::Handle(core_lib.LookupClassAllowPrivate(Symbols::ObjectArray()));
+  ASSERT(!cls.IsNull());
+  ASSERT(cls.HasTypeArguments());
+  ASSERT(cls.NumTypeArguments() == 1);
+  const intptr_t field_offset = cls.type_arguments_field_offset();
+  ASSERT(field_offset != Class::kNoTypeArguments);
+  return field_offset;
+}
+
+
+// Intrinsify only for Smi value and index. Non-smi values need a store buffer
+// update. Array length is always a Smi.
 bool Intrinsifier::Array_setIndexed(Assembler* assembler) {
+  Label fall_through;
+
+  if (FLAG_enable_type_checks) {
+    const intptr_t type_args_field_offset =
+        ComputeObjectArrayTypeArgumentsOffset();
+    // Inline simple tests (Smi, null), fallthrough if not positive.
+    Label checked_ok;
+    __ lw(T2, Address(SP, 0 * kWordSize));  // Value.
+
+    // Null value is valid for any type.
+    __ beq(T2, NULLREG, &checked_ok);
+    __ delay_slot()->lw(T1, Address(SP, 2 * kWordSize));  // Array.
+
+    __ lw(T1, FieldAddress(T1, type_args_field_offset));
+
+    // T1: Type arguments of array.
+    __ beq(T1, NULLREG, &checked_ok);
+
+    // Check if it's dynamic.
+    // For now handle only TypeArguments and bail out if InstantiatedTypeArgs.
+    __ LoadClassId(TMP, T1);
+    __ BranchNotEqual(TMP, kTypeArgumentsCid, &fall_through);
+
+    // Get type at index 0.
+    __ lw(T0, FieldAddress(T1, TypeArguments::type_at_offset(0)));
+    __ BranchEqual(T0, Type::ZoneHandle(Type::DynamicType()), &checked_ok);
+
+    // Check for int and num.
+    __ andi(CMPRES, T2, Immediate(kSmiTagMask));
+    __ bne(CMPRES, ZR, &fall_through);  // Non-smi value.
+
+    __ BranchEqual(T0, Type::ZoneHandle(Type::IntType()), &checked_ok);
+    __ BranchNotEqual(T0, Type::ZoneHandle(Type::Number()), &fall_through);
+    __ Bind(&checked_ok);
+  }
+  __ lw(T1, Address(SP, 1 * kWordSize));  // Index.
+  __ andi(CMPRES, T1, Immediate(kSmiTagMask));
+  // Index not Smi.
+  __ bne(CMPRES, ZR, &fall_through);
+  __ delay_slot()->lw(T0, Address(SP, 2 * kWordSize));  // Array.
+
+  // Range check.
+  __ lw(T3, FieldAddress(T0, Array::length_offset()));  // Array length.
+  // Runtime throws exception.
+  __ BranchUnsignedGreaterEqual(T1, T3, &fall_through);
+
+  // Note that T1 is Smi, i.e, times 2.
+  ASSERT(kSmiTagShift == 1);
+  // Destroy T2 as we will not continue in the function.
+  __ lw(T2, Address(SP, 0 * kWordSize));  // Value.
+  __ sll(T1, T1, 1);  // T1 is Smi.
+  __ addu(T1, T0, T1);
+  __ StoreIntoObject(T0,
+                     FieldAddress(T1, Array::data_offset()),
+                     T2);
+  // Caller is responsible of preserving the value if necessary.
+  __ Ret();
+  __ Bind(&fall_through);
   return false;
 }
 
 
+// Allocate a GrowableObjectArray using the backing array specified.
+// On stack: type argument (+1), data (+0).
 bool Intrinsifier::GrowableArray_Allocate(Assembler* assembler) {
+  // The newly allocated object is returned in V0.
+  const intptr_t kTypeArgumentsOffset = 1 * kWordSize;
+  const intptr_t kArrayOffset = 0 * kWordSize;
+  Label fall_through;
+
+  // Compute the size to be allocated, it is based on the array length
+  // and is computed as:
+  // RoundedAllocationSize(sizeof(RawGrowableObjectArray)) +
+  intptr_t fixed_size = GrowableObjectArray::InstanceSize();
+
+  Isolate* isolate = Isolate::Current();
+  Heap* heap = isolate->heap();
+
+  __ LoadImmediate(T2, heap->TopAddress());
+  __ lw(V0, Address(T2, 0));
+  __ AddImmediate(T1, V0, fixed_size);
+
+  // Check if the allocation fits into the remaining space.
+  // V0: potential new backing array object start.
+  // T1: potential next object start.
+  __ LoadImmediate(T3, heap->EndAddress());
+  __ lw(T3, Address(T3, 0));
+  __ BranchUnsignedGreaterEqual(T1, T3, &fall_through);
+
+  // Successfully allocated the object(s), now update top to point to
+  // next object start and initialize the object.
+  __ sw(T1, Address(T2, 0));
+  __ AddImmediate(V0, kHeapObjectTag);
+
+  // Initialize the tags.
+  // V0: new growable array object start as a tagged pointer.
+  const Class& cls = Class::Handle(
+      isolate->object_store()->growable_object_array_class());
+  uword tags = 0;
+  tags = RawObject::SizeTag::update(fixed_size, tags);
+  tags = RawObject::ClassIdTag::update(cls.id(), tags);
+  __ LoadImmediate(T1, tags);
+  __ sw(T1, FieldAddress(V0, GrowableObjectArray::tags_offset()));
+
+  // Store backing array object in growable array object.
+  __ lw(T1, Address(SP, kArrayOffset));  // Data argument.
+  // V0 is new, no barrier needed.
+  __ StoreIntoObjectNoBarrier(
+      V0,
+      FieldAddress(V0, GrowableObjectArray::data_offset()),
+      T1);
+
+  // V0: new growable array object start as a tagged pointer.
+  // Store the type argument field in the growable array object.
+  __ lw(T1, Address(SP, kTypeArgumentsOffset));  // Type argument.
+  __ StoreIntoObjectNoBarrier(
+      V0,
+      FieldAddress(V0, GrowableObjectArray::type_arguments_offset()),
+      T1);
+
+  // Set the length field in the growable array object to 0.
+  __ Ret();  // Returns the newly allocated object in V0.
+  __ delay_slot()->sw(ZR,
+      FieldAddress(V0, GrowableObjectArray::length_offset()));
+
+  __ Bind(&fall_through);
   return false;
 }
 
 
 bool Intrinsifier::GrowableArray_getLength(Assembler* assembler) {
-  return false;
+  __ lw(V0, Address(SP, 0 * kWordSize));
+  __ Ret();
+  __ delay_slot()->lw(V0,
+      FieldAddress(V0, GrowableObjectArray::length_offset()));
+  return true;
 }
 
 
 bool Intrinsifier::GrowableArray_getCapacity(Assembler* assembler) {
-  return false;
+  __ lw(V0, Address(SP, 0 * kWordSize));
+  __ lw(V0, FieldAddress(V0, GrowableObjectArray::data_offset()));
+  __ Ret();
+  __ delay_slot()->lw(V0, FieldAddress(V0, Array::length_offset()));
+  return true;
 }
 
 
 bool Intrinsifier::GrowableArray_getIndexed(Assembler* assembler) {
+  Label fall_through;
+
+  __ lw(T0, Address(SP, 0 * kWordSize));  // Index
+
+  __ andi(CMPRES, T0, Immediate(kSmiTagMask));
+  __ bne(CMPRES, ZR, &fall_through);  // Index is not an smi, fall through
+  __ delay_slot()->lw(T1, Address(SP, 1 * kWordSize));  // Array
+
+  // range check
+  __ lw(T2, FieldAddress(T1, GrowableObjectArray::length_offset()));
+  __ BranchUnsignedGreaterEqual(T0, T2, &fall_through);
+
+  __ lw(T2, FieldAddress(T1, GrowableObjectArray::data_offset()));  // data
+
+  ASSERT(kSmiTagShift == 1);
+  // array element at T2 + T0 * 2 + Array::data_offset - 1
+  __ sll(T3, T0, 1);
+  __ addu(T2, T2, T3);
+  __ Ret();
+  __ delay_slot()->lw(V0, FieldAddress(T2, Array::data_offset()));
+  __ Bind(&fall_through);
   return false;
 }
 
 
+// Set value into growable object array at specified index.
+// On stack: growable array (+2), index (+1), value (+0).
 bool Intrinsifier::GrowableArray_setIndexed(Assembler* assembler) {
+  if (FLAG_enable_type_checks) {
+    return false;
+  }
+  Label fall_through;
+  __ lw(T1, Address(SP, 1 * kWordSize));  // Index.
+  __ andi(CMPRES, T1, Immediate(kSmiTagMask));
+  __ bne(CMPRES, ZR, &fall_through);  // Non-smi index.
+  __ delay_slot()->lw(T0, Address(SP, 2 * kWordSize));  // GrowableArray.
+  // Range check using _length field.
+  __ lw(T2, FieldAddress(T0, GrowableObjectArray::length_offset()));
+  // Runtime throws exception.
+  __ BranchUnsignedGreaterEqual(T1, T2, &fall_through);
+  __ lw(T0, FieldAddress(T0, GrowableObjectArray::data_offset()));  // data.
+  __ lw(T2, Address(SP, 0 * kWordSize));  // Value.
+  // Note that T1 is Smi, i.e, times 2.
+  ASSERT(kSmiTagShift == 1);
+  __ sll(T1, T1, 1);
+  __ addu(T1, T0, T1);
+  __ StoreIntoObject(T0,
+                     FieldAddress(T1, Array::data_offset()),
+                     T2);
+  __ Ret();
+  __ Bind(&fall_through);
   return false;
 }
 
 
+// Set length of growable object array. The length cannot
+// be greater than the length of the data container.
+// On stack: growable array (+1), length (+0).
 bool Intrinsifier::GrowableArray_setLength(Assembler* assembler) {
+  Label fall_through;
+  __ lw(T1, Address(SP, 0 * kWordSize));  // Length value.
+  __ andi(CMPRES, T1, Immediate(kSmiTagMask));
+  __ bne(CMPRES, ZR, &fall_through);  // Non-smi length.
+  __ delay_slot()->lw(T0, Address(SP, 1 * kWordSize));  // Growable array.
+  __ Ret();
+  __ delay_slot()->sw(T1,
+      FieldAddress(T0, GrowableObjectArray::length_offset()));
+  __ Bind(&fall_through);
   return false;
 }
 
 
+// Set data of growable object array.
+// On stack: growable array (+1), data (+0).
 bool Intrinsifier::GrowableArray_setData(Assembler* assembler) {
+  if (FLAG_enable_type_checks) {
+    return false;
+  }
+  Label fall_through;
+  __ lw(T1, Address(SP, 0 * kWordSize));  // Data.
+  // Check that data is an ObjectArray.
+  __ andi(CMPRES, T1, Immediate(kSmiTagMask));
+  __ beq(CMPRES, ZR, &fall_through);  // Data is Smi.
+  __ LoadClassId(TMP, T1);
+  __ BranchNotEqual(TMP, kArrayCid, &fall_through);
+  __ lw(T0, Address(SP, 1 * kWordSize));  // Growable array.
+  __ StoreIntoObject(T0,
+                     FieldAddress(T0, GrowableObjectArray::data_offset()),
+                     T1);
+  __ Ret();
+  __ Bind(&fall_through);
   return false;
 }
 
 
+// Add an element to growable array if it doesn't need to grow, otherwise
+// call into regular code.
+// On stack: growable array (+1), value (+0).
 bool Intrinsifier::GrowableArray_add(Assembler* assembler) {
+  // In checked mode we need to type-check the incoming argument.
+  if (FLAG_enable_type_checks) return false;
+  Label fall_through;
+  __ lw(T0, Address(SP, 1 * kWordSize));  // Array.
+  __ lw(T1, FieldAddress(T0, GrowableObjectArray::length_offset()));
+  // T1: length.
+  __ lw(T2, FieldAddress(T0, GrowableObjectArray::data_offset()));
+  // T2: data.
+  __ lw(T3, FieldAddress(T2, Array::length_offset()));
+  // Compare length with capacity.
+  // T3: capacity.
+  __ beq(T1, T3, &fall_through);  // Must grow data.
+  const int32_t value_one = reinterpret_cast<int32_t>(Smi::New(1));
+  // len = len + 1;
+  __ addiu(T3, T1, Immediate(value_one));
+  __ sw(T3, FieldAddress(T0, GrowableObjectArray::length_offset()));
+  __ lw(T0, Address(SP, 0 * kWordSize));  // Value.
+  ASSERT(kSmiTagShift == 1);
+  __ sll(T1, T1, 1);
+  __ addu(T1, T2, T1);
+  __ StoreIntoObject(T2,
+                     FieldAddress(T1, Array::data_offset()),
+                     T0);
+  __ Ret();
+  __ delay_slot()->mov(V0, NULLREG);
+  __ Bind(&fall_through);
   return false;
 }
 
 
+#define TYPED_ARRAY_ALLOCATION(type_name, cid, max_len, scale_shift)           \
+  Label fall_through;                                                          \
+  const intptr_t kArrayLengthStackOffset = 0 * kWordSize;                      \
+  __ lw(T2, Address(SP, kArrayLengthStackOffset));  /* Array length. */        \
+  /* Check that length is a positive Smi. */                                   \
+  /* T2: requested array length argument. */                                   \
+  __ andi(CMPRES, T2, Immediate(kSmiTagMask));                                 \
+  __ bne(CMPRES, ZR, &fall_through);                                           \
+  __ BranchSignedLess(T2, 0, &fall_through);                                   \
+  __ SmiUntag(T2);                                                             \
+  /* Check for maximum allowed length. */                                      \
+  /* T2: untagged array length. */                                             \
+  __ BranchSignedGreater(T2, max_len, &fall_through);                          \
+  __ sll(T2, T2, scale_shift);                                                 \
+  const intptr_t fixed_size = sizeof(Raw##type_name) + kObjectAlignment - 1;   \
+  __ AddImmediate(T2, fixed_size);                                             \
+  __ LoadImmediate(TMP, -kObjectAlignment);                                    \
+  __ and_(T2, T2, TMP);                                                        \
+  Heap* heap = Isolate::Current()->heap();                                     \
+                                                                               \
+  __ LoadImmediate(V0, heap->TopAddress());                                    \
+  __ lw(V0, Address(V0, 0));                                                   \
+                                                                               \
+  /* T2: allocation size. */                                                   \
+  __ AdduDetectOverflow(T1, V0, T2, CMPRES);                                   \
+  __ bltz(CMPRES, &fall_through);                                              \
+                                                                               \
+  /* Check if the allocation fits into the remaining space. */                 \
+  /* V0: potential new object start. */                                        \
+  /* T1: potential next object start. */                                       \
+  /* T2: allocation size. */                                                   \
+  __ LoadImmediate(T3, heap->EndAddress());                                    \
+  __ lw(T3, Address(T3, 0));                                                   \
+  __ BranchUnsignedGreaterEqual(T1, T3, &fall_through);                        \
+                                                                               \
+  /* Successfully allocated the object(s), now update top to point to */       \
+  /* next object start and initialize the object. */                           \
+  __ LoadImmediate(T3, heap->TopAddress());                                    \
+  __ sw(T1, Address(T3, 0));                                                   \
+  __ AddImmediate(V0, kHeapObjectTag);                                         \
+                                                                               \
+  /* Initialize the tags. */                                                   \
+  /* V0: new object start as a tagged pointer. */                              \
+  /* T1: new object end address. */                                            \
+  /* T2: allocation size. */                                                   \
+  {                                                                            \
+    Label size_tag_overflow, done;                                             \
+    __ BranchUnsignedGreater(T2, RawObject::SizeTag::kMaxSizeTag,              \
+                             &size_tag_overflow);                              \
+    __ b(&done);                                                               \
+    __ delay_slot()->sll(T2, T2,                                               \
+        RawObject::kSizeTagBit - kObjectAlignmentLog2);                        \
+                                                                               \
+    __ Bind(&size_tag_overflow);                                               \
+    __ mov(T2, ZR);                                                            \
+    __ Bind(&done);                                                            \
+                                                                               \
+    /* Get the class index and insert it into the tags. */                     \
+    __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(cid));                 \
+    __ or_(T2, T2, TMP);                                                       \
+    __ sw(T2, FieldAddress(V0, type_name::tags_offset()));  /* Tags. */        \
+  }                                                                            \
+  /* Set the length field. */                                                  \
+  /* V0: new object start as a tagged pointer. */                              \
+  /* T1: new object end address. */                                            \
+  __ lw(T2, Address(SP, kArrayLengthStackOffset));  /* Array length. */        \
+  __ StoreIntoObjectNoBarrier(V0,                                              \
+                              FieldAddress(V0, type_name::length_offset()),    \
+                              T2);                                             \
+  /* Initialize all array elements to 0. */                                    \
+  /* V0: new object start as a tagged pointer. */                              \
+  /* T1: new object end address. */                                            \
+  /* T2: iterator which initially points to the start of the variable */       \
+  /* data area to be initialized. */                                           \
+  __ AddImmediate(T2, V0, sizeof(Raw##type_name) - 1);                         \
+  Label done, init_loop;                                                       \
+  __ Bind(&init_loop);                                                         \
+  __ BranchUnsignedGreaterEqual(T2, T1, &done);                                \
+  __ sw(ZR, Address(T2, 0));                                                   \
+  __ b(&init_loop);                                                            \
+  __ delay_slot()->addiu(T2, T2, Immediate(kWordSize));                        \
+  __ Bind(&done);                                                              \
+                                                                               \
+  __ Ret();                                                                    \
+  __ Bind(&fall_through);                                                      \
+
+
+// Gets the length of a TypedData.
 bool Intrinsifier::TypedData_getLength(Assembler* assembler) {
-  return false;
+  __ lw(T0, Address(SP, 0 * kWordSize));
+  __ Ret();
+  __ delay_slot()->lw(V0, FieldAddress(T0, TypedData::length_offset()));
+  return true;
 }
 
 
+static int GetScaleFactor(intptr_t size) {
+  switch (size) {
+    case 1: return 0;
+    case 2: return 1;
+    case 4: return 2;
+    case 8: return 3;
+    case 16: return 4;
+  }
+  UNREACHABLE();
+  return -1;
+};
+
+
 #define TYPED_DATA_ALLOCATOR(clazz)                                            \
 bool Intrinsifier::TypedData_##clazz##_new(Assembler* assembler) {             \
+  intptr_t size = TypedData::ElementSizeInBytes(kTypedData##clazz##Cid);       \
+  intptr_t max_len = TypedData::MaxElements(kTypedData##clazz##Cid);           \
+  int shift = GetScaleFactor(size);                                            \
+  TYPED_ARRAY_ALLOCATION(TypedData, kTypedData##clazz##Cid, max_len, shift);   \
   return false;                                                                \
 }                                                                              \
 bool Intrinsifier::TypedData_##clazz##_factory(Assembler* assembler) {         \
+  intptr_t size = TypedData::ElementSizeInBytes(kTypedData##clazz##Cid);       \
+  intptr_t max_len = TypedData::MaxElements(kTypedData##clazz##Cid);           \
+  int shift = GetScaleFactor(size);                                            \
+  TYPED_ARRAY_ALLOCATION(TypedData, kTypedData##clazz##Cid, max_len, shift);   \
   return false;                                                                \
 }
 CLASS_LIST_TYPED_DATA(TYPED_DATA_ALLOCATOR)
 #undef TYPED_DATA_ALLOCATOR
 
 
+// Loads args from stack into T0 and T1
+// Tests if they are smis, jumps to label not_smi if not.
+static void TestBothArgumentsSmis(Assembler* assembler, Label* not_smi) {
+  __ lw(T0, Address(SP, 0 * kWordSize));
+  __ lw(T1, Address(SP, 1 * kWordSize));
+  __ or_(CMPRES, T0, T1);
+  __ andi(CMPRES, CMPRES, Immediate(kSmiTagMask));
+  __ bne(CMPRES, ZR, not_smi);
+  return;
+}
+
+
 bool Intrinsifier::Integer_addFromInteger(Assembler* assembler) {
+  Label fall_through;
+
+  TestBothArgumentsSmis(assembler, &fall_through);  // Checks two Smis.
+  __ AdduDetectOverflow(V0, T0, T1, CMPRES);  // Add.
+  __ bltz(CMPRES, &fall_through);  // Fall through on overflow.
+  __ Ret();  // Nothing in branch delay slot.
+  __ Bind(&fall_through);
   return false;
 }
 
 
 bool Intrinsifier::Integer_add(Assembler* assembler) {
-  return false;
+  return Integer_addFromInteger(assembler);
 }
 
 
 bool Intrinsifier::Integer_subFromInteger(Assembler* assembler) {
+  Label fall_through;
+
+  TestBothArgumentsSmis(assembler, &fall_through);
+  __ SubuDetectOverflow(V0, T0, T1, CMPRES);  // Subtract.
+  __ bltz(CMPRES, &fall_through);  // Fall through on overflow.
+  __ Ret();
+  __ Bind(&fall_through);
   return false;
 }
 
 
 bool Intrinsifier::Integer_sub(Assembler* assembler) {
+  Label fall_through;
+
+  TestBothArgumentsSmis(assembler, &fall_through);
+  __ SubuDetectOverflow(V0, T1, T0, CMPRES);  // Subtract.
+  __ bltz(CMPRES, &fall_through);  // Fall through on overflow.
+  __ Ret();  // Nothing in branch delay slot.
+  __ Bind(&fall_through);
   return false;
 }
 
 
 bool Intrinsifier::Integer_mulFromInteger(Assembler* assembler) {
+  Label fall_through;
+
+  TestBothArgumentsSmis(assembler, &fall_through);  // checks two smis
+  __ SmiUntag(T0);  // untags T0. only want result shifted by one
+
+  __ mult(T0, T1);  // HI:LO <- T0 * T1.
+  __ mflo(V0);  // V0 <- LO.
+  __ mfhi(T2);  // T2 <- HI.
+  __ sra(T3, V0, 31);  // T3 <- V0 >> 31.
+  __ bne(T2, T3, &fall_through);  // Fall through on overflow.
+  __ Ret();
+  __ Bind(&fall_through);
   return false;
 }
 
 
 bool Intrinsifier::Integer_mul(Assembler* assembler) {
-  return false;
+  return Integer_mulFromInteger(assembler);
 }
 
 
+// Optimizations:
+// - result is 0 if:
+//   - left is 0
+//   - left equals right
+// - result is left if
+//   - left > 0 && left < right
+// T1: Tagged left (dividend).
+// T0: Tagged right (divisor).
+// V0: Untagged result.
+static void EmitRemainderOperation(Assembler* assembler) {
+  Label return_zero, modulo;
+  const Register left = T1;
+  const Register right = T0;
+  const Register result = V0;
+
+  __ beq(left, ZR, &return_zero);
+  __ beq(left, right, &return_zero);
+
+  __ bltz(left, &modulo);
+  // left is positive.
+  __ BranchSignedGreaterEqual(left, right, &modulo);
+  // left is less than right. return left.
+  __ Ret();
+  __ delay_slot()->mov(result, left);
+
+  __ Bind(&return_zero);
+  __ Ret();
+  __ delay_slot()->mov(result, ZR);
+
+  __ Bind(&modulo);
+  __ SmiUntag(right);
+  __ SmiUntag(left);
+  __ div(left, right);  // Divide, remainder goes in HI.
+  __ mfhi(result);  // result <- HI.
+  return;
+}
+
+
+// Implementation:
+//  res = left % right;
+//  if (res < 0) {
+//    if (right < 0) {
+//      res = res - right;
+//    } else {
+//      res = res + right;
+//    }
+//  }
 bool Intrinsifier::Integer_modulo(Assembler* assembler) {
+  Label fall_through, subtract;
+  TestBothArgumentsSmis(assembler, &fall_through);
+  // T1: Tagged left (dividend).
+  // T0: Tagged right (divisor).
+  // Check if modulo by zero -> exception thrown in main function.
+  __ beq(T0, ZR, &fall_through);
+  EmitRemainderOperation(assembler);
+  // Untagged right in T0. Untagged remainder result in V0.
+
+  Label done;
+  __ bgez(V0, &done);
+  __ bltz(T0, &subtract);
+  __ addu(V0, V0, T0);
+  __ Ret();
+  __ delay_slot()->SmiTag(V0);
+
+  __ Bind(&subtract);
+  __ subu(V0, V0, T0);
+  __ Ret();
+  __ delay_slot()->SmiTag(V0);
+
+  __ Bind(&done);
+  __ Ret();
+  __ delay_slot()->SmiTag(V0);
+
+  __ Bind(&fall_through);
   return false;
 }
 
 
 bool Intrinsifier::Integer_remainder(Assembler* assembler) {
+  Label fall_through;
+
+  TestBothArgumentsSmis(assembler, &fall_through);
+  // T1: Tagged left (dividend).
+  // T0: Tagged right (divisor).
+  // Check if modulo by zero -> exception thrown in main function.
+  __ beq(T0, ZR, &fall_through);
+  EmitRemainderOperation(assembler);
+  // Untagged right in T0. Untagged remainder result in V0.
+
+  __ Ret();
+  __ delay_slot()->SmiTag(V0);
+
+  __ Bind(&fall_through);
   return false;
 }
 
 
 bool Intrinsifier::Integer_truncDivide(Assembler* assembler) {
+  Label fall_through;
+
+  TestBothArgumentsSmis(assembler, &fall_through);
+  __ beq(T0, ZR, &fall_through);  // If b is 0, fall through.
+
+  __ SmiUntag(T0);
+  __ SmiUntag(T1);
+  __ div(T1, T0);  // LO <- T1 / T0
+  __ mflo(V0);  // V0 <- LO
+  // Check the corner case of dividing the 'MIN_SMI' with -1, in which case we
+  // cannot tag the result.
+  __ BranchEqual(V0, 0x40000000, &fall_through);
+  __ Ret();
+  __ delay_slot()->SmiTag(V0);
+  __ Bind(&fall_through);
   return false;
 }
 
 
 bool Intrinsifier::Integer_negate(Assembler* assembler) {
+  Label fall_through;
+
+  __ lw(V0, Address(SP, + 0 * kWordSize));  // Grabs first argument.
+  __ andi(CMPRES, V0, Immediate(kSmiTagMask));  // Test for Smi.
+  __ bne(CMPRES, ZR, &fall_through);  // Fall through if not a Smi.
+  __ Ret();
+  __ delay_slot()->subu(V0, ZR, V0);
+  __ Bind(&fall_through);
   return false;
 }
 
 
 bool Intrinsifier::Integer_bitAndFromInteger(Assembler* assembler) {
+  Label fall_through;
+
+  TestBothArgumentsSmis(assembler, &fall_through);  // Checks two smis.
+  __ Ret();
+  __ delay_slot()->and_(V0, T0, T1);
+  __ Bind(&fall_through);
   return false;
 }
 
 
 bool Intrinsifier::Integer_bitAnd(Assembler* assembler) {
-  return false;
+  return Integer_bitAndFromInteger(assembler);
 }
 
 
 bool Intrinsifier::Integer_bitOrFromInteger(Assembler* assembler) {
+  Label fall_through;
+
+  TestBothArgumentsSmis(assembler, &fall_through);  // Checks two smis.
+  __ Ret();
+  __ delay_slot()->or_(V0, T0, T1);
+  __ Bind(&fall_through);
   return false;
 }
 
 
 bool Intrinsifier::Integer_bitOr(Assembler* assembler) {
-  return false;
+  return Integer_bitOrFromInteger(assembler);
 }
 
 
 bool Intrinsifier::Integer_bitXorFromInteger(Assembler* assembler) {
+  Label fall_through;
+  __ Untested("Intrinsifier::Integer_bitXorFromInteger");
+
+  TestBothArgumentsSmis(assembler, &fall_through);  // Checks two smis.
+  __ Ret();
+  __ delay_slot()->xor_(V0, T0, T1);
+  __ Bind(&fall_through);
   return false;
 }
 
 
 bool Intrinsifier::Integer_bitXor(Assembler* assembler) {
-  return false;
+  return Integer_bitXorFromInteger(assembler);
 }
 
 
 bool Intrinsifier::Integer_shl(Assembler* assembler) {
+  ASSERT(kSmiTagShift == 1);
+  ASSERT(kSmiTag == 0);
+  Label fall_through, overflow;
+
+  TestBothArgumentsSmis(assembler, &fall_through);
+  __ BranchUnsignedGreater(T0, Smi::RawValue(Smi::kBits), &fall_through);
+  __ SmiUntag(T0);
+
+  // Check for overflow by shifting left and shifting back arithmetically.
+  // If the result is different from the original, there was overflow.
+  __ mov(T2, T1);
+  __ sllv(T1, T1, T0);
+  __ srlv(T1, T1, T0);
+  __ bne(T1, T2, &overflow);
+
+  // No overflow, result in V0.
+  __ Ret();
+  __ delay_slot()->sllv(V0, T1, T0);
+
+  __ Bind(&overflow);
+  // Arguments are Smi but the shift produced an overflow to Mint.
+  __ bltz(T2, &fall_through);
+  __ SmiUntag(T2);
+
+  // Pull off high bits that will be shifted off of T2 by making a mask
+  // ((1 << T0) - 1), shifting it to the right, masking T2, then shifting back.
+  // high bits = (((1 << T0) - 1) << (32 - T0)) & T2) >> (32 - T0)
+  // lo bits = T2 << T0
+  __ LoadImmediate(T3, 1);
+  __ sllv(T3, T3, T0);  // T3 <- T3 << T0
+  __ addiu(T3, T3, Immediate(-1));  // T3 <- T3 - 1
+  __ addu(T4, ZR, T0);  // T4 <- -T0
+  __ addiu(T4, T4, Immediate(32));  // T4 <- 32 - T0
+  __ sllv(T3, T3, T4);  // T3 <- T3 << T4
+  __ and_(T3, T3, T2);  // T3 <- T3 & T2
+  __ srlv(T3, T3, T4);  // T3 <- T3 >> T4
+  // Now T3 has the bits that fall off of T2 on a left shift.
+  __ sllv(T0, T2, T0);  // T0 gets low bits.
+
+  const Class& mint_class = Class::Handle(
+      Isolate::Current()->object_store()->mint_class());
+  __ TryAllocate(mint_class, &fall_through, V0);
+
+  __ sw(T0, FieldAddress(V0, Mint::value_offset()));
+  __ Ret();
+  __ delay_slot()->sw(T3, FieldAddress(V0, Mint::value_offset() + kWordSize));
+  __ Bind(&fall_through);
+  return false;
+}
+
+
+static void Get64SmiOrMint(Assembler* assembler,
+                           Register res_hi,
+                           Register res_lo,
+                           Register reg,
+                           Label* not_smi_or_mint) {
+  Label not_smi, done;
+  __ andi(CMPRES, reg, Immediate(kSmiTagMask));
+  __ bne(CMPRES, ZR, &not_smi);
+  __ SmiUntag(reg);
+
+  // Sign extend to 64 bit
+  __ mov(res_lo, reg);
+  __ b(&done);
+  __ delay_slot()->sra(res_hi, reg, 31);
+
+  __ Bind(&not_smi);
+  __ LoadClassId(TMP, reg);
+  __ BranchNotEqual(TMP, kMintCid, not_smi_or_mint);
+
+  // Mint.
+  __ lw(res_lo, FieldAddress(reg, Mint::value_offset()));
+  __ lw(res_hi, FieldAddress(reg, Mint::value_offset() + kWordSize));
+  __ Bind(&done);
+  return;
+}
+
+
+static bool CompareIntegers(Assembler* assembler, Condition true_condition) {
+  Label try_mint_smi, is_true, is_false, drop_two_fall_through, fall_through;
+  TestBothArgumentsSmis(assembler, &try_mint_smi);
+  // T0 contains the right argument. T1 contains left argument
+
+  switch (true_condition) {
+    case LT: __ BranchSignedLess(T1, T0, &is_true); break;
+    case LE: __ BranchSignedLessEqual(T1, T0, &is_true); break;
+    case GT: __ BranchSignedGreater(T1, T0, &is_true); break;
+    case GE: __ BranchSignedGreaterEqual(T1, T0, &is_true); break;
+    default:
+      UNREACHABLE();
+      break;
+  }
+
+  __ Bind(&is_false);
+  __ LoadObject(V0, Bool::False());
+  __ Ret();
+  __ Bind(&is_true);
+  __ LoadObject(V0, Bool::True());
+  __ Ret();
+
+  __ Bind(&try_mint_smi);
+  // Get left as 64 bit integer.
+  Get64SmiOrMint(assembler, T3, T2, T1, &fall_through);
+  // Get right as 64 bit integer.
+  Get64SmiOrMint(assembler, T5, T4, T0, &fall_through);
+  // T3: left high.
+  // T2: left low.
+  // T5: right high.
+  // T4: right low.
+
+  // 64-bit comparison
+  // Condition hi_true_cond, hi_false_cond, lo_false_cond;
+  switch (true_condition) {
+    case LT:
+    case LE: {
+      // Compare left hi, right high.
+      __ BranchSignedGreater(T3, T5, &is_false);
+      __ BranchSignedLess(T3, T5, &is_true);
+      // Compare left lo, right lo.
+      if (true_condition == LT) {
+        __ BranchUnsignedGreaterEqual(T2, T4, &is_false);
+      } else {
+        __ BranchUnsignedGreater(T2, T4, &is_false);
+      }
+      break;
+    }
+    case GT:
+    case GE: {
+      // Compare left hi, right high.
+      __ BranchSignedLess(T3, T5, &is_false);
+      __ BranchSignedGreater(T3, T5, &is_true);
+      // Compare left lo, right lo.
+      if (true_condition == GT) {
+        __ BranchUnsignedLessEqual(T2, T4, &is_false);
+      } else {
+        __ BranchUnsignedLess(T2, T4, &is_false);
+      }
+      break;
+    }
+    default:
+      UNREACHABLE();
+      break;
+  }
+  // Else is true.
+  __ b(&is_true);
+
+  __ Bind(&fall_through);
   return false;
 }
 
 
 bool Intrinsifier::Integer_greaterThanFromInt(Assembler* assembler) {
-  return false;
+  return CompareIntegers(assembler, LT);
 }
 
 
 bool Intrinsifier::Integer_lessThan(Assembler* assembler) {
-  return false;
+  return Integer_greaterThanFromInt(assembler);
 }
 
 
 bool Intrinsifier::Integer_greaterThan(Assembler* assembler) {
-  return false;
+  return CompareIntegers(assembler, GT);
 }
 
 
 bool Intrinsifier::Integer_lessEqualThan(Assembler* assembler) {
-  return false;
+  return CompareIntegers(assembler, LE);
 }
 
 
 bool Intrinsifier::Integer_greaterEqualThan(Assembler* assembler) {
-  return false;
+  return CompareIntegers(assembler, GE);
 }
 
 
+// This is called for Smi, Mint and Bigint receivers. The right argument
+// can be Smi, Mint, Bigint or double.
 bool Intrinsifier::Integer_equalToInteger(Assembler* assembler) {
+  Label fall_through, true_label, check_for_mint;
+  // For integer receiver '===' check first.
+  __ lw(T0, Address(SP, 0 * kWordSize));
+  __ lw(T1, Address(SP, 1 * kWordSize));
+  __ beq(T0, T1, &true_label);
+
+  __ or_(T2, T0, T1);
+  __ andi(CMPRES, T2, Immediate(kSmiTagMask));
+  // If T0 or T1 is not a smi do Mint checks.
+  __ bne(CMPRES, ZR, &check_for_mint);
+
+  // Both arguments are smi, '===' is good enough.
+  __ LoadObject(V0, Bool::False());
+  __ Ret();
+  __ Bind(&true_label);
+  __ LoadObject(V0, Bool::True());
+  __ Ret();
+
+  // At least one of the arguments was not Smi.
+  Label receiver_not_smi;
+  __ Bind(&check_for_mint);
+
+  __ andi(CMPRES, T1, Immediate(kSmiTagMask));
+  __ bne(CMPRES, ZR, &receiver_not_smi);  // Check receiver.
+
+  // Left (receiver) is Smi, return false if right is not Double.
+  // Note that an instance of Mint or Bigint never contains a value that can be
+  // represented by Smi.
+
+  __ LoadClassId(TMP, T0);
+  __ BranchEqual(TMP, kDoubleCid, &fall_through);
+  __ LoadObject(V0, Bool::False());  // Smi == Mint -> false.
+  __ Ret();
+
+  __ Bind(&receiver_not_smi);
+  // T1:: receiver.
+
+  __ LoadClassId(TMP, T1);
+  __ BranchNotEqual(TMP, kMintCid, &fall_through);
+  // Receiver is Mint, return false if right is Smi.
+  __ andi(CMPRES, T0, Immediate(kSmiTagMask));
+  __ bne(CMPRES, ZR, &fall_through);
+  __ LoadObject(V0, Bool::False());
+  __ Ret();
+  // TODO(srdjan): Implement Mint == Mint comparison.
+
+  __ Bind(&fall_through);
   return false;
 }
 
 
 bool Intrinsifier::Integer_equal(Assembler* assembler) {
-  return false;
+  return Integer_equalToInteger(assembler);
 }
 
 
 bool Intrinsifier::Integer_sar(Assembler* assembler) {
+  Label fall_through;
+
+  TestBothArgumentsSmis(assembler, &fall_through);
+  // Shift amount in T0. Value to shift in T1.
+
+  __ SmiUntag(T0);
+  __ bltz(T0, &fall_through);
+
+  __ LoadImmediate(T2, 0x1F);
+  __ slt(CMPRES, T2, T0);  // CMPRES <- 0x1F < T0 ? 1 : 0
+  __ movn(T0, T2, CMPRES);  // T0 <- 0x1F < T0 ? 0x1F : T0
+
+  __ SmiUntag(T1);
+  __ srav(V0, T1, T0);
+  __ Ret();
+  __ delay_slot()->SmiTag(V0);
+  __ Bind(&fall_through);
   return false;
 }
 
 
 bool Intrinsifier::Smi_bitNegate(Assembler* assembler) {
+  __ lw(T0, Address(SP, 0 * kWordSize));
+  __ nor(V0, T0, ZR);
+  __ Ret();
+  __ delay_slot()->addiu(V0, V0, Immediate(-1));  // Remove inverted smi-tag.
+  return false;
+}
+
+
+// Check if the last argument is a double, jump to label 'is_smi' if smi
+// (easy to convert to double), otherwise jump to label 'not_double_smi',
+// Returns the last argument in T0.
+static void TestLastArgumentIsDouble(Assembler* assembler,
+                                     Label* is_smi,
+                                     Label* not_double_smi) {
+  __ lw(T0, Address(SP, 0 * kWordSize));
+  __ andi(CMPRES, T0, Immediate(kSmiTagMask));
+  __ beq(CMPRES, ZR, is_smi);
+  __ LoadClassId(TMP, T0);
+  __ BranchNotEqual(TMP, kDoubleCid, not_double_smi);
+  // Fall through with Double in T0.
+}
+
+
+// Both arguments on stack, arg0 (left) is a double, arg1 (right) is of unknown
+// type. Return true or false object in the register V0. Any NaN argument
+// returns false. Any non-double arg1 causes control flow to fall through to the
+// slow case (compiled method body).
+static bool CompareDoubles(Assembler* assembler, Condition true_condition) {
+  Label is_smi, no_conversion, no_NaN, fall_through;
+
+  TestLastArgumentIsDouble(assembler, &is_smi, &fall_through);
+  // Both arguments are double, right operand is in T0.
+  __ lwc1(F2, FieldAddress(T0, Double::value_offset()));
+  __ b(&no_conversion);
+  __ delay_slot()->lwc1(F3,
+      FieldAddress(T0, Double::value_offset() + kWordSize));
+
+  __ Bind(&is_smi);
+  __ SmiUntag(T0);
+  __ mtc1(T0, F4);
+  __ cvtdw(D1, F4);
+
+  __ Bind(&no_conversion);
+  __ lw(T0, Address(SP, 1 * kWordSize));  // Left argument.
+  __ lwc1(F0, FieldAddress(T0, Double::value_offset()));
+  __ lwc1(F1, FieldAddress(T0, Double::value_offset() + kWordSize));
+  // Now, left is in D0, right is in D1.
+
+  __ cund(D0, D1);  // Check for NaN.
+  __ bc1f(&no_NaN);
+  __ LoadObject(V0, Bool::False());  // Return false if either is NaN.
+  __ Ret();
+  __ Bind(&no_NaN);
+
+  switch (true_condition) {
+    case EQ: __ ceqd(D1, D0); break;
+    case LT: __ coltd(D1, D0); break;
+    case LE: __ coled(D1, D0); break;
+    case GT: __ coltd(D0, D1); break;
+    case GE: __ coled(D0, D1); break;
+    default: {
+      // Only passing the above conditions to this function.
+      UNREACHABLE();
+      break;
+    }
+  }
+
+  Label is_true;
+  __ bc1t(&is_true);
+  __ LoadObject(V0, Bool::False());
+  __ Ret();
+  __ Bind(&is_true);
+  __ LoadObject(V0, Bool::True());
+  __ Ret();
+  __ Bind(&fall_through);
   return false;
 }
 
 
 bool Intrinsifier::Double_greaterThan(Assembler* assembler) {
-  return false;
+  return CompareDoubles(assembler, GT);
 }
 
 
 bool Intrinsifier::Double_greaterEqualThan(Assembler* assembler) {
-  return false;
+  return CompareDoubles(assembler, GE);
 }
 
 
 bool Intrinsifier::Double_lessThan(Assembler* assembler) {
-  return false;
+  return CompareDoubles(assembler, LT);
 }
 
 
 bool Intrinsifier::Double_equal(Assembler* assembler) {
-  return false;
+  return CompareDoubles(assembler, EQ);
 }
 
 
 bool Intrinsifier::Double_lessEqualThan(Assembler* assembler) {
+  return CompareDoubles(assembler, LE);
+}
+
+
+// Expects left argument to be double (receiver). Right argument is unknown.
+// Both arguments are on stack.
+static bool DoubleArithmeticOperations(Assembler* assembler, Token::Kind kind) {
+  Label fall_through;
+
+  TestLastArgumentIsDouble(assembler, &fall_through, &fall_through);
+  // Both arguments are double, right operand is in T0.
+  __ lwc1(F2, FieldAddress(T0, Double::value_offset()));
+  __ lwc1(F3, FieldAddress(T0, Double::value_offset() + kWordSize));
+  __ lw(T0, Address(SP, 1 * kWordSize));  // Left argument.
+  __ lwc1(F0, FieldAddress(T0, Double::value_offset()));
+  __ lwc1(F1, FieldAddress(T0, Double::value_offset() + kWordSize));
+  switch (kind) {
+    case Token::kADD: __ addd(D0, D0, D1); break;
+    case Token::kSUB: __ subd(D0, D0, D1); break;
+    case Token::kMUL: __ muld(D0, D0, D1); break;
+    case Token::kDIV: __ divd(D0, D0, D1); break;
+    default: UNREACHABLE();
+  }
+  const Class& double_class = Class::Handle(
+      Isolate::Current()->object_store()->double_class());
+  __ TryAllocate(double_class, &fall_through, V0);  // Result register.
+  __ swc1(F0, FieldAddress(V0, Double::value_offset()));
+  __ Ret();
+  __ delay_slot()->swc1(F1,
+                        FieldAddress(V0, Double::value_offset() + kWordSize));
+  __ Bind(&fall_through);
   return false;
 }
 
 
 bool Intrinsifier::Double_add(Assembler* assembler) {
-  return false;
+  return DoubleArithmeticOperations(assembler, Token::kADD);
 }
 
 
 bool Intrinsifier::Double_mul(Assembler* assembler) {
-  return false;
+  return DoubleArithmeticOperations(assembler, Token::kMUL);
 }
 
 
 bool Intrinsifier::Double_sub(Assembler* assembler) {
-  return false;
+  return DoubleArithmeticOperations(assembler, Token::kSUB);
 }
 
 
 bool Intrinsifier::Double_div(Assembler* assembler) {
-  return false;
+  return DoubleArithmeticOperations(assembler, Token::kDIV);
 }
 
 
+// Left is double right is integer (Bigint, Mint or Smi)
 bool Intrinsifier::Double_mulFromInteger(Assembler* assembler) {
+  Label fall_through;
+  __ Untested("Intrinsifier::Double_mulFromInteger");
+  // Only Smi-s allowed.
+  __ lw(T0, Address(SP, 0 * kWordSize));
+  __ andi(CMPRES, T0, Immediate(kSmiTagMask));
+  __ bne(CMPRES, ZR, &fall_through);
+
+  // Is Smi.
+  __ SmiUntag(T0);
+  __ mtc1(T0, F4);
+  __ cvtdw(D1, F4);
+
+  __ lw(T0, Address(SP, 1 * kWordSize));
+  __ lwc1(F0, FieldAddress(T0, Double::value_offset()));
+  __ lwc1(F1, FieldAddress(T0, Double::value_offset() + kWordSize));
+  __ muld(D0, D0, D1);
+  const Class& double_class = Class::Handle(
+      Isolate::Current()->object_store()->double_class());
+  __ TryAllocate(double_class, &fall_through, V0);  // Result register.
+  __ swc1(F0, FieldAddress(V0, Double::value_offset()));
+  __ Ret();
+  __ delay_slot()->swc1(F1,
+                        FieldAddress(V0, Double::value_offset() + kWordSize));
+  __ Bind(&fall_through);
   return false;
 }
 
 
 bool Intrinsifier::Double_fromInteger(Assembler* assembler) {
+  Label fall_through;
+
+  __ lw(T0, Address(SP, 0 * kWordSize));
+  __ andi(CMPRES, T0, Immediate(kSmiTagMask));
+  __ bne(T0, ZR, &fall_through);
+
+  // Is Smi.
+  __ SmiUntag(T0);
+  __ mtc1(T0, F4);
+  __ cvtdw(D0, F4);
+  const Class& double_class = Class::Handle(
+      Isolate::Current()->object_store()->double_class());
+  __ TryAllocate(double_class, &fall_through, V0);  // Result register.
+  __ swc1(F0, FieldAddress(V0, Double::value_offset()));
+  __ Ret();
+  __ delay_slot()->swc1(F1,
+                        FieldAddress(V0, Double::value_offset() + kWordSize));
+  __ Bind(&fall_through);
   return false;
 }
 
 
 bool Intrinsifier::Double_getIsNaN(Assembler* assembler) {
-  return false;
+  Label is_true;
+  __ Untested("Intrinsifier::Double_getIsNaN");
+  __ lw(T0, Address(SP, 0 * kWordSize));
+  __ lwc1(F0, FieldAddress(T0, Double::value_offset()));
+  __ lwc1(F1, FieldAddress(T0, Double::value_offset() + kWordSize));
+  __ cund(D0, D0);  // Check for NaN.
+  __ bc1t(&is_true);
+  __ LoadObject(V0, Bool::False());  // Return false if either is NaN.
+  __ Ret();
+  __ Bind(&is_true);
+  __ LoadObject(V0, Bool::True());
+  __ Ret();
+  return true;
 }
 
 
 bool Intrinsifier::Double_getIsNegative(Assembler* assembler) {
-  return false;
+  Label is_false, is_true, is_zero;
+  __ Untested("Intrinsifier::Double_getIsNegative");
+  __ lw(T0, Address(SP, 0 * kWordSize));
+  __ lwc1(F0, FieldAddress(T0, Double::value_offset()));
+  __ lwc1(F1, FieldAddress(T0, Double::value_offset() + kWordSize));
+
+  __ cund(D0, D0);
+  __ bc1t(&is_false);  // NaN -> false.
+
+  __ ceqd(D0, D1);
+  __ bc1t(&is_zero);  // Check for negative zero.
+
+  __ LoadImmediate(D1, 0.0);
+  __ coled(D1, D0);
+  __ bc1t(&is_false);  // >= 0 -> false.
+
+  __ Bind(&is_true);
+  __ LoadObject(V0, Bool::True());
+  __ Ret();
+
+  __ Bind(&is_false);
+  __ LoadObject(V0, Bool::False());
+  __ Ret();
+
+  __ Bind(&is_zero);
+  // Check for negative zero by looking at the sign bit.
+  __ mfc1(T0, F1);  // Moves bits 32...63 of D0 to T0.
+  __ srl(T0, T0, 31);  // Get the sign bit down to bit 0 of T0.
+  __ andi(CMPRES, T0, Immediate(1));  // Check if the bit is set.
+  __ bne(T0, ZR, &is_true);  // Sign bit set. True.
+  __ b(&is_false);
+  return true;
 }
 
 
 bool Intrinsifier::Double_toInt(Assembler* assembler) {
+  __ lw(T0, Address(SP, 0 * kWordSize));
+  __ lwc1(F0, FieldAddress(T0, Double::value_offset()));
+  __ lwc1(F1, FieldAddress(T0, Double::value_offset() + kWordSize));
+  __ cvtwd(F2, D0);
+  __ mfc1(V0, F2);
+  // Overflow is signaled with minint.
+  Label fall_through;
+  // Check for overflow and that it fits into Smi.
+  __ BranchSignedLess(V0, 0xC0000000, &fall_through);
+  __ Ret();
+  __ delay_slot()->SmiTag(V0);
+  __ Bind(&fall_through);
   return false;
 }
 
 
 bool Intrinsifier::Math_sqrt(Assembler* assembler) {
+  Label fall_through, is_smi, double_op;
+  __ Untested("Intrinsifier::Math_sqrt");
+  TestLastArgumentIsDouble(assembler, &is_smi, &fall_through);
+  // Argument is double and is in T0.
+  __ lwc1(F0, FieldAddress(T0, Double::value_offset()));
+  __ lwc1(F1, FieldAddress(T0, Double::value_offset() + kWordSize));
+  __ Bind(&double_op);
+  __ sqrtd(D0, D1);
+  const Class& double_class = Class::Handle(
+      Isolate::Current()->object_store()->double_class());
+  __ TryAllocate(double_class, &fall_through, V0);  // Result register.
+  __ swc1(F0, FieldAddress(V0, Double::value_offset()));
+  __ Ret();
+  __ delay_slot()->swc1(F1,
+                        FieldAddress(V0, Double::value_offset() + kWordSize));
+
+  __ Bind(&is_smi);
+  __ SmiUntag(T0);
+  __ mtc1(T0, F2);
+  __ b(&double_op);
+  __ delay_slot()->cvtdw(D1, F2);
+  __ Bind(&fall_through);
   return false;
 }
 
@@ -311,52 +1425,357 @@
 }
 
 
+//    var state = ((_A * (_state[kSTATE_LO])) + _state[kSTATE_HI]) & _MASK_64;
+//    _state[kSTATE_LO] = state & _MASK_32;
+//    _state[kSTATE_HI] = state >> 32;
 bool Intrinsifier::Random_nextState(Assembler* assembler) {
-  return false;
+  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);
+
+  __ Untested("Random_nextState");
+
+  __ lw(T0, Address(SP, 0 * kWordSize));  // Receiver.
+  __ lw(T1, FieldAddress(T0, state_field.Offset()));  // Field '_state'.
+
+  // Addresses of _state[0] and _state[1].
+  const int64_t disp_0 =
+      FlowGraphCompiler::DataOffsetFor(kTypedDataUint32ArrayCid);
+
+  const int64_t disp_1 =
+      FlowGraphCompiler::ElementSizeFor(kTypedDataUint32ArrayCid) +
+      FlowGraphCompiler::DataOffsetFor(kTypedDataUint32ArrayCid);
+  __ LoadImmediate(T0, a_int32_value);
+  __ lw(T2, FieldAddress(T1, disp_0));
+  __ lw(T3, FieldAddress(T1, disp_1));
+  __ sra(T6, T3, 31);  // Sign extend T3 into T6.
+  __ mtlo(T3);
+  __ mthi(T6);  // HI:LO <- T6:T3
+  // 64-bit multiply and accumulate into T6:T3.
+  __ madd(T0, T2);  // HI:LO <- HI:LO + T0 * T3.
+  __ mflo(T3);
+  __ mfhi(T6);
+  __ sw(T3, FieldAddress(T1, disp_0));
+  __ sw(T6, FieldAddress(T1, disp_1));
+  __ Ret();
+  return true;
 }
 
 
 bool Intrinsifier::Object_equal(Assembler* assembler) {
-  return false;
+  Label is_true;
+
+  __ lw(T0, Address(SP, 0 * kWordSize));
+  __ lw(T1, Address(SP, 1 * kWordSize));
+  __ beq(T0, T1, &is_true);
+  __ LoadObject(V0, Bool::False());
+  __ Ret();
+  __ Bind(&is_true);
+  __ LoadObject(V0, Bool::True());
+  __ Ret();
+  return true;
 }
 
 
 bool Intrinsifier::String_getHashCode(Assembler* assembler) {
+  Label fall_through;
+  __ Untested("Intrinsifier::String_getHashCode");
+  __ lw(T0, Address(SP, 0 * kWordSize));
+  __ lw(V0, FieldAddress(T0, String::hash_offset()));
+  __ beq(V0, ZR, &fall_through);
+  __ Ret();
+  __ Bind(&fall_through);  // Hash not yet computed.
   return false;
 }
 
 
 bool Intrinsifier::String_getLength(Assembler* assembler) {
-  return false;
+  __ lw(T0, Address(SP, 0 * kWordSize));
+  __ Ret();
+  __ delay_slot()->lw(V0, FieldAddress(T0, String::length_offset()));
+  return true;
 }
 
 
+// TODO(srdjan): Implement for two and four byte strings as well.
 bool Intrinsifier::String_codeUnitAt(Assembler* assembler) {
+  Label fall_through;
+
+  __ lw(T1, Address(SP, 0 * kWordSize));  // Index.
+  __ lw(T0, Address(SP, 1 * kWordSize));  // String.
+
+  // Checks.
+  __ andi(CMPRES, T1, Immediate(kSmiTagMask));
+  __ bne(T1, ZR, &fall_through);  // Index is not a Smi.
+  __ lw(T2, FieldAddress(T0, String::length_offset()));  // Range check.
+  // Runtime throws exception.
+  __ BranchUnsignedGreaterEqual(T1, T2, &fall_through);
+  __ LoadClassId(TMP1, T0);  // Class ID check.
+  __ BranchNotEqual(TMP1, kOneByteStringCid, &fall_through);
+
+  // Grab byte and return.
+  __ SmiUntag(T1);
+  __ addu(T2, T0, T1);
+  __ lbu(V0, FieldAddress(T2, OneByteString::data_offset()));
+  __ Ret();
+  __ delay_slot()->SmiTag(V0);
+  __ Bind(&fall_through);
   return false;
 }
 
 
 bool Intrinsifier::String_getIsEmpty(Assembler* assembler) {
-  return false;
+  Label is_true;
+
+  __ lw(T0, Address(SP, 0 * kWordSize));
+  __ lw(T0, FieldAddress(T0, String::length_offset()));
+
+  __ beq(T0, ZR, &is_true);
+  __ LoadObject(V0, Bool::False());
+  __ Ret();
+  __ Bind(&is_true);
+  __ LoadObject(V0, Bool::True());
+  __ Ret();
+  return true;
 }
 
 
 bool Intrinsifier::OneByteString_getHashCode(Assembler* assembler) {
+  Label no_hash;
+  __ Untested("Intrinsifier::OneByteString_getHashCode");
+  __ lw(T1, Address(SP, 0 * kWordSize));
+  __ lw(T0, FieldAddress(T1, String::hash_offset()));
+  __ beq(T0, ZR, &no_hash);
+  __ Ret();  // Return if already computed.
+  __ Bind(&no_hash);
+
+  __ lw(T2, FieldAddress(T1, String::length_offset()));
+
+  Label done;
+  // If the string is empty, set the hash to 1, and return.
+  __ BranchEqual(T2, Smi::RawValue(0), &done);
+  __ delay_slot()->mov(T0, ZR);
+
+  __ SmiUntag(T2);
+  __ AddImmediate(T3, T1, OneByteString::data_offset() - kHeapObjectTag);
+  __ addu(T4, T3, T2);
+  // T0: Hash code, untagged integer.
+  // T1: Instance of OneByteString.
+  // T2: String length, untagged integer.
+  // T3: String data start.
+  // T4: String data end.
+
+  Label loop;
+  // Add to hash code: (hash_ is uint32)
+  // hash_ += ch;
+  // hash_ += hash_ << 10;
+  // hash_ ^= hash_ >> 6;
+  // Get one characters (ch).
+  __ Bind(&loop);
+  __ lw(T5, Address(T3));
+  // T5: ch.
+  __ addiu(T3, T3, Immediate(1));
+  __ addu(T0, T0, T5);
+  __ sll(TMP, T0, 10);
+  __ addu(T0, T0, TMP);
+  __ srl(TMP, T0, 6);
+  __ BranchUnsignedLess(T3, T4, &loop);
+  __ delay_slot()->xor_(T0, T0, TMP);
+
+  // Finalize.
+  // hash_ += hash_ << 3;
+  // hash_ ^= hash_ >> 11;
+  // hash_ += hash_ << 15;
+  __ sll(TMP, T0, 3);
+  __ addu(T0, T0, TMP);
+  __ srl(TMP, T0, 11);
+  __ xor_(T0, T0, TMP);
+  __ sll(TMP, T0, 15);
+  __ addu(T0, T0, TMP);
+  // hash_ = hash_ & ((static_cast<intptr_t>(1) << bits) - 1);
+  __ LoadImmediate(TMP, (static_cast<intptr_t>(1) << String::kHashBits) - 1);
+  __ and_(T0, T0, TMP);
+  __ Bind(&done);
+
+  __ LoadImmediate(T2, 1);
+  __ movz(T0, T2, T0);  // If T0 is 0, set to 1.
+  __ SmiTag(T0);
+  __ Ret();
+  __ delay_slot()->sw(T0, FieldAddress(T1, String::hash_offset()));
   return false;
 }
 
 
+// Allocates one-byte string of length 'end - start'. The content is not
+// initialized.
+// 'length-reg' (T2) contains tagged length.
+// Returns new string as tagged pointer in V0.
+static void TryAllocateOnebyteString(Assembler* assembler,
+                                     Label* ok,
+                                     Label* failure) {
+  const Register length_reg = T2;
+  Label fail;
+
+  __ mov(T6, length_reg);  // Save the length register.
+  __ SmiUntag(length_reg);
+  const intptr_t fixed_size = sizeof(RawString) + kObjectAlignment - 1;
+  __ AddImmediate(length_reg, fixed_size);
+  __ LoadImmediate(TMP, ~(kObjectAlignment - 1));
+  __ and_(length_reg, length_reg, TMP);
+
+  Isolate* isolate = Isolate::Current();
+  Heap* heap = isolate->heap();
+
+  __ LoadImmediate(T3, heap->TopAddress());
+  __ lw(V0, Address(T3, 0));
+
+  // length_reg: allocation size.
+  __ AdduDetectOverflow(T1, V0, length_reg, CMPRES);
+  __ bltz(CMPRES, &fail);  // Fail on overflow.
+
+  // Check if the allocation fits into the remaining space.
+  // V0: potential new object start.
+  // T1: potential next object start.
+  // T2: allocation size.
+  // T3: heap->TopAddress().
+  __ LoadImmediate(T4, heap->EndAddress());
+  __ lw(T4, Address(T4, 0));
+  __ BranchUnsignedGreaterEqual(T1, T4, &fail);
+
+  // Successfully allocated the object(s), now update top to point to
+  // next object start and initialize the object.
+  __ sw(T1, Address(T3, 0));
+  __ AddImmediate(V0, kHeapObjectTag);
+
+  // Initialize the tags.
+  // V0: new object start as a tagged pointer.
+  // T1: new object end address.
+  // T2: allocation size.
+  {
+    Label overflow, done;
+    const intptr_t shift = RawObject::kSizeTagBit - kObjectAlignmentLog2;
+    const Class& cls =
+        Class::Handle(isolate->object_store()->one_byte_string_class());
+
+    __ BranchUnsignedGreater(T2, RawObject::SizeTag::kMaxSizeTag, &overflow);
+    __ b(&done);
+    __ delay_slot()->sll(T2, T2, shift);
+    __ Bind(&overflow);
+    __ mov(T2, ZR);
+    __ Bind(&done);
+
+    // Get the class index and insert it into the tags.
+    // T2: size and bit tags.
+    __ LoadImmediate(TMP1, RawObject::ClassIdTag::encode(cls.id()));
+    __ or_(T2, T2, TMP1);
+    __ sw(T2, FieldAddress(V0, String::tags_offset()));  // Store tags.
+  }
+
+  // Set the length field using the saved length (T6).
+  __ StoreIntoObjectNoBarrier(V0,
+                              FieldAddress(V0, String::length_offset()),
+                              T6);
+  // Clear hash.
+  __ b(ok);
+  __ delay_slot()->sw(ZR, FieldAddress(V0, String::hash_offset()));
+
+  __ Bind(&fail);
+  __ b(failure);
+}
+
+
+// Arg0: Onebyte String
+// Arg1: Start index as Smi.
+// Arg2: End index as Smi.
+// The indexes must be valid.
 bool Intrinsifier::OneByteString_substringUnchecked(Assembler* assembler) {
+  const intptr_t kStringOffset = 2 * kWordSize;
+  const intptr_t kStartIndexOffset = 1 * kWordSize;
+  const intptr_t kEndIndexOffset = 0 * kWordSize;
+  Label fall_through, ok;
+
+  __ lw(T2, Address(SP, kEndIndexOffset));
+  __ lw(TMP, Address(SP, kStartIndexOffset));
+  __ subu(T2, T2, TMP);
+  TryAllocateOnebyteString(assembler, &ok, &fall_through);
+  __ Bind(&ok);
+  // V0: new string as tagged pointer.
+  // Copy string.
+  __ lw(T3, Address(SP, kStringOffset));
+  __ lw(T1, Address(SP, kStartIndexOffset));
+  __ SmiUntag(T1);
+  __ addu(T3, T3, T1);
+  __ AddImmediate(T3, OneByteString::data_offset() - 1);
+
+  // T3: Start address to copy from (untagged).
+  // T1: Untagged start index.
+  __ lw(T2, Address(SP, kEndIndexOffset));
+  __ SmiUntag(T2);
+  __ subu(T2, T2, T1);
+
+  // T3: Start address to copy from (untagged).
+  // T2: Untagged number of bytes to copy.
+  // V0: Tagged result string.
+  // T6: Pointer into T3.
+  // T7: Pointer into T0.
+  // T1: Scratch register.
+  Label loop, done;
+  __ beq(T2, ZR, &done);
+  __ mov(T6, T3);
+  __ mov(T7, V0);
+
+  __ Bind(&loop);
+  __ lbu(T1, Address(T6, 0));
+  __ AddImmediate(T6, 1);
+  __ addiu(T2, T2, Immediate(-1));
+  __ sb(T1, FieldAddress(T7, OneByteString::data_offset()));
+  __ bgtz(T2, &loop);
+  __ delay_slot()->addiu(T7, T7, Immediate(1));
+
+  __ Bind(&done);
+  __ Ret();
+  __ Bind(&fall_through);
   return false;
 }
 
 
 bool Intrinsifier::OneByteString_setAt(Assembler* assembler) {
-  return false;
+  __ lw(T2, Address(SP, 0 * kWordSize));  // Value.
+  __ lw(T1, Address(SP, 1 * kWordSize));  // Index.
+  __ lw(T0, Address(SP, 2 * kWordSize));  // OneByteString.
+  __ SmiUntag(T1);
+  __ SmiUntag(T2);
+  __ addu(T3, T0, T1);
+  __ Ret();
+  __ delay_slot()->sb(T2, FieldAddress(T3, OneByteString::data_offset()));
+  return true;
 }
 
 
 bool Intrinsifier::OneByteString_allocate(Assembler* assembler) {
+  Label fall_through, ok;
+
+  __ lw(T2, Address(SP, 0 * kWordSize));  // Length.
+  TryAllocateOnebyteString(assembler, &ok, &fall_through);
+
+  __ Bind(&ok);
+  __ Ret();
+
+  __ Bind(&fall_through);
   return false;
 }
 
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index ec65512..a9e8d41 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -70,6 +70,7 @@
 #error RAW_NULL should not be defined.
 #endif
 #define RAW_NULL kHeapObjectTag
+Object* Object::null_object_ = NULL;
 Array* Object::empty_array_ = NULL;
 Instance* Object::sentinel_ = NULL;
 Instance* Object::transition_sentinel_ = NULL;
@@ -77,6 +78,7 @@
 Instance* Object::non_constant_ = NULL;
 Bool* Object::bool_true_ = NULL;
 Bool* Object::bool_false_ = NULL;
+Smi* Object::smi_illegal_cid_ = NULL;
 LanguageError* Object::snapshot_writer_error_ = NULL;
 
 RawObject* Object::null_ = reinterpret_cast<RawObject*>(RAW_NULL);
@@ -322,6 +324,7 @@
   Heap* heap = isolate->heap();
 
   // Allocate the read only object handles here.
+  null_object_ = Array::ReadOnlyHandle();
   empty_array_ = Array::ReadOnlyHandle();
   sentinel_ = Instance::ReadOnlyHandle();
   transition_sentinel_ = Instance::ReadOnlyHandle();
@@ -329,6 +332,7 @@
   non_constant_ =  Instance::ReadOnlyHandle();
   bool_true_ = Bool::ReadOnlyHandle();
   bool_false_ = Bool::ReadOnlyHandle();
+  smi_illegal_cid_ = Smi::ReadOnlyHandle();
   snapshot_writer_error_ = LanguageError::ReadOnlyHandle();
 
   // Allocate and initialize the null instance.
@@ -341,6 +345,8 @@
     InitializeObject(address, kNullCid, Instance::InstanceSize());
   }
 
+  *null_object_ = null_;
+
   // Initialize the empty array handle to null_ in order to be able to check
   // if the empty array was allocated (RAW_NULL is not available).
   *empty_array_ = Array::null();
@@ -534,9 +540,11 @@
   *bool_true_ = Bool::New(true);
   *bool_false_ = Bool::New(false);
 
+  *smi_illegal_cid_ = Smi::New(kIllegalCid);
   *snapshot_writer_error_ =
       LanguageError::New(String::Handle(String::New("SnapshotWriter Error")));
 
+  ASSERT(!null_object_->IsSmi());
   ASSERT(!empty_array_->IsSmi());
   ASSERT(empty_array_->IsArray());
   ASSERT(!sentinel_->IsSmi());
@@ -551,6 +559,7 @@
   ASSERT(bool_true_->IsBool());
   ASSERT(!bool_false_->IsSmi());
   ASSERT(bool_false_->IsBool());
+  ASSERT(smi_illegal_cid_->IsSmi());
   ASSERT(!snapshot_writer_error_->IsSmi());
   ASSERT(snapshot_writer_error_->IsLanguageError());
 }
@@ -967,6 +976,7 @@
   // Set the super type of class Stacktrace to Object type so that the
   // 'toString' method is implemented.
   cls = object_store->stacktrace_class();
+  type = object_store->object_type();
   cls.set_super_type(type);
 
   // Note: The abstract class Function is represented by VM class
@@ -1054,7 +1064,7 @@
   // Remove the Object superclass cycle by setting the super type to null (not
   // to the type of null).
   cls = object_store->object_class();
-  cls.set_super_type(Type::Handle());
+  cls.set_super_type(Type::null_object());
 
   ClassFinalizer::VerifyBootstrapClasses();
   MarkInvisibleFunctions();
@@ -1577,13 +1587,14 @@
 intptr_t Class::NumTypeArguments() const {
   // To work properly, this call requires the super class of this class to be
   // resolved, which is checked by the SuperClass() call.
-  Class& cls = Class::Handle(raw());
+  Isolate* isolate = Isolate::Current();
+  Class& cls = Class::Handle(isolate, raw());
   intptr_t num_type_args = 0;
 
   do {
     if (cls.IsSignatureClass()) {
       const Function& signature_fun =
-          Function::Handle(cls.signature_function());
+          Function::Handle(isolate, cls.signature_function());
       if (!signature_fun.is_static() &&
           !signature_fun.HasInstantiatedSignature()) {
         cls = signature_fun.Owner();
@@ -1591,7 +1602,8 @@
     }
     num_type_args += cls.NumTypeParameters();
     // Object is its own super class during bootstrap.
-    if (cls.SuperClass() == Class::null() || cls.SuperClass() == cls.raw()) {
+    if (cls.super_type() == Type::null() ||
+        cls.super_type() == isolate->object_store()->object_type()) {
       break;
     }
     cls = cls.SuperClass();
@@ -1612,10 +1624,10 @@
 
 
 RawClass* Class::SuperClass() const {
-  const AbstractType& sup_type = AbstractType::Handle(super_type());
-  if (sup_type.IsNull()) {
+  if (super_type() == Type::null()) {
     return Class::null();
   }
+  const AbstractType& sup_type = AbstractType::Handle(super_type());
   return sup_type.type_class();
 }
 
@@ -2580,8 +2592,7 @@
   const Library& lib = Library::Handle(isolate, library());
   const Object& obj = Object::Handle(isolate, lib.LookupLocalObject(name));
   if (!obj.IsNull() && obj.IsLibraryPrefix()) {
-    const LibraryPrefix& lib_prefix = LibraryPrefix::Cast(obj);
-    return lib_prefix.raw();
+    return LibraryPrefix::Cast(obj).raw();
   }
   return LibraryPrefix::null();
 }
@@ -3163,10 +3174,8 @@
   // Update used count.
   // Last element of the array is the number of used elements.
   intptr_t table_size = table.Length() - 1;
-  Smi& used = Smi::Handle(isolate);
-  used ^= table.At(table_size);
-  intptr_t used_elements = used.Value() + 1;
-  used = Smi::New(used_elements);
+  intptr_t used_elements = Smi::Value(Smi::RawCast(table.At(table_size))) + 1;
+  const Smi& used = Smi::Handle(isolate, Smi::New(used_elements));
   table.SetAt(table_size, used);
 
   // Rehash if table is 75% full.
@@ -4871,7 +4880,7 @@
   result.set_name(name);
   result.set_is_static(is_static);
   if (is_static) {
-    result.set_value(Instance::Handle());
+    result.set_value(Instance::null_object());
   } else {
     result.SetOffset(0);
   }
@@ -4882,7 +4891,7 @@
   result.set_has_initializer(false);
   result.set_guarded_cid(kIllegalCid);
   result.set_is_nullable(false);
-  result.set_dependent_code(Array::Handle());
+  result.set_dependent_code(Array::null_object());
   return result.raw();
 }
 
@@ -4895,7 +4904,7 @@
   const PatchClass& clone_owner =
       PatchClass::Handle(PatchClass::New(new_owner, owner));
   clone.set_owner(clone_owner);
-  clone.set_dependent_code(Array::Handle());
+  clone.set_dependent_code(Array::null_object());
   if (!clone.is_static()) {
     clone.SetOffset(0);
   }
@@ -4989,7 +4998,7 @@
   if (code_objects.IsNull()) {
     return;
   }
-  set_dependent_code(Array::Handle());
+  set_dependent_code(Array::null_object());
 
   // Deoptimize all dependent code on the stack.
   Code& code = Code::Handle();
@@ -5631,13 +5640,11 @@
     if (Token::IsPseudoKeyword(kind) || Token::IsKeyword(kind)) {
       Isolate* isolate = Isolate::Current();
       ObjectStore* object_store = isolate->object_store();
-      String& str = String::Handle(isolate, String::null());
       const Array& symbols = Array::Handle(isolate,
                                            object_store->keyword_symbols());
       ASSERT(!symbols.IsNull());
-      str ^= symbols.At(kind - Token::kFirstKeyword);
-      ASSERT(!str.IsNull());
-      return str.raw();
+      ASSERT(symbols.At(kind - Token::kFirstKeyword) != String::null());
+      return String::RawCast(symbols.At(kind - Token::kFirstKeyword));
     }
     return Symbols::New(Token::Str(kind));
   } else {
@@ -6021,10 +6028,9 @@
 
   // Insert the object at the empty slot.
   dict.SetAt(index, obj);
-  Smi& used = Smi::Handle();
-  used ^= dict.At(dict_size);
-  intptr_t used_elements = used.Value() + 1;  // One more element added.
-  used = Smi::New(used_elements);
+  // One more element added.
+  intptr_t used_elements = Smi::Value(Smi::RawCast(dict.At(dict_size))) + 1;
+  const Smi& used = Smi::Handle(Smi::New(used_elements));
   dict.SetAt(dict_size, used);  // Update used count.
 
   // Rehash if symbol_table is 75% full.
@@ -6219,9 +6225,9 @@
 
 RawField* Library::LookupFieldAllowPrivate(const String& name) const {
   // First check if name is found in the local scope of the library.
-  Field& field = Field::Handle(LookupLocalField(name));
-  if (!field.IsNull()) {
-    return field.raw();
+  Object& obj = Object::Handle(LookupLocalField(name));
+  if (!obj.IsNull()) {
+    return Field::Cast(obj).raw();
   }
 
   // Do not look up private names in imported libraries.
@@ -6232,13 +6238,11 @@
   // Now check if name is found in any imported libs.
   const Array& imports = Array::Handle(this->imports());
   Namespace& import = Namespace::Handle();
-  Object& obj = Object::Handle();
   for (intptr_t j = 0; j < this->num_imports(); j++) {
     import ^= imports.At(j);
     obj = import.Lookup(name);
     if (!obj.IsNull() && obj.IsField()) {
-      field ^= obj.raw();
-      return field.raw();
+      return Field::Cast(obj).raw();
     }
   }
   return Field::null();
@@ -6409,9 +6413,7 @@
     return Namespace::null();
   }
   const Array& import_list = Array::Handle(imports());
-  Namespace& import = Namespace::Handle();
-  import ^= import_list.At(index);
-  return import.raw();
+  return Namespace::RawCast(import_list.At(index));
 }
 
 
@@ -6526,7 +6528,7 @@
     const Library& core_lib = Library::Handle(Library::CoreLibrary());
     ASSERT(!core_lib.IsNull());
     const Namespace& ns = Namespace::Handle(
-        Namespace::New(core_lib, Array::Handle(), Array::Handle()));
+        Namespace::New(core_lib, Array::null_object(), Array::null_object()));
     result.AddImport(ns);
   }
   return result.raw();
@@ -6544,7 +6546,7 @@
       Library::Handle(Library::NewLibraryHelper(core_lib_url, false));
   core_lib.Register();
   isolate->object_store()->set_bootstrap_library(ObjectStore::kCore, core_lib);
-  isolate->object_store()->set_root_library(Library::Handle());
+  isolate->object_store()->set_root_library(Library::null_object());
 
   // Hook up predefined classes without setting their library pointers. These
   // classes are coming from the VM isolate, and are shared between multiple
@@ -6891,10 +6893,11 @@
 
 
 RawObject* Namespace::Lookup(const String& name) const {
-  const Library& lib = Library::Handle(library());
+  Isolate* isolate = Isolate::Current();
+  const Library& lib = Library::Handle(isolate, library());
   intptr_t ignore = 0;
   // Lookup the name in the library's symbols.
-  Object& obj = Object::Handle(lib.LookupEntry(name, &ignore));
+  Object& obj = Object::Handle(isolate, lib.LookupEntry(name, &ignore));
   if (obj.IsNull()) {
     // Lookup in the re-exported symbols.
     obj = lib.LookupExport(name);
@@ -7737,9 +7740,8 @@
 
 
 intptr_t Code::Comments::PCOffsetAt(intptr_t idx) const {
-  Smi& result = Smi::Handle();
-  result ^= comments_.At(idx * kNumberOfEntries + kPCOffsetEntry);
-  return result.Value();
+  return Smi::Value(Smi::RawCast(
+      comments_.At(idx * kNumberOfEntries + kPCOffsetEntry)));
 }
 
 
@@ -7750,9 +7752,7 @@
 
 
 RawString* Code::Comments::CommentAt(intptr_t idx) const {
-  String& result = String::Handle();
-  result ^= comments_.At(idx * kNumberOfEntries + kCommentEntry);
-  return result.raw();
+  return String::RawCast(comments_.At(idx * kNumberOfEntries + kCommentEntry));
 }
 
 
@@ -7783,6 +7783,17 @@
 
 void Code::set_static_calls_target_table(const Array& value) const {
   StorePointer(&raw_ptr()->static_calls_target_table_, value.raw());
+#if defined(DEBUG)
+  // Check that the table is sorted by pc offsets.
+  // FlowGraphCompiler::AddStaticCallTarget adds pc-offsets to the table while
+  // emitting assembly. This guarantees that every succeeding pc-offset is
+  // larger than the previously added one.
+  for (intptr_t i = kSCallTableEntryLength;
+      i < value.Length();
+      i += kSCallTableEntryLength) {
+    ASSERT(value.At(i - kSCallTableEntryLength) < value.At(i));
+  }
+#endif  // DEBUG
 }
 
 
@@ -7810,36 +7821,49 @@
 }
 
 
-RawFunction* Code::GetStaticCallTargetFunctionAt(uword pc) const {
-  RawObject* raw_code_offset =
-      reinterpret_cast<RawObject*>(Smi::New(pc - EntryPoint()));
-  const Array& array =
-      Array::Handle(raw_ptr()->static_calls_target_table_);
-  for (intptr_t i = 0; i < array.Length(); i += kSCallTableEntryLength) {
-    if (array.At(i) == raw_code_offset) {
-      Function& function = Function::Handle();
-      function ^= array.At(i + kSCallTableFunctionEntry);
-      return function.raw();
+intptr_t Code::BinarySearchInSCallTable(uword pc) const {
+  NoGCScope no_gc;
+  const Array& table = Array::Handle(raw_ptr()->static_calls_target_table_);
+  RawObject* key = reinterpret_cast<RawObject*>(Smi::New(pc - EntryPoint()));
+  intptr_t imin = 0;
+  intptr_t imax = table.Length() / kSCallTableEntryLength;
+  while (imax >= imin) {
+    const intptr_t imid = ((imax - imin) / 2) + imin;
+    const intptr_t real_index = imid * kSCallTableEntryLength;
+    RawObject* key_in_table = table.At(real_index);
+    if (key_in_table < key) {
+      imin = imid + 1;
+    } else if (key_in_table > key) {
+      imax = imid - 1;
+    } else {
+      return real_index;
     }
   }
-  return Function::null();
+  return -1;
+}
+
+
+RawFunction* Code::GetStaticCallTargetFunctionAt(uword pc) const {
+  const intptr_t i = BinarySearchInSCallTable(pc);
+  if (i < 0) {
+    return Function::null();
+  }
+  const Array& array =
+      Array::Handle(raw_ptr()->static_calls_target_table_);
+  Function& function = Function::Handle();
+  function ^= array.At(i + kSCallTableFunctionEntry);
+  return function.raw();
 }
 
 
 void Code::SetStaticCallTargetCodeAt(uword pc, const Code& code) const {
-  RawObject* raw_code_offset =
-      reinterpret_cast<RawObject*>(Smi::New(pc - EntryPoint()));
+  const intptr_t i = BinarySearchInSCallTable(pc);
+  ASSERT(i >= 0);
   const Array& array =
       Array::Handle(raw_ptr()->static_calls_target_table_);
-  for (intptr_t i = 0; i < array.Length(); i += kSCallTableEntryLength) {
-    if (array.At(i) == raw_code_offset) {
-      ASSERT(code.IsNull() ||
-             (code.function() == array.At(i + kSCallTableFunctionEntry)));
-      array.SetAt(i + kSCallTableCodeEntry, code);
-      return;
-    }
-  }
-  UNREACHABLE();
+  ASSERT(code.IsNull() ||
+         (code.function() == array.At(i + kSCallTableFunctionEntry)));
+  array.SetAt(i + kSCallTableCodeEntry, code);
 }
 
 
@@ -8319,11 +8343,9 @@
 }
 
 
-void ICData::WriteSentinel() const {
-  const Smi& sentinel_value = Smi::Handle(Smi::New(kIllegalCid));
-  const Array& data = Array::Handle(ic_data());
+void ICData::WriteSentinel(const Array& data) const {
   for (intptr_t i = 1; i <= TestEntryLength(); i++) {
-    data.SetAt(data.Length() - i, sentinel_value);
+    data.SetAt(data.Length() - i, smi_illegal_cid());
   }
 }
 
@@ -8362,16 +8384,19 @@
   const intptr_t new_len = data.Length() + TestEntryLength();
   data = Array::Grow(data, new_len, Heap::kOld);
   set_ic_data(data);
-  WriteSentinel();
+  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);
-    data.SetAt(data_pos++, Smi::Handle(Smi::New(class_ids[i])));
+    value = Smi::New(class_ids[i]);
+    data.SetAt(data_pos++, value);
   }
   ASSERT(!target.IsNull());
   data.SetAt(data_pos++, target);
-  data.SetAt(data_pos, Smi::Handle(Smi::New(1)));
+  value = Smi::New(1);
+  data.SetAt(data_pos, value);
 }
 
 
@@ -8391,7 +8416,7 @@
   const intptr_t new_len = data.Length() + TestEntryLength();
   data = Array::Grow(data, new_len, Heap::kOld);
   set_ic_data(data);
-  WriteSentinel();
+  WriteSentinel(data);
   intptr_t data_pos = old_num * TestEntryLength();
   if ((receiver_class_id == kSmiCid) && (data_pos > 0)) {
     ASSERT(GetReceiverClassIdAt(0) != kSmiCid);
@@ -8417,10 +8442,8 @@
   class_ids->Clear();
   const Array& data = Array::Handle(ic_data());
   intptr_t data_pos = index * TestEntryLength();
-  Smi& smi = Smi::Handle();
   for (intptr_t i = 0; i < num_args_tested(); i++) {
-    smi ^= data.At(data_pos++);
-    class_ids->Add(smi.Value());
+    class_ids->Add(Smi::Value(Smi::RawCast(data.At(data_pos++))));
   }
   (*target) ^= data.At(data_pos++);
 }
@@ -8434,9 +8457,7 @@
   ASSERT(num_args_tested() == 1);
   const Array& data = Array::Handle(ic_data());
   intptr_t data_pos = index * TestEntryLength();
-  Smi& smi = Smi::Handle();
-  smi ^= data.At(data_pos);
-  *class_id = smi.Value();
+  *class_id = Smi::Value(Smi::RawCast(data.At(data_pos)));
   *target ^= data.At(data_pos + 1);
 }
 
@@ -8453,9 +8474,7 @@
   ASSERT(index < NumberOfChecks());
   const Array& data = Array::Handle(ic_data());
   const intptr_t data_pos = index * TestEntryLength();
-  Smi& smi = Smi::Handle();
-  smi ^= data.At(data_pos);
-  return smi.Value();
+  return Smi::Value(Smi::RawCast(data.At(data_pos)));
 }
 
 
@@ -8489,9 +8508,7 @@
   const Array& data = Array::Handle(ic_data());
   const intptr_t data_pos = index * TestEntryLength() +
       CountIndexFor(num_args_tested());
-  Smi& smi = Smi::Handle();
-  smi ^= data.At(data_pos);
-  return smi.Value();
+  return Smi::Value(Smi::RawCast(data.At(data_pos)));
 }
 
 
@@ -8646,7 +8663,7 @@
   // 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();
+  result.WriteSentinel(ic_data);
   return result.raw();
 }
 
@@ -8694,11 +8711,10 @@
   }
   const intptr_t capacity = kInitialCapacity;
   const Array& buckets = Array::Handle(Array::New(kEntryLength * capacity));
-  const Smi& illegal = Smi::Handle(Smi::New(kIllegalCid));
   const Function& handler = Function::Handle(
       Isolate::Current()->megamorphic_cache_table()->miss_handler());
   for (intptr_t i = 0; i < capacity; ++i) {
-    SetEntry(buckets, i, illegal, handler);
+    SetEntry(buckets, i, smi_illegal_cid(), handler);
   }
   result.set_buckets(buckets);
   result.set_mask(capacity - 1);
@@ -8716,17 +8732,17 @@
     const Array& new_buckets =
         Array::Handle(Array::New(kEntryLength * new_capacity));
 
-    Smi& class_id = Smi::Handle(Smi::New(kIllegalCid));
     Function& target = Function::Handle(
         Isolate::Current()->megamorphic_cache_table()->miss_handler());
     for (intptr_t i = 0; i < new_capacity; ++i) {
-      SetEntry(new_buckets, i, class_id, target);
+      SetEntry(new_buckets, i, smi_illegal_cid(), target);
     }
     set_buckets(new_buckets);
     set_mask(new_capacity - 1);
     set_filled_entry_count(0);
 
     // Rehash the valid entries.
+    Smi& class_id = Smi::Handle();
     for (intptr_t i = 0; i < old_capacity; ++i) {
       class_id ^= GetClassId(old_buckets, i);
       if (class_id.Value() != kIllegalCid) {
@@ -8745,11 +8761,9 @@
   const Array& backing_array = Array::Handle(buckets());
   intptr_t id_mask = mask();
   intptr_t index = class_id.Value() & id_mask;
-  Smi& probe = Smi::Handle();
   intptr_t i = index;
   do {
-    probe ^= GetClassId(backing_array, i);
-    if (probe.Value() == kIllegalCid) {
+    if (Smi::Value(Smi::RawCast(GetClassId(backing_array, i))) == kIllegalCid) {
       SetEntry(backing_array, i, class_id, target);
       set_filled_entry_count(filled_entry_count() + 1);
       return;
@@ -8822,9 +8836,8 @@
     Bool* test_result) const {
   Array& data = Array::Handle(cache());
   intptr_t data_pos = ix * kTestEntryLength;
-  Smi& instance_class_id_handle = Smi::Handle();
-  instance_class_id_handle ^= data.At(data_pos + kInstanceClassId);
-  *instance_class_id = instance_class_id_handle.Value();
+  *instance_class_id =
+      Smi::Value(Smi::RawCast(data.At(data_pos + kInstanceClassId)));
   *instance_type_arguments ^= data.At(data_pos + kInstanceTypeArguments);
   *instantiator_type_arguments ^=
       data.At(data_pos + kInstantiatorTypeArguments);
@@ -10494,12 +10507,8 @@
   // 64-bit signed result, except the product of two Smis (unless the Smis are
   // 32-bit or less).
   if (IsSmi() && other.IsSmi()) {
-    Smi& left_smi = Smi::Handle();
-    Smi& right_smi = Smi::Handle();
-    left_smi ^= raw();
-    right_smi ^= other.raw();
-    const intptr_t left_value = left_smi.Value();
-    const intptr_t right_value = right_smi.Value();
+    const intptr_t left_value = Smi::Value(Smi::RawCast(raw()));
+    const intptr_t right_value = Smi::Value(Smi::RawCast(other.raw()));
     switch (operation) {
       case Token::kADD:
         return Integer::New(left_value + right_value);
@@ -10592,20 +10601,18 @@
 
 RawInteger* Integer::BitOp(Token::Kind kind, const Integer& other) const {
   if (IsSmi() && other.IsSmi()) {
-    Smi& op1 = Smi::Handle();
-    Smi& op2 = Smi::Handle();
-    op1 ^= raw();
-    op2 ^= other.raw();
+    intptr_t op1_value = Smi::Value(Smi::RawCast(raw()));
+    intptr_t op2_value = Smi::Value(Smi::RawCast(other.raw()));
     intptr_t result = 0;
     switch (kind) {
       case Token::kBIT_AND:
-        result = op1.Value() & op2.Value();
+        result = op1_value & op2_value;
         break;
       case Token::kBIT_OR:
-        result = op1.Value() | op2.Value();
+        result = op1_value | op2_value;
         break;
       case Token::kBIT_XOR:
-        result = op1.Value() ^ op2.Value();
+        result = op1_value ^ op2_value;
         break;
       default:
         UNIMPLEMENTED();
@@ -12587,7 +12594,7 @@
   intptr_t index = Length() - 1;
   const Array& contents = Array::Handle(data());
   const Object& obj = Object::Handle(contents.At(index));
-  contents.SetAt(index, Object::Handle());
+  contents.SetAt(index, null_object());
   SetLength(index);
   return obj.raw();
 }
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 349542f..482f696 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -110,9 +110,16 @@
     ASSERT(obj.Is##object());                                                  \
     return reinterpret_cast<const object&>(obj);                               \
   }                                                                            \
+  static Raw##object* RawCast(RawObject* raw) {                                \
+    ASSERT(Object::Handle(raw).Is##object());                                  \
+    return reinterpret_cast<Raw##object*>(raw);                                \
+  }                                                                            \
   static Raw##object* null() {                                                 \
     return reinterpret_cast<Raw##object*>(Object::null());                     \
   }                                                                            \
+  static const object& null_object() {                                         \
+    return reinterpret_cast<const object&>(Object::null_object());             \
+  }                                                                            \
   virtual const char* ToCString() const;                                       \
   static const ClassId kClassId = k##object##Cid;                              \
  private:  /* NOLINT */                                                        \
@@ -305,6 +312,10 @@
   }
 
   static RawObject* null() { return null_; }
+  static const Object& null_object() {
+    ASSERT(null_object_ != NULL);
+    return *null_object_;
+  }
   static const Array& empty_array() {
     ASSERT(empty_array_ != NULL);
     return *empty_array_;
@@ -342,6 +353,11 @@
     ASSERT(bool_false_ != NULL);
     return *bool_false_;
   }
+
+  static const Smi& smi_illegal_cid() {
+    ASSERT(smi_illegal_cid_ != NULL);
+    return *smi_illegal_cid_;
+  }
   static const LanguageError& snapshot_writer_error() {
     ASSERT(snapshot_writer_error_ != NULL);
     return *snapshot_writer_error_;
@@ -533,6 +549,7 @@
 
   // The static values below are read-only handle pointers for singleton
   // objects that are shared between the different isolates.
+  static Object* null_object_;
   static Array* empty_array_;
   static Instance* sentinel_;
   static Instance* transition_sentinel_;
@@ -540,6 +557,7 @@
   static Instance* non_constant_;
   static Bool* bool_true_;
   static Bool* bool_false_;
+  static Smi* smi_illegal_cid_;
   static LanguageError* snapshot_writer_error_;
 
   friend void ClassTable::Register(const Class& cls);
@@ -2973,6 +2991,7 @@
     *PointerOffsetAddrAt(index) = offset_in_instructions;
   }
 
+  intptr_t BinarySearchInSCallTable(uword pc) const;
 
   // New is a private method as RawInstruction and RawCode objects should
   // only be created using the Code::FinalizeCode method. This method creates
@@ -3251,7 +3270,7 @@
 #endif  // DEBUG
 
   intptr_t TestEntryLength() const;
-  void WriteSentinel() const;
+  void WriteSentinel(const Array& data) const;
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(ICData, Object);
   friend class Class;
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 7659c44..ddde3cf 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -109,10 +109,17 @@
 }
 
 
-LocalVariable* ParsedFunction::CreateExpressionTempVar(intptr_t token_pos) {
-  return new LocalVariable(token_pos,
-                           Symbols::ExprTemp(),
-                           Type::ZoneHandle(Type::DynamicType()));
+LocalVariable* ParsedFunction::EnsureExpressionTemp() {
+  if (!has_expression_temp_var()) {
+    LocalVariable* temp =
+        new LocalVariable(function_.token_pos(),
+                          Symbols::ExprTemp(),
+                          Type::ZoneHandle(Type::DynamicType()));
+    ASSERT(temp != NULL);
+    set_expression_temp_var(temp);
+  }
+  ASSERT(has_expression_temp_var());
+  return expression_temp_var();
 }
 
 
@@ -255,17 +262,20 @@
 
 // For parsing a compilation unit.
 Parser::Parser(const Script& script, const Library& library, intptr_t token_pos)
-    : script_(Script::Handle(script.raw())),
-      tokens_iterator_(TokenStream::Handle(script.tokens()), token_pos),
+    : isolate_(Isolate::Current()),
+      script_(Script::Handle(isolate_, script.raw())),
+      tokens_iterator_(TokenStream::Handle(isolate_, script.tokens()),
+                       token_pos),
       token_kind_(Token::kILLEGAL),
       current_block_(NULL),
       is_top_level_(false),
       current_member_(NULL),
       allow_function_literals_(true),
       parsed_function_(NULL),
-      innermost_function_(Function::Handle()),
-      current_class_(Class::Handle()),
-      library_(Library::Handle(library.raw())),
+      innermost_function_(Function::Handle(isolate_)),
+      literal_token_(LiteralToken::Handle(isolate_)),
+      current_class_(Class::Handle(isolate_)),
+      library_(Library::Handle(isolate_, library.raw())),
       try_blocks_list_(NULL) {
   ASSERT(tokens_iterator_.IsValid());
   ASSERT(!library.IsNull());
@@ -276,17 +286,23 @@
 Parser::Parser(const Script& script,
                ParsedFunction* parsed_function,
                intptr_t token_position)
-    : script_(Script::Handle(script.raw())),
-      tokens_iterator_(TokenStream::Handle(script.tokens()), token_position),
+    : isolate_(Isolate::Current()),
+      script_(Script::Handle(isolate_, script.raw())),
+      tokens_iterator_(TokenStream::Handle(isolate_, script.tokens()),
+                       token_position),
       token_kind_(Token::kILLEGAL),
       current_block_(NULL),
       is_top_level_(false),
       current_member_(NULL),
       allow_function_literals_(true),
       parsed_function_(parsed_function),
-      innermost_function_(Function::Handle(parsed_function->function().raw())),
-      current_class_(Class::Handle(parsed_function->function().Owner())),
+      innermost_function_(Function::Handle(isolate_,
+                                           parsed_function->function().raw())),
+      literal_token_(LiteralToken::Handle(isolate_)),
+      current_class_(Class::Handle(isolate_,
+                                   parsed_function->function().Owner())),
       library_(Library::Handle(Class::Handle(
+          isolate_,
           parsed_function->function().origin()).library())),
       try_blocks_list_(NULL) {
   ASSERT(tokens_iterator_.IsValid());
@@ -377,18 +393,16 @@
 
 
 RawDouble* Parser::CurrentDoubleLiteral() const {
-  LiteralToken& token = LiteralToken::Handle();
-  token ^= tokens_iterator_.CurrentToken();
-  ASSERT(token.kind() == Token::kDOUBLE);
-  return reinterpret_cast<RawDouble*>(token.value());
+  literal_token_ ^= tokens_iterator_.CurrentToken();
+  ASSERT(literal_token_.kind() == Token::kDOUBLE);
+  return Double::RawCast(literal_token_.value());
 }
 
 
 RawInteger* Parser::CurrentIntegerLiteral() const {
-  LiteralToken& token = LiteralToken::Handle();
-  token ^= tokens_iterator_.CurrentToken();
-  ASSERT(token.kind() == Token::kINTEGER);
-  return reinterpret_cast<RawInteger*>(token.value());
+  literal_token_ ^= tokens_iterator_.CurrentToken();
+  ASSERT(literal_token_.kind() == Token::kINTEGER);
+  return Integer::RawCast(literal_token_.value());
 }
 
 
@@ -1401,7 +1415,8 @@
 StaticCallNode* Parser::BuildInvocationMirrorAllocation(
     intptr_t call_pos,
     const String& function_name,
-    const ArgumentListNode& function_args) {
+    const ArgumentListNode& function_args,
+    const LocalVariable* temp_for_last_arg) {
   const intptr_t args_pos = function_args.token_pos();
   // Build arguments to the call to the static
   // InvocationMirror._allocateInvocationMirror method.
@@ -1418,7 +1433,18 @@
   ArrayNode* args_array =
       new ArrayNode(args_pos, Type::ZoneHandle(Type::ArrayType()));
   for (intptr_t i = 0; i < function_args.length(); i++) {
-    args_array->AddElement(function_args.NodeAt(i));
+    AstNode* arg = function_args.NodeAt(i);
+    if ((temp_for_last_arg != NULL) && (i == function_args.length() - 1)) {
+      args_array->AddElement(
+          new CommaNode(arg->token_pos(),
+                        new StoreLocalNode(arg->token_pos(),
+                                           temp_for_last_arg,
+                                           arg),
+                        new LoadLocalNode(arg->token_pos(),
+                                          temp_for_last_arg)));
+    } else {
+      args_array->AddElement(function_args.NodeAt(i));
+    }
   }
   arguments->Add(args_array);
   // Lookup the static InvocationMirror._allocateInvocationMirror method.
@@ -1436,14 +1462,15 @@
 ArgumentListNode* Parser::BuildNoSuchMethodArguments(
     intptr_t call_pos,
     const String& function_name,
-    const ArgumentListNode& function_args) {
+    const ArgumentListNode& function_args,
+    const LocalVariable* temp_for_last_arg) {
   ASSERT(function_args.length() >= 1);  // The receiver is the first argument.
   const intptr_t args_pos = function_args.token_pos();
   ArgumentListNode* arguments = new ArgumentListNode(args_pos);
   arguments->Add(function_args.NodeAt(0));
   // The second argument is the invocation mirror.
   arguments->Add(BuildInvocationMirrorAllocation(
-      call_pos, function_name, function_args));
+      call_pos, function_name, function_args, temp_for_last_arg));
   return arguments;
 }
 
@@ -3736,7 +3763,6 @@
 void Parser::ParseTypeParameters(const Class& cls) {
   TRACE_PARSER("ParseTypeParameters");
   if (CurrentToken() == Token::kLT) {
-    Isolate* isolate = Isolate::Current();
     const GrowableObjectArray& type_parameters_array =
         GrowableObjectArray::Handle(GrowableObjectArray::New());
     intptr_t index = 0;
@@ -3767,7 +3793,7 @@
         // type parameters, as they are not fully parsed yet.
         type_parameter_bound = ParseType(ClassFinalizer::kDoNotResolve);
       } else {
-        type_parameter_bound = isolate->object_store()->object_type();
+        type_parameter_bound = isolate()->object_store()->object_type();
       }
       type_parameter = TypeParameter::New(cls,
                                           index,
@@ -3902,7 +3928,7 @@
     mixin_app_name = mixin_super_type.ClassName();
     mixin_app_name = String::Concat(mixin_app_name, Symbols::Ampersand());
     mixin_app_name = String::Concat(mixin_app_name,
-                                     String::Handle(mixin_type.ClassName()));
+                                    String::Handle(mixin_type.ClassName()));
     mixin_app_name = Symbols::New(mixin_app_name);
 
     mixin_application = Class::New(mixin_app_name, script_, mixin_pos);
@@ -4228,11 +4254,10 @@
 RawObject* Parser::CallLibraryTagHandler(Dart_LibraryTag tag,
                                           intptr_t token_pos,
                                           const String& url) {
-  Isolate* isolate = Isolate::Current();
-  Dart_LibraryTagHandler handler = isolate->library_tag_handler();
+  Dart_LibraryTagHandler handler = isolate()->library_tag_handler();
   if (handler == NULL) {
     if (url.StartsWith(Symbols::DartScheme())) {
-      if (tag == kCanonicalizeUrl) {
+      if (tag == Dart_kCanonicalizeUrl) {
         return url.raw();
       }
       return Object::null();
@@ -4240,8 +4265,8 @@
     ErrorMsg(token_pos, "no library handler registered");
   }
   Dart_Handle result = handler(tag,
-                               Api::NewHandle(isolate, library_.raw()),
-                               Api::NewHandle(isolate, url.raw()));
+                               Api::NewHandle(isolate(), library_.raw()),
+                               Api::NewHandle(isolate(), url.raw()));
   if (Dart_IsError(result)) {
     // In case of an error we append an explanatory error message to the
     // error obtained from the library tag handler.
@@ -4249,7 +4274,7 @@
     prev_error ^= Api::UnwrapHandle(result);
     AppendErrorMsg(prev_error, token_pos, "library handler failed");
   }
-  if (tag == kCanonicalizeUrl) {
+  if (tag == Dart_kCanonicalizeUrl) {
     if (!Dart_IsString(result)) {
       ErrorMsg(token_pos, "library handler failed URI canonicalization");
     }
@@ -4340,12 +4365,12 @@
 
   // Canonicalize library URL.
   const String& canon_url = String::CheckedHandle(
-      CallLibraryTagHandler(kCanonicalizeUrl, import_pos, url));
+      CallLibraryTagHandler(Dart_kCanonicalizeUrl, import_pos, url));
   // Lookup the library URL.
   Library& library = Library::Handle(Library::LookupLibrary(canon_url));
   if (library.IsNull()) {
     // Call the library tag handler to load the library.
-    CallLibraryTagHandler(kImportTag, import_pos, canon_url);
+    CallLibraryTagHandler(Dart_kImportTag, import_pos, canon_url);
     // If the library tag handler succeded without registering the
     // library we create an empty library to import.
     library = Library::LookupLibrary(canon_url);
@@ -4393,8 +4418,8 @@
   ConsumeToken();
   ExpectSemicolon();
   const String& canon_url = String::CheckedHandle(
-      CallLibraryTagHandler(kCanonicalizeUrl, source_pos, url));
-  CallLibraryTagHandler(kSourceTag, source_pos, canon_url);
+      CallLibraryTagHandler(Dart_kCanonicalizeUrl, source_pos, url));
+  CallLibraryTagHandler(Dart_kSourceTag, source_pos, canon_url);
 }
 
 
@@ -4435,7 +4460,7 @@
     Library& core_lib = Library::Handle(Library::CoreLibrary());
     ASSERT(!core_lib.IsNull());
     const Namespace& core_ns = Namespace::Handle(
-        Namespace::New(core_lib, Array::Handle(), Array::Handle()));
+        Namespace::New(core_lib, Array::null_object(), Array::null_object()));
     library_.AddImport(core_ns);
   }
   while (CurrentToken() == Token::kPART) {
@@ -4473,10 +4498,9 @@
   // Collect the classes found at the top level in this growable array.
   // They need to be registered with class finalization after parsing
   // has been completed.
-  Isolate* isolate = Isolate::Current();
-  ObjectStore* object_store = isolate->object_store();
+  ObjectStore* object_store = isolate()->object_store();
   const GrowableObjectArray& pending_classes =
-      GrowableObjectArray::Handle(isolate, object_store->pending_classes());
+      GrowableObjectArray::Handle(isolate(), object_store->pending_classes());
   SetPosition(0);
   is_top_level_ = true;
   TopLevel top_level;
@@ -4491,7 +4515,7 @@
   }
 
   while (true) {
-    set_current_class(Class::Handle());  // No current class.
+    set_current_class(Class::null_object());  // No current class.
     SkipMetadata();
     if (CurrentToken() == Token::kCLASS) {
       ParseClassDeclaration(pending_classes);
@@ -6214,7 +6238,6 @@
   // Finally parse the 'finally' block.
   SequenceNode* finally_block = NULL;
   if (CurrentToken() == Token::kFINALLY) {
-    current_function().set_is_optimizable(false);
     current_function().set_has_finally(true);
     ConsumeToken();  // Consume the 'finally'.
     const intptr_t finally_pos = TokenPos();
@@ -6554,7 +6577,7 @@
   const Error& error = Error::Handle(
       FormatError(script_, token_pos, "Error", format, args));
   va_end(args);
-  Isolate::Current()->long_jump_base()->Jump(1, error);
+  isolate()->long_jump_base()->Jump(1, error);
   UNREACHABLE();
 }
 
@@ -6565,13 +6588,13 @@
   const Error& error = Error::Handle(
       FormatError(script_, TokenPos(), "Error", format, args));
   va_end(args);
-  Isolate::Current()->long_jump_base()->Jump(1, error);
+  isolate()->long_jump_base()->Jump(1, error);
   UNREACHABLE();
 }
 
 
 void Parser::ErrorMsg(const Error& error) {
-  Isolate::Current()->long_jump_base()->Jump(1, error);
+  isolate()->long_jump_base()->Jump(1, error);
   UNREACHABLE();
 }
 
@@ -6583,7 +6606,7 @@
   const Error& error = Error::Handle(FormatErrorWithAppend(
       prev_error, script_, token_pos, "Error", format, args));
   va_end(args);
-  Isolate::Current()->long_jump_base()->Jump(1, error);
+  isolate()->long_jump_base()->Jump(1, error);
   UNREACHABLE();
 }
 
@@ -6596,7 +6619,7 @@
       FormatError(script_, token_pos, "Warning", format, args));
   va_end(args);
   if (FLAG_warning_as_error) {
-    Isolate::Current()->long_jump_base()->Jump(1, error);
+    isolate()->long_jump_base()->Jump(1, error);
     UNREACHABLE();
   } else {
     OS::Print("%s", error.ToErrorCString());
@@ -6612,7 +6635,7 @@
       FormatError(script_, TokenPos(), "Warning", format, args));
   va_end(args);
   if (FLAG_warning_as_error) {
-    Isolate::Current()->long_jump_base()->Jump(1, error);
+    isolate()->long_jump_base()->Jump(1, error);
     UNREACHABLE();
   } else {
     OS::Print("%s", error.ToErrorCString());
@@ -6881,21 +6904,9 @@
 }
 
 
-const LocalVariable* Parser::GetIncrementTempLocal() {
-  if (!parsed_function()->has_expression_temp_var()) {
-    LocalVariable* temp = ParsedFunction::CreateExpressionTempVar(
-        current_function().token_pos());
-    ASSERT(temp != NULL);
-    parsed_function()->set_expression_temp_var(temp);
-  }
-  ASSERT(parsed_function()->has_expression_temp_var());
-  return parsed_function()->expression_temp_var();
-}
-
-
 void Parser::EnsureExpressionTemp() {
   // Temporary used later by the flow_graph_builder.
-  GetIncrementTempLocal();
+  parsed_function()->EnsureExpressionTemp();
 }
 
 
@@ -8092,14 +8103,14 @@
           // generated AST is not deterministic. Therefore mark the function as
           // not optimizable.
           current_function().set_is_optimizable(false);
-          field.set_value(Instance::Handle());
+          field.set_value(Instance::null_object());
           // It is a compile-time error if evaluation of a compile-time constant
           // would raise an exception.
           AppendErrorMsg(error, TokenPos(),
                          "error initializing const field '%s'",
                          String::Handle(field.name()).ToCString());
         } else {
-          Isolate::Current()->long_jump_base()->Jump(1, error);
+          isolate()->long_jump_base()->Jump(1, error);
         }
       }
       ASSERT(const_value.IsNull() || const_value.IsInstance());
@@ -8162,7 +8173,7 @@
       if (result.IsUnhandledException()) {
         return result.raw();
       } else {
-        Isolate::Current()->long_jump_base()->Jump(1, Error::Cast(result));
+        isolate()->long_jump_base()->Jump(1, Error::Cast(result));
         UNREACHABLE();
         return Object::null();
       }
@@ -8182,7 +8193,6 @@
                                       const String &ident,
                                       AstNode** node) {
   TRACE_PARSER("ResolveIdentInLocalScope");
-  Isolate* isolate = Isolate::Current();
   // First try to find the identifier in the nested local scopes.
   LocalVariable* local = LookupLocalScope(ident);
   if (local != NULL) {
@@ -8199,14 +8209,14 @@
   // Try to find the identifier in the class scope of the current class.
   // If the current class is the result of a mixin application, we must
   // use the class scope of the class from which the function originates.
-  Class& cls = Class::Handle(isolate);
+  Class& cls = Class::Handle(isolate());
   if (current_class().mixin() == Type::null()) {
     cls = current_class().raw();
   } else {
     cls = parsed_function()->function().origin();
   }
-  Function& func = Function::Handle(isolate, Function::null());
-  Field& field = Field::Handle(isolate, Field::null());
+  Function& func = Function::Handle(isolate(), Function::null());
+  Field& field = Field::Handle(isolate(), Field::null());
 
   // First check if a field exists.
   field = cls.LookupField(ident);
@@ -8228,7 +8238,7 @@
       (func.IsDynamicFunction() || func.IsStaticFunction())) {
     if (node != NULL) {
       *node = new PrimaryNode(ident_pos,
-                              Function::ZoneHandle(isolate, func.raw()));
+                              Function::ZoneHandle(isolate(), func.raw()));
     }
     return true;
   }
@@ -8260,7 +8270,7 @@
         *node = new StaticGetterNode(ident_pos,
                                      receiver,
                                      false,
-                                     Class::ZoneHandle(isolate, cls.raw()),
+                                     Class::ZoneHandle(isolate(), cls.raw()),
                                      ident);
       }
       return true;
@@ -8288,7 +8298,7 @@
         *node = new StaticGetterNode(ident_pos,
                                      NULL,
                                      false,
-                                     Class::ZoneHandle(isolate, cls.raw()),
+                                     Class::ZoneHandle(isolate(), cls.raw()),
                                      ident);
       }
       return true;
@@ -8303,13 +8313,15 @@
 }
 
 
-static RawObject* LookupNameInLibrary(const Library& lib, const String& name) {
-  Object& obj = Object::Handle();
+static RawObject* LookupNameInLibrary(Isolate* isolate,
+                                      const Library& lib,
+                                      const String& name) {
+  Object& obj = Object::Handle(isolate);
   obj = lib.LookupLocalObject(name);
   if (!obj.IsNull()) {
     return obj.raw();
   }
-  String& accessor_name = String::Handle(Field::GetterName(name));
+  String& accessor_name = String::Handle(isolate, Field::GetterName(name));
   obj = lib.LookupLocalObject(accessor_name);
   if (!obj.IsNull()) {
     return obj.raw();
@@ -8320,8 +8332,10 @@
 }
 
 
-static RawObject* LookupNameInImport(const Namespace& ns, const String& name) {
-  Object& obj = Object::Handle();
+static RawObject* LookupNameInImport(Isolate* isolate,
+                                     const Namespace& ns,
+                                     const String& name) {
+  Object& obj = Object::Handle(isolate);
   obj = ns.Lookup(name);
   if (!obj.IsNull()) {
     return obj.raw();
@@ -8331,7 +8345,7 @@
   if (ns.HidesName(name)) {
     return Object::null();
   }
-  String& accessor_name = String::Handle(Field::GetterName(name));
+  String& accessor_name = String::Handle(isolate, Field::GetterName(name));
   obj = ns.Lookup(accessor_name);
   if (!obj.IsNull()) {
     return obj.raw();
@@ -8352,18 +8366,20 @@
                                                     const String& name,
                                                     Error* error) {
   TRACE_PARSER("ResolveNameInCurrentLibraryScope");
-  Object& obj = Object::Handle(LookupNameInLibrary(library_, name));
+  HANDLESCOPE(isolate());
+  Object& obj = Object::Handle(isolate(),
+                               LookupNameInLibrary(isolate(), library_, name));
   if (obj.IsNull()) {
     // Name is not found in current library. Check scope of all
     // imported libraries.
-    String& first_lib_url = String::Handle();
-    Namespace& import = Namespace::Handle();
+    String& first_lib_url = String::Handle(isolate());
+    Namespace& import = Namespace::Handle(isolate());
     intptr_t num_imports = library_.num_imports();
-    Object& imported_obj = Object::Handle();
-    Library& lib = Library::Handle();
+    Object& imported_obj = Object::Handle(isolate());
+    Library& lib = Library::Handle(isolate());
     for (int i = 0; i < num_imports; i++) {
       import = library_.ImportAt(i);
-      imported_obj = LookupNameInImport(import, name);
+      imported_obj = LookupNameInImport(isolate(), import, name);
       if (!imported_obj.IsNull()) {
         lib ^= import.library();
         if (!first_lib_url.IsNull()) {
@@ -8459,17 +8475,19 @@
                                             const String& name,
                                             Error* error) {
   TRACE_PARSER("ResolveNameInPrefixScope");
-  Namespace& import = Namespace::Handle();
-  String& first_lib_url = String::Handle();
-  Object& obj = Object::Handle();
-  Object& resolved_obj = Object::Handle();
-  const Array& imports = Array::Handle(prefix.imports());
+  HANDLESCOPE(isolate());
+  Namespace& import = Namespace::Handle(isolate());
+  String& first_lib_url = String::Handle(isolate());
+  Object& obj = Object::Handle(isolate());
+  Object& resolved_obj = Object::Handle(isolate());
+  const Array& imports = Array::Handle(isolate(), prefix.imports());
+  Library& lib = Library::Handle(isolate());
   for (intptr_t i = 0; i < prefix.num_imports(); i++) {
     import ^= imports.At(i);
-    resolved_obj = LookupNameInImport(import, name);
+    resolved_obj = LookupNameInImport(isolate(), import, name);
     if (!resolved_obj.IsNull()) {
       obj = resolved_obj.raw();
-      const Library& lib = Library::Handle(import.library());
+      lib = import.library();
       if (first_lib_url.IsNull()) {
         first_lib_url = lib.url();
       } else {
@@ -8650,10 +8668,10 @@
                type_name.ident->ToCString());
     }
   }
-  Object& type_class = Object::Handle();
+  Object& type_class = Object::Handle(isolate());
   // Leave type_class as null if type finalization mode is kIgnore.
   if (finalization != ClassFinalizer::kIgnore) {
-    LibraryPrefix& lib_prefix = LibraryPrefix::Handle();
+    LibraryPrefix& lib_prefix = LibraryPrefix::Handle(isolate());
     if (type_name.lib_prefix != NULL) {
       lib_prefix = type_name.lib_prefix->raw();
     }
@@ -8661,22 +8679,26 @@
                                       *type_name.ident,
                                       type_name.ident_pos);
   }
-  Error& malformed_error = Error::Handle();
+  Error& malformed_error = Error::Handle(isolate());
   AbstractTypeArguments& type_arguments =
-      AbstractTypeArguments::Handle(ParseTypeArguments(&malformed_error,
+      AbstractTypeArguments::Handle(isolate(),
+                                    ParseTypeArguments(&malformed_error,
                                                        finalization));
   if (finalization == ClassFinalizer::kIgnore) {
     return Type::DynamicType();
   }
   AbstractType& type = AbstractType::Handle(
+      isolate(),
       Type::New(type_class, type_arguments, type_name.ident_pos));
   // In production mode, malformed type arguments are mapped to dynamic.
   // In checked mode, a type with malformed type arguments is malformed.
   if (FLAG_enable_type_checks && !malformed_error.IsNull()) {
-    Type& parameterized_type = Type::Handle();
+    Type& parameterized_type = Type::Handle(isolate());
     parameterized_type ^= type.raw();
-    parameterized_type.set_type_class(Class::Handle(Object::dynamic_class()));
-    parameterized_type.set_arguments(AbstractTypeArguments::Handle());
+    parameterized_type.set_type_class(
+        Class::Handle(isolate(), Object::dynamic_class()));
+    parameterized_type.set_arguments(
+        AbstractTypeArguments::null_object());
     parameterized_type.set_malformed_error(malformed_error);
   }
   if (finalization >= ClassFinalizer::kTryResolve) {
@@ -8739,7 +8761,7 @@
   }
   ASSERT(type_arguments.IsNull() || (type_arguments.Length() == 1));
   const Class& array_class = Class::Handle(
-      Isolate::Current()->object_store()->array_class());
+      isolate()->object_store()->array_class());
   Type& type = Type::ZoneHandle(
       Type::New(array_class, type_arguments, type_pos));
   type ^= ClassFinalizer::FinalizeType(
@@ -9664,7 +9686,7 @@
     Object& result = Object::Handle(Compiler::ExecuteOnce(seq));
     if (result.IsError()) {
       // Propagate the compilation error.
-      Isolate::Current()->long_jump_base()->Jump(1, Error::Cast(result));
+      isolate()->long_jump_base()->Jump(1, Error::Cast(result));
       UNREACHABLE();
     }
     ASSERT(result.IsInstance());
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index e7431a1..f78b9f2 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -17,6 +17,8 @@
 
 // Forward declarations.
 class Function;
+class Isolate;
+class LiteralToken;
 class Script;
 class TokenStream;
 
@@ -100,6 +102,7 @@
     return expression_temp_var_ != NULL;
   }
   static LocalVariable* CreateExpressionTempVar(intptr_t token_pos);
+  LocalVariable* EnsureExpressionTemp();
 
   int first_parameter_index() const { return first_parameter_index_; }
   int first_stack_local_index() const { return first_stack_local_index_; }
@@ -167,6 +170,8 @@
                                          va_list args);
 
  private:
+  friend class EffectGraphVisitor;  // For BuildNoSuchMethodArguments.
+
   struct Block;
   class TryBlocks;
 
@@ -384,14 +389,18 @@
   String& ParseNativeDeclaration();
   void ParseInterfaceList(const Class& cls);
   RawAbstractType* ParseMixins(const AbstractType& super_type);
-  StaticCallNode* BuildInvocationMirrorAllocation(
+  static StaticCallNode* BuildInvocationMirrorAllocation(
       intptr_t call_pos,
       const String& function_name,
-      const ArgumentListNode& function_args);
-  ArgumentListNode* BuildNoSuchMethodArguments(
+      const ArgumentListNode& function_args,
+      const LocalVariable* temp = NULL);
+  // Build arguments for a NoSuchMethodCall. If LocalVariable temp is not NULL,
+  // the last argument is stored in temp.
+  static ArgumentListNode* BuildNoSuchMethodArguments(
       intptr_t call_pos,
       const String& function_name,
-      const ArgumentListNode& function_args);
+      const ArgumentListNode& function_args,
+      const LocalVariable* temp = NULL);
   RawFunction* GetSuperFunction(intptr_t token_pos,
                                 const String& name,
                                 ArgumentListNode* arguments,
@@ -609,7 +618,6 @@
 
   void CheckOperatorArity(const MemberDesc& member);
 
-  const LocalVariable* GetIncrementTempLocal();
   void EnsureExpressionTemp();
   void EnsureSavedCurrentContext();
   AstNode* CreateAssignmentNode(AstNode* original, AstNode* rhs);
@@ -621,6 +629,10 @@
       const Function& constructor,
       ArgumentListNode* arguments);
 
+  Isolate* isolate() const { return isolate_; }
+
+  Isolate* isolate_;  // Cached current isolate.
+
   Script& script_;
   TokenStream::Iterator tokens_iterator_;
   Token::Kind token_kind_;  // Cached token kind for current token.
@@ -645,6 +657,9 @@
   // The function currently being parsed.
   Function& innermost_function_;
 
+  // Current literal token.
+  LiteralToken& literal_token_;
+
   // The class currently being parsed, or the owner class of the
   // function currently being parsed. It is used for primary identifier lookups.
   Class& current_class_;
diff --git a/runtime/vm/runtime_entry.h b/runtime/vm/runtime_entry.h
index 54dd286..8c1b8a2 100644
--- a/runtime/vm/runtime_entry.h
+++ b/runtime/vm/runtime_entry.h
@@ -24,6 +24,8 @@
  public:
   RuntimeEntry(const char* name, RuntimeFunction function,
                int argument_count, bool is_leaf)
+  // TODO(regis): In order to simulate leaf runtime calls taking floating point
+  // arguments, we need to add an 'is_float' flag.
       : name_(name),
         function_(function),
         argument_count_(argument_count),
diff --git a/runtime/vm/simulator_arm.cc b/runtime/vm/simulator_arm.cc
index 14442b8..cea3b8d 100644
--- a/runtime/vm/simulator_arm.cc
+++ b/runtime/vm/simulator_arm.cc
@@ -1494,12 +1494,13 @@
         set_register(R3, icount_);
         set_register(IP, icount_);
         set_register(LR, icount_);
-        float zap_fvalue = static_cast<float>(icount_);
-        for (int i = S0; i <= S15; i++) {
-          set_sregister(static_cast<SRegister>(i), zap_fvalue);
-        }
-#ifdef VFPv3_D32
         double zap_dvalue = static_cast<double>(icount_);
+        for (int i = D0; i <= D7; i++) {
+          set_dregister(static_cast<DRegister>(i), zap_dvalue);
+        }
+        // The above loop also zaps overlapping registers S0-S15.
+        // Registers D8-D15 (overlapping with S16-S31) are preserved.
+#ifdef VFPv3_D32
         for (int i = D16; i <= D31; i++) {
           set_dregister(static_cast<DRegister>(i), zap_dvalue);
         }
diff --git a/runtime/vm/simulator_arm.h b/runtime/vm/simulator_arm.h
index c819d1c..0fc5223 100644
--- a/runtime/vm/simulator_arm.h
+++ b/runtime/vm/simulator_arm.h
@@ -84,6 +84,9 @@
     kLeafRuntimeCall,
     kNativeCall
   };
+  // TODO(regis): In order to simulate leaf runtime calls taking floating point
+  // arguments, we need to add a 'kLeafFloatRuntimeCall' CallKind and pass the
+  // number of arguments.
   static uword RedirectExternalReference(uword function, CallKind call_kind);
 
   void Longjmp(uword pc,
diff --git a/runtime/vm/simulator_mips.cc b/runtime/vm/simulator_mips.cc
index 0da94b0..1d930b2 100644
--- a/runtime/vm/simulator_mips.cc
+++ b/runtime/vm/simulator_mips.cc
@@ -1067,7 +1067,6 @@
         // TODO(zra): Drop into the debugger here.
         break;
       }
-
       set_lo_register(rs_val / rt_val);
       set_hi_register(rs_val % rt_val);
       break;
@@ -1130,6 +1129,22 @@
       }
       break;
     }
+    case MTHI: {
+      ASSERT(instr->RtField() == 0);
+      ASSERT(instr->RdField() == 0);
+      ASSERT(instr->SaField() == 0);
+      // Format(instr, "mthi 'rd");
+      set_hi_register(get_register(instr->RsField()));
+      break;
+    }
+    case MTLO: {
+      ASSERT(instr->RtField() == 0);
+      ASSERT(instr->RdField() == 0);
+      ASSERT(instr->SaField() == 0);
+      // Format(instr, "mflo 'rd");
+      set_lo_register(get_register(instr->RsField()));
+      break;
+    }
     case MULT: {
       ASSERT(instr->RdField() == 0);
       ASSERT(instr->SaField() == 0);
@@ -1266,6 +1281,34 @@
 void Simulator::DecodeSpecial2(Instr* instr) {
   ASSERT(instr->OpcodeField() == SPECIAL2);
   switch (instr->FunctionField()) {
+    case MADD: {
+      ASSERT(instr->RdField() == 0);
+      ASSERT(instr->SaField() == 0);
+      // Format(instr, "madd 'rs, 'rt");
+      uint32_t lo = get_lo_register();
+      int32_t hi = get_hi_register();
+      int64_t accum = Utils::LowHighTo64Bits(lo, hi);
+      int64_t rs = static_cast<int64_t>(get_register(instr->RsField()));
+      int64_t rt = static_cast<int64_t>(get_register(instr->RtField()));
+      int64_t res = accum + rs * rt;
+      set_hi_register(Utils::High32Bits(res));
+      set_lo_register(Utils::Low32Bits(res));
+      break;
+    }
+    case MADDU: {
+      ASSERT(instr->RdField() == 0);
+      ASSERT(instr->SaField() == 0);
+      // Format(instr, "maddu 'rs, 'rt");
+      uint32_t lo = get_lo_register();
+      uint32_t hi = get_hi_register();
+      uint64_t accum = Utils::LowHighTo64Bits(lo, hi);
+      uint64_t rs = static_cast<int64_t>(get_register(instr->RsField()));
+      uint64_t rt = static_cast<int64_t>(get_register(instr->RtField()));
+      uint64_t res = accum + rs * rt;
+      set_hi_register(Utils::High32Bits(res));
+      set_lo_register(Utils::Low32Bits(res));
+      break;
+    }
     case CLO: {
       ASSERT(instr->SaField() == 0);
       ASSERT(instr->RtField() == instr->RdField());
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index 8476450..d0d3365 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -65,33 +65,33 @@
 // whether the graphs are equal or not.
 static void CompareDartCObjects(Dart_CObject* first, Dart_CObject* second) {
   // Return immediately if entering a cycle.
-  if (second->type == Dart_CObject::kNumberOfTypes) return;
+  if (second->type == Dart_CObject_kNumberOfTypes) return;
 
   EXPECT_NE(first, second);
   EXPECT_EQ(first->type, second->type);
   switch (first->type) {
-    case Dart_CObject::kNull:
+    case Dart_CObject_kNull:
       // Nothing more to compare.
       break;
-    case Dart_CObject::kBool:
+    case Dart_CObject_kBool:
       EXPECT_EQ(first->value.as_bool, second->value.as_bool);
       break;
-    case Dart_CObject::kInt32:
+    case Dart_CObject_kInt32:
       EXPECT_EQ(first->value.as_int32, second->value.as_int32);
       break;
-    case Dart_CObject::kInt64:
+    case Dart_CObject_kInt64:
       EXPECT_EQ(first->value.as_int64, second->value.as_int64);
       break;
-    case Dart_CObject::kBigint:
+    case Dart_CObject_kBigint:
       EXPECT_STREQ(first->value.as_bigint, second->value.as_bigint);
       break;
-    case Dart_CObject::kDouble:
+    case Dart_CObject_kDouble:
       EXPECT_EQ(first->value.as_double, second->value.as_double);
       break;
-    case Dart_CObject::kString:
+    case Dart_CObject_kString:
       EXPECT_STREQ(first->value.as_string, second->value.as_string);
       break;
-    case Dart_CObject::kTypedData:
+    case Dart_CObject_kTypedData:
       EXPECT_EQ(first->value.as_typed_data.length,
                 second->value.as_typed_data.length);
       for (int i = 0; i < first->value.as_typed_data.length; i++) {
@@ -99,10 +99,10 @@
                   second->value.as_typed_data.values[i]);
       }
       break;
-    case Dart_CObject::kArray:
+    case Dart_CObject_kArray:
       // Use invalid type as a visited marker to avoid infinite
       // recursion on graphs with cycles.
-      second->type = Dart_CObject::kNumberOfTypes;
+      second->type = Dart_CObject_kNumberOfTypes;
       EXPECT_EQ(first->value.as_array.length, second->value.as_array.length);
       for (int i = 0; i < first->value.as_array.length; i++) {
         CompareDartCObjects(first->value.as_array.values[i],
@@ -149,7 +149,7 @@
   ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
   Dart_CObject* root = api_reader.ReadMessage();
   EXPECT_NOTNULL(root);
-  EXPECT_EQ(Dart_CObject::kNull, root->type);
+  EXPECT_EQ(Dart_CObject_kNull, root->type);
   CheckEncodeDecodeMessage(root);
 }
 
@@ -175,7 +175,7 @@
   ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
   Dart_CObject* root = api_reader.ReadMessage();
   EXPECT_NOTNULL(root);
-  EXPECT_EQ(Dart_CObject::kInt32, root->type);
+  EXPECT_EQ(Dart_CObject_kInt32, root->type);
   EXPECT_EQ(smi.Value(), root->value.as_int32);
   CheckEncodeDecodeMessage(root);
 }
@@ -202,7 +202,7 @@
   ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
   Dart_CObject* root = api_reader.ReadMessage();
   EXPECT_NOTNULL(root);
-  EXPECT_EQ(Dart_CObject::kInt32, root->type);
+  EXPECT_EQ(Dart_CObject_kInt32, root->type);
   EXPECT_EQ(smi.Value(), root->value.as_int32);
   CheckEncodeDecodeMessage(root);
 }
@@ -242,14 +242,14 @@
   // range covers most of the 32-bit range and values outside that
   // range are also represented as mints.
 #if defined(ARCH_IS_64_BIT)
-  EXPECT_EQ(Dart_CObject::kInt64, mint_cobject->type);
+  EXPECT_EQ(Dart_CObject_kInt64, mint_cobject->type);
   EXPECT_EQ(value, mint_cobject->value.as_int64);
 #else
   if (kMinInt32 < value && value < kMaxInt32) {
-    EXPECT_EQ(Dart_CObject::kInt32, mint_cobject->type);
+    EXPECT_EQ(Dart_CObject_kInt32, mint_cobject->type);
     EXPECT_EQ(value, mint_cobject->value.as_int32);
   } else {
-    EXPECT_EQ(Dart_CObject::kInt64, mint_cobject->type);
+    EXPECT_EQ(Dart_CObject_kInt64, mint_cobject->type);
     EXPECT_EQ(value, mint_cobject->value.as_int64);
   }
 #endif
@@ -297,7 +297,7 @@
   ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
   Dart_CObject* root = api_reader.ReadMessage();
   EXPECT_NOTNULL(root);
-  EXPECT_EQ(Dart_CObject::kDouble, root->type);
+  EXPECT_EQ(Dart_CObject_kDouble, root->type);
   EXPECT_EQ(dbl.value(), root->value.as_double);
   CheckEncodeDecodeMessage(root);
 }
@@ -326,7 +326,7 @@
   ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
   Dart_CObject* root = api_reader.ReadMessage();
   EXPECT_NOTNULL(root);
-  EXPECT_EQ(Dart_CObject::kBool, root->type);
+  EXPECT_EQ(Dart_CObject_kBool, root->type);
   EXPECT_EQ(true, root->value.as_bool);
   CheckEncodeDecodeMessage(root);
 }
@@ -353,7 +353,7 @@
   ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
   Dart_CObject* root = api_reader.ReadMessage();
   EXPECT_NOTNULL(root);
-  EXPECT_EQ(Dart_CObject::kBool, root->type);
+  EXPECT_EQ(Dart_CObject_kBool, root->type);
   EXPECT_EQ(false, root->value.as_bool);
   CheckEncodeDecodeMessage(root);
 }
@@ -392,7 +392,7 @@
   Dart_CObject* root = api_reader.ReadMessage();
   // Bigint not supported.
   EXPECT_NOTNULL(root);
-  EXPECT_EQ(Dart_CObject::kBigint, root->type);
+  EXPECT_EQ(Dart_CObject_kBigint, root->type);
   EXPECT_STREQ("270FFFFFFFFFFFFFD8F0", root->value.as_bigint);
   CheckEncodeDecodeMessage(root);
 }
@@ -434,7 +434,7 @@
   Bigint& bigint = Bigint::Handle();
   bigint ^= BigintOperations::NewFromCString(bigint_value);
   Dart_CObject* bigint_cobject = SerializeAndDeserializeBigint(bigint);
-  EXPECT_EQ(Dart_CObject::kBigint, bigint_cobject->type);
+  EXPECT_EQ(Dart_CObject_kBigint, bigint_cobject->type);
   if (bigint_value[0] == '0') {
     EXPECT_STREQ(bigint_value + 2, bigint_cobject->value.as_bigint);
   } else {
@@ -520,7 +520,7 @@
   ApiNativeScope scope;
   ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
   Dart_CObject* root = api_reader.ReadMessage();
-  EXPECT_EQ(Dart_CObject::kString, root->type);
+  EXPECT_EQ(Dart_CObject_kString, root->type);
   EXPECT_STREQ(cstr, root->value.as_string);
   CheckEncodeDecodeMessage(root);
 }
@@ -568,11 +568,11 @@
   ApiNativeScope scope;
   ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
   Dart_CObject* root = api_reader.ReadMessage();
-  EXPECT_EQ(Dart_CObject::kArray, root->type);
+  EXPECT_EQ(Dart_CObject_kArray, root->type);
   EXPECT_EQ(kArrayLength, root->value.as_array.length);
   for (int i = 0; i < kArrayLength; i++) {
     Dart_CObject* element = root->value.as_array.values[i];
-    EXPECT_EQ(Dart_CObject::kInt32, element->type);
+    EXPECT_EQ(Dart_CObject_kInt32, element->type);
     EXPECT_EQ(i, element->value.as_int32);
   }
   CheckEncodeDecodeMessage(root);
@@ -601,7 +601,7 @@
   ApiNativeScope scope;
   ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
   Dart_CObject* root = api_reader.ReadMessage();
-  EXPECT_EQ(Dart_CObject::kArray, root->type);
+  EXPECT_EQ(Dart_CObject_kArray, root->type);
   EXPECT_EQ(kArrayLength, root->value.as_array.length);
   EXPECT(root->value.as_array.values == NULL);
   CheckEncodeDecodeMessage(root);
@@ -634,7 +634,7 @@
   ApiNativeScope scope;
   ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
   Dart_CObject* root = api_reader.ReadMessage();
-  EXPECT_EQ(Dart_CObject::kTypedData, root->type);
+  EXPECT_EQ(Dart_CObject_kTypedData, root->type);
   EXPECT_EQ(kTypedDataLength, root->value.as_typed_data.length);
   for (int i = 0; i < kTypedDataLength; i++) {
     EXPECT(root->value.as_typed_data.values[i] == i);
@@ -743,8 +743,8 @@
   ApiNativeScope scope;
   ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
   Dart_CObject* root = api_reader.ReadMessage();
-  EXPECT_EQ(Dart_CObject::kTypedData, root->type);
-  EXPECT_EQ(Dart_CObject::kUint8Array, root->value.as_typed_data.type);
+  EXPECT_EQ(Dart_CObject_kTypedData, root->type);
+  EXPECT_EQ(Dart_TypedData_kUint8, root->value.as_typed_data.type);
   EXPECT_EQ(kTypedDataLength, root->value.as_typed_data.length);
   EXPECT(root->value.as_typed_data.values == NULL);
   CheckEncodeDecodeMessage(root);
@@ -920,7 +920,7 @@
       "}\n"
       "class Expect {\n"
       "  static void equals(x, y) {\n"
-      "    if (x != y) throw new RuntimeError('not equal');\n"
+      "    if (x != y) throw new ArgumentError('not equal');\n"
       "  }\n"
       "}\n"
       "class FieldsTest {\n"
@@ -1239,11 +1239,11 @@
   ApiNativeScope scope;
   ApiMessageReader api_reader(buffer, writer.BytesWritten(), &zone_allocator);
   Dart_CObject* root = api_reader.ReadMessage();
-  EXPECT_EQ(Dart_CObject::kArray, root->type);
+  EXPECT_EQ(Dart_CObject_kArray, root->type);
   EXPECT_EQ(kArrayLength, root->value.as_array.length);
   for (int i = 0; i < kArrayLength; i++) {
     Dart_CObject* element = root->value.as_array.values[i];
-    EXPECT_EQ(Dart_CObject::kInt32, element->type);
+    EXPECT_EQ(Dart_CObject_kInt32, element->type);
     EXPECT_EQ(i + 1, element->value.as_int32);
   }
   CheckEncodeDecodeMessage(root);
@@ -1285,7 +1285,7 @@
   ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
   Dart_CObject* root = api_reader.ReadMessage();
   EXPECT_NOTNULL(root);
-  EXPECT_EQ(Dart_CObject::kString, root->type);
+  EXPECT_EQ(Dart_CObject_kString, root->type);
   EXPECT_STREQ(expected, root->value.as_string);
   CheckEncodeDecodeMessage(root);
 }
@@ -1305,7 +1305,7 @@
   ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
   Dart_CObject* root = api_reader.ReadMessage();
   EXPECT_NOTNULL(root);
-  EXPECT_EQ(Dart_CObject::kUnsupported, root->type);
+  EXPECT_EQ(Dart_CObject_kUnsupported, root->type);
 }
 
 
@@ -1415,7 +1415,7 @@
       ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
       Dart_CObject* root = api_reader.ReadMessage();
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kInt32, root->type);
+      EXPECT_EQ(Dart_CObject_kInt32, root->type);
       EXPECT_EQ(42, root->value.as_int32);
       CheckEncodeDecodeMessage(root);
     }
@@ -1433,7 +1433,7 @@
       ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
       Dart_CObject* root = api_reader.ReadMessage();
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kBigint, root->type);
+      EXPECT_EQ(Dart_CObject_kBigint, root->type);
       EXPECT_STREQ("-424242424242424242424242424242424242",
                    root->value.as_bigint);
       CheckEncodeDecodeMessage(root);
@@ -1496,10 +1496,10 @@
       ApiNativeScope scope;
       Dart_CObject* root = GetDeserializedDartMessage(lib, "getList");
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
       for (int i = 0; i < kArrayLength; i++) {
-        EXPECT_EQ(Dart_CObject::kNull, root->value.as_array.values[i]->type);
+        EXPECT_EQ(Dart_CObject_kNull, root->value.as_array.values[i]->type);
       }
       CheckEncodeDecodeMessage(root);
     }
@@ -1508,10 +1508,10 @@
       ApiNativeScope scope;
       Dart_CObject* root = GetDeserializedDartMessage(lib, "getIntList");
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
       for (int i = 0; i < kArrayLength; i++) {
-        EXPECT_EQ(Dart_CObject::kInt32, root->value.as_array.values[i]->type);
+        EXPECT_EQ(Dart_CObject_kInt32, root->value.as_array.values[i]->type);
         EXPECT_EQ(i, root->value.as_array.values[i]->value.as_int32);
       }
       CheckEncodeDecodeMessage(root);
@@ -1521,10 +1521,10 @@
       ApiNativeScope scope;
       Dart_CObject* root = GetDeserializedDartMessage(lib, "getStringList");
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
       for (int i = 0; i < kArrayLength; i++) {
-        EXPECT_EQ(Dart_CObject::kString, root->value.as_array.values[i]->type);
+        EXPECT_EQ(Dart_CObject_kString, root->value.as_array.values[i]->type);
         char buffer[3];
         snprintf(buffer, sizeof(buffer), "%d", i);
         EXPECT_STREQ(buffer, root->value.as_array.values[i]->value.as_string);
@@ -1535,21 +1535,21 @@
       ApiNativeScope scope;
       Dart_CObject* root = GetDeserializedDartMessage(lib, "getMixedList");
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
 
-      EXPECT_EQ(Dart_CObject::kInt32, root->value.as_array.values[0]->type);
+      EXPECT_EQ(Dart_CObject_kInt32, root->value.as_array.values[0]->type);
       EXPECT_EQ(0, root->value.as_array.values[0]->value.as_int32);
-      EXPECT_EQ(Dart_CObject::kString, root->value.as_array.values[1]->type);
+      EXPECT_EQ(Dart_CObject_kString, root->value.as_array.values[1]->type);
       EXPECT_STREQ("1", root->value.as_array.values[1]->value.as_string);
-      EXPECT_EQ(Dart_CObject::kDouble, root->value.as_array.values[2]->type);
+      EXPECT_EQ(Dart_CObject_kDouble, root->value.as_array.values[2]->type);
       EXPECT_EQ(2.2, root->value.as_array.values[2]->value.as_double);
-      EXPECT_EQ(Dart_CObject::kBool, root->value.as_array.values[3]->type);
+      EXPECT_EQ(Dart_CObject_kBool, root->value.as_array.values[3]->type);
       EXPECT_EQ(true, root->value.as_array.values[3]->value.as_bool);
 
       for (int i = 0; i < kArrayLength; i++) {
         if (i > 3) {
-          EXPECT_EQ(Dart_CObject::kNull, root->value.as_array.values[i]->type);
+          EXPECT_EQ(Dart_CObject_kNull, root->value.as_array.values[i]->type);
         }
       }
     }
@@ -1614,10 +1614,10 @@
       ApiNativeScope scope;
       Dart_CObject* root = GetDeserializedDartMessage(lib, "getList");
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
       for (int i = 0; i < kArrayLength; i++) {
-        EXPECT_EQ(Dart_CObject::kNull, root->value.as_array.values[i]->type);
+        EXPECT_EQ(Dart_CObject_kNull, root->value.as_array.values[i]->type);
       }
       CheckEncodeDecodeMessage(root);
     }
@@ -1626,10 +1626,10 @@
       ApiNativeScope scope;
       Dart_CObject* root = GetDeserializedDartMessage(lib, "getIntList");
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
       for (int i = 0; i < kArrayLength; i++) {
-        EXPECT_EQ(Dart_CObject::kInt32, root->value.as_array.values[i]->type);
+        EXPECT_EQ(Dart_CObject_kInt32, root->value.as_array.values[i]->type);
         EXPECT_EQ(i, root->value.as_array.values[i]->value.as_int32);
       }
       CheckEncodeDecodeMessage(root);
@@ -1639,10 +1639,10 @@
       ApiNativeScope scope;
       Dart_CObject* root = GetDeserializedDartMessage(lib, "getStringList");
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
       for (int i = 0; i < kArrayLength; i++) {
-        EXPECT_EQ(Dart_CObject::kString, root->value.as_array.values[i]->type);
+        EXPECT_EQ(Dart_CObject_kString, root->value.as_array.values[i]->type);
         char buffer[3];
         snprintf(buffer, sizeof(buffer), "%d", i);
         EXPECT_STREQ(buffer, root->value.as_array.values[i]->value.as_string);
@@ -1653,14 +1653,14 @@
       ApiNativeScope scope;
       Dart_CObject* root = GetDeserializedDartMessage(lib, "getListList");
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
       for (int i = 0; i < kArrayLength; i++) {
         Dart_CObject* element = root->value.as_array.values[i];
-        EXPECT_EQ(Dart_CObject::kArray, element->type);
+        EXPECT_EQ(Dart_CObject_kArray, element->type);
         EXPECT_EQ(i, element->value.as_array.length);
         for (int j = 0; j < i; j++) {
-          EXPECT_EQ(Dart_CObject::kInt32,
+          EXPECT_EQ(Dart_CObject_kInt32,
                     element->value.as_array.values[j]->type);
           EXPECT_EQ(j, element->value.as_array.values[j]->value.as_int32);
         }
@@ -1671,21 +1671,21 @@
       ApiNativeScope scope;
       Dart_CObject* root = GetDeserializedDartMessage(lib, "getMixedList");
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
 
-      EXPECT_EQ(Dart_CObject::kInt32, root->value.as_array.values[0]->type);
+      EXPECT_EQ(Dart_CObject_kInt32, root->value.as_array.values[0]->type);
       EXPECT_EQ(0, root->value.as_array.values[0]->value.as_int32);
-      EXPECT_EQ(Dart_CObject::kString, root->value.as_array.values[1]->type);
+      EXPECT_EQ(Dart_CObject_kString, root->value.as_array.values[1]->type);
       EXPECT_STREQ("1", root->value.as_array.values[1]->value.as_string);
-      EXPECT_EQ(Dart_CObject::kDouble, root->value.as_array.values[2]->type);
+      EXPECT_EQ(Dart_CObject_kDouble, root->value.as_array.values[2]->type);
       EXPECT_EQ(2.2, root->value.as_array.values[2]->value.as_double);
-      EXPECT_EQ(Dart_CObject::kBool, root->value.as_array.values[3]->type);
+      EXPECT_EQ(Dart_CObject_kBool, root->value.as_array.values[3]->type);
       EXPECT_EQ(true, root->value.as_array.values[3]->value.as_bool);
 
       for (int i = 0; i < kArrayLength; i++) {
         if (i > 3) {
-          EXPECT_EQ(Dart_CObject::kArray, root->value.as_array.values[i]->type);
+          EXPECT_EQ(Dart_CObject_kArray, root->value.as_array.values[i]->type);
         }
       }
 
@@ -1700,60 +1700,60 @@
       element = root->value.as_array.values[5];
       EXPECT_EQ(1, element->value.as_array.length);
       element = element->value.as_array.values[0];
-      EXPECT_EQ(Dart_CObject::kArray, element->type);
+      EXPECT_EQ(Dart_CObject_kArray, element->type);
       EXPECT_EQ(0, element->value.as_array.length);
 
       // [[[]]]"
       element = root->value.as_array.values[6];
       EXPECT_EQ(1, element->value.as_array.length);
       element = element->value.as_array.values[0];
-      EXPECT_EQ(Dart_CObject::kArray, element->type);
+      EXPECT_EQ(Dart_CObject_kArray, element->type);
       EXPECT_EQ(1, element->value.as_array.length);
       element = element->value.as_array.values[0];
-      EXPECT_EQ(Dart_CObject::kArray, element->type);
+      EXPECT_EQ(Dart_CObject_kArray, element->type);
       EXPECT_EQ(0, element->value.as_array.length);
 
       // [1, [2, [3]]]
       element = root->value.as_array.values[7];
       EXPECT_EQ(2, element->value.as_array.length);
       e = element->value.as_array.values[0];
-      EXPECT_EQ(Dart_CObject::kInt32, e->type);
+      EXPECT_EQ(Dart_CObject_kInt32, e->type);
       EXPECT_EQ(1, e->value.as_int32);
       element = element->value.as_array.values[1];
-      EXPECT_EQ(Dart_CObject::kArray, element->type);
+      EXPECT_EQ(Dart_CObject_kArray, element->type);
       EXPECT_EQ(2, element->value.as_array.length);
       e = element->value.as_array.values[0];
-      EXPECT_EQ(Dart_CObject::kInt32, e->type);
+      EXPECT_EQ(Dart_CObject_kInt32, e->type);
       EXPECT_EQ(2, e->value.as_int32);
       element = element->value.as_array.values[1];
-      EXPECT_EQ(Dart_CObject::kArray, element->type);
+      EXPECT_EQ(Dart_CObject_kArray, element->type);
       EXPECT_EQ(1, element->value.as_array.length);
       e = element->value.as_array.values[0];
-      EXPECT_EQ(Dart_CObject::kInt32, e->type);
+      EXPECT_EQ(Dart_CObject_kInt32, e->type);
       EXPECT_EQ(3, e->value.as_int32);
 
       // [1, [1, 2, [1, 2, 3]]]
       element = root->value.as_array.values[8];
       EXPECT_EQ(2, element->value.as_array.length);
       e = element->value.as_array.values[0];
-      EXPECT_EQ(Dart_CObject::kInt32, e->type);
+      EXPECT_EQ(Dart_CObject_kInt32, e->type);
       e = element->value.as_array.values[0];
-      EXPECT_EQ(Dart_CObject::kInt32, e->type);
+      EXPECT_EQ(Dart_CObject_kInt32, e->type);
       EXPECT_EQ(1, e->value.as_int32);
       element = element->value.as_array.values[1];
-      EXPECT_EQ(Dart_CObject::kArray, element->type);
+      EXPECT_EQ(Dart_CObject_kArray, element->type);
       EXPECT_EQ(3, element->value.as_array.length);
       for (int i = 0; i < 2; i++) {
         e = element->value.as_array.values[i];
-        EXPECT_EQ(Dart_CObject::kInt32, e->type);
+        EXPECT_EQ(Dart_CObject_kInt32, e->type);
         EXPECT_EQ(i + 1, e->value.as_int32);
       }
       element = element->value.as_array.values[2];
-      EXPECT_EQ(Dart_CObject::kArray, element->type);
+      EXPECT_EQ(Dart_CObject_kArray, element->type);
       EXPECT_EQ(3, element->value.as_array.length);
       for (int i = 0; i < 3; i++) {
         e = element->value.as_array.values[i];
-        EXPECT_EQ(Dart_CObject::kInt32, e->type);
+        EXPECT_EQ(Dart_CObject_kInt32, e->type);
         EXPECT_EQ(i + 1, e->value.as_int32);
       }
 
@@ -1762,7 +1762,7 @@
       EXPECT_EQ(3, element->value.as_array.length);
       for (int i = 0; i < 3; i++) {
         e = element->value.as_array.values[i];
-        EXPECT_EQ(Dart_CObject::kInt32, e->type);
+        EXPECT_EQ(Dart_CObject_kInt32, e->type);
         EXPECT_EQ(i + 1, e->value.as_int32);
       }
     }
@@ -1847,12 +1847,12 @@
       ApiNativeScope scope;
       Dart_CObject* root = GetDeserializedDartMessage(lib, "getStringList");
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
       for (int i = 0; i < kArrayLength; i++) {
         Dart_CObject* element = root->value.as_array.values[i];
         EXPECT_EQ(root->value.as_array.values[0], element);
-        EXPECT_EQ(Dart_CObject::kString, element->type);
+        EXPECT_EQ(Dart_CObject_kString, element->type);
         EXPECT_STREQ("Hello, world!", element->value.as_string);
       }
     }
@@ -1861,12 +1861,12 @@
       ApiNativeScope scope;
       Dart_CObject* root = GetDeserializedDartMessage(lib, "getMintList");
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
       for (int i = 0; i < kArrayLength; i++) {
         Dart_CObject* element = root->value.as_array.values[i];
         EXPECT_EQ(root->value.as_array.values[0], element);
-        EXPECT_EQ(Dart_CObject::kInt64, element->type);
+        EXPECT_EQ(Dart_CObject_kInt64, element->type);
         EXPECT_EQ(DART_INT64_C(0x7FFFFFFFFFFFFFFF), element->value.as_int64);
       }
     }
@@ -1875,12 +1875,12 @@
       ApiNativeScope scope;
       Dart_CObject* root = GetDeserializedDartMessage(lib, "getBigintList");
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
       for (int i = 0; i < kArrayLength; i++) {
         Dart_CObject* element = root->value.as_array.values[i];
         EXPECT_EQ(root->value.as_array.values[0], element);
-        EXPECT_EQ(Dart_CObject::kBigint, element->type);
+        EXPECT_EQ(Dart_CObject_kBigint, element->type);
         EXPECT_STREQ("1234567890123456789012345678901234567890",
                      element->value.as_bigint);
       }
@@ -1890,12 +1890,12 @@
       ApiNativeScope scope;
       Dart_CObject* root = GetDeserializedDartMessage(lib, "getDoubleList");
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
       for (int i = 0; i < kArrayLength; i++) {
         Dart_CObject* element = root->value.as_array.values[i];
         EXPECT_EQ(root->value.as_array.values[0], element);
-        EXPECT_EQ(Dart_CObject::kDouble, element->type);
+        EXPECT_EQ(Dart_CObject_kDouble, element->type);
         EXPECT_EQ(3.14, element->value.as_double);
       }
     }
@@ -1904,13 +1904,13 @@
       ApiNativeScope scope;
       Dart_CObject* root = GetDeserializedDartMessage(lib, "getTypedDataList");
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
       for (int i = 0; i < kArrayLength; i++) {
         Dart_CObject* element = root->value.as_array.values[i];
         EXPECT_EQ(root->value.as_array.values[0], element);
-        EXPECT_EQ(Dart_CObject::kTypedData, element->type);
-        EXPECT_EQ(Dart_CObject::kUint8Array, element->value.as_typed_data.type);
+        EXPECT_EQ(Dart_CObject_kTypedData, element->type);
+        EXPECT_EQ(Dart_TypedData_kUint8, element->value.as_typed_data.type);
         EXPECT_EQ(256, element->value.as_typed_data.length);
       }
     }
@@ -1920,13 +1920,13 @@
       Dart_CObject* root =
           GetDeserializedDartMessage(lib, "getTypedDataViewList");
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
       for (int i = 0; i < kArrayLength; i++) {
         Dart_CObject* element = root->value.as_array.values[i];
         EXPECT_EQ(root->value.as_array.values[0], element);
-        EXPECT_EQ(Dart_CObject::kTypedData, element->type);
-        EXPECT_EQ(Dart_CObject::kUint8Array, element->value.as_typed_data.type);
+        EXPECT_EQ(Dart_CObject_kTypedData, element->type);
+        EXPECT_EQ(Dart_TypedData_kUint8, element->value.as_typed_data.type);
         EXPECT_EQ(128, element->value.as_typed_data.length);
         EXPECT_EQ(1, element->value.as_typed_data.values[0]);
         EXPECT_EQ(0, element->value.as_typed_data.values[1]);
@@ -1937,17 +1937,17 @@
       ApiNativeScope scope;
       Dart_CObject* root = GetDeserializedDartMessage(lib, "getMixedList");
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
       for (int i = 0; i < kArrayLength; i++) {
         Dart_CObject* element = root->value.as_array.values[i];
         if ((i % 2) == 0) {
           EXPECT_EQ(root->value.as_array.values[0], element);
-          EXPECT_EQ(Dart_CObject::kString, element->type);
+          EXPECT_EQ(Dart_CObject_kString, element->type);
           EXPECT_STREQ("A", element->value.as_string);
         } else {
           EXPECT_EQ(root->value.as_array.values[1], element);
-          EXPECT_EQ(Dart_CObject::kDouble, element->type);
+          EXPECT_EQ(Dart_CObject_kDouble, element->type);
           EXPECT_STREQ(2.72, element->value.as_double);
         }
       }
@@ -1957,11 +1957,11 @@
       ApiNativeScope scope;
       Dart_CObject* root = GetDeserializedDartMessage(lib, "getSelfRefList");
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
       for (int i = 0; i < kArrayLength; i++) {
         Dart_CObject* element = root->value.as_array.values[i];
-        EXPECT_EQ(Dart_CObject::kArray, element->type);
+        EXPECT_EQ(Dart_CObject_kArray, element->type);
         EXPECT_EQ(root, element);
       }
     }
@@ -2051,12 +2051,12 @@
       ApiNativeScope scope;
       Dart_CObject* root = GetDeserializedDartMessage(lib, "getStringList");
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
       for (int i = 0; i < kArrayLength; i++) {
         Dart_CObject* element = root->value.as_array.values[i];
         EXPECT_EQ(root->value.as_array.values[0], element);
-        EXPECT_EQ(Dart_CObject::kString, element->type);
+        EXPECT_EQ(Dart_CObject_kString, element->type);
         EXPECT_STREQ("Hello, world!", element->value.as_string);
       }
     }
@@ -2065,12 +2065,12 @@
       ApiNativeScope scope;
       Dart_CObject* root = GetDeserializedDartMessage(lib, "getMintList");
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
       for (int i = 0; i < kArrayLength; i++) {
         Dart_CObject* element = root->value.as_array.values[i];
         EXPECT_EQ(root->value.as_array.values[0], element);
-        EXPECT_EQ(Dart_CObject::kInt64, element->type);
+        EXPECT_EQ(Dart_CObject_kInt64, element->type);
         EXPECT_EQ(DART_INT64_C(0x7FFFFFFFFFFFFFFF), element->value.as_int64);
       }
     }
@@ -2079,12 +2079,12 @@
       ApiNativeScope scope;
       Dart_CObject* root = GetDeserializedDartMessage(lib, "getBigintList");
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
       for (int i = 0; i < kArrayLength; i++) {
         Dart_CObject* element = root->value.as_array.values[i];
         EXPECT_EQ(root->value.as_array.values[0], element);
-        EXPECT_EQ(Dart_CObject::kBigint, element->type);
+        EXPECT_EQ(Dart_CObject_kBigint, element->type);
         EXPECT_STREQ("1234567890123456789012345678901234567890",
                      element->value.as_bigint);
       }
@@ -2094,12 +2094,12 @@
       ApiNativeScope scope;
       Dart_CObject* root = GetDeserializedDartMessage(lib, "getDoubleList");
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
       for (int i = 0; i < kArrayLength; i++) {
         Dart_CObject* element = root->value.as_array.values[i];
         EXPECT_EQ(root->value.as_array.values[0], element);
-        EXPECT_EQ(Dart_CObject::kDouble, element->type);
+        EXPECT_EQ(Dart_CObject_kDouble, element->type);
         EXPECT_EQ(3.14, element->value.as_double);
       }
     }
@@ -2108,13 +2108,13 @@
       ApiNativeScope scope;
       Dart_CObject* root = GetDeserializedDartMessage(lib, "getTypedDataList");
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
       for (int i = 0; i < kArrayLength; i++) {
         Dart_CObject* element = root->value.as_array.values[i];
         EXPECT_EQ(root->value.as_array.values[0], element);
-        EXPECT_EQ(Dart_CObject::kTypedData, element->type);
-        EXPECT_EQ(Dart_CObject::kUint8Array, element->value.as_typed_data.type);
+        EXPECT_EQ(Dart_CObject_kTypedData, element->type);
+        EXPECT_EQ(Dart_TypedData_kUint8, element->value.as_typed_data.type);
         EXPECT_EQ(256, element->value.as_typed_data.length);
       }
     }
@@ -2124,13 +2124,13 @@
       Dart_CObject* root =
           GetDeserializedDartMessage(lib, "getTypedDataViewList");
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
       for (int i = 0; i < kArrayLength; i++) {
         Dart_CObject* element = root->value.as_array.values[i];
         EXPECT_EQ(root->value.as_array.values[0], element);
-        EXPECT_EQ(Dart_CObject::kTypedData, element->type);
-        EXPECT_EQ(Dart_CObject::kUint8Array, element->value.as_typed_data.type);
+        EXPECT_EQ(Dart_CObject_kTypedData, element->type);
+        EXPECT_EQ(Dart_TypedData_kUint8, element->value.as_typed_data.type);
         EXPECT_EQ(128, element->value.as_typed_data.length);
         EXPECT_EQ(1, element->value.as_typed_data.values[0]);
         EXPECT_EQ(0, element->value.as_typed_data.values[1]);
@@ -2141,17 +2141,17 @@
       ApiNativeScope scope;
       Dart_CObject* root = GetDeserializedDartMessage(lib, "getMixedList");
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
       for (int i = 0; i < kArrayLength; i++) {
         Dart_CObject* element = root->value.as_array.values[i];
         if ((i % 2) == 0) {
           EXPECT_EQ(root->value.as_array.values[0], element);
-          EXPECT_EQ(Dart_CObject::kString, element->type);
+          EXPECT_EQ(Dart_CObject_kString, element->type);
           EXPECT_STREQ(".", element->value.as_string);
         } else {
           EXPECT_EQ(root->value.as_array.values[1], element);
-          EXPECT_EQ(Dart_CObject::kDouble, element->type);
+          EXPECT_EQ(Dart_CObject_kDouble, element->type);
           EXPECT_STREQ(2.72, element->value.as_double);
         }
       }
@@ -2161,11 +2161,11 @@
       ApiNativeScope scope;
       Dart_CObject* root = GetDeserializedDartMessage(lib, "getSelfRefList");
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
       for (int i = 0; i < kArrayLength; i++) {
         Dart_CObject* element = root->value.as_array.values[i];
-        EXPECT_EQ(Dart_CObject::kArray, element->type);
+        EXPECT_EQ(Dart_CObject_kArray, element->type);
         EXPECT_EQ(root, element);
       }
     }
@@ -2176,9 +2176,9 @@
 
 
 static void CheckTypedData(Dart_CObject* object,
-                           Dart_CObject::TypedDataType typed_data_type,
+                           Dart_TypedData_Type typed_data_type,
                            int len) {
-    EXPECT_EQ(Dart_CObject::kTypedData, object->type);
+    EXPECT_EQ(Dart_CObject_kTypedData, object->type);
     EXPECT_EQ(typed_data_type, object->value.as_typed_data.type);
     EXPECT_EQ(len, object->value.as_typed_data.length);
 }
@@ -2270,26 +2270,26 @@
       ApiNativeScope scope;
       Dart_CObject* root = GetDeserializedDartMessage(lib, "getTypedDataList");
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(Dart_CObject_kArray, root->type);
       struct {
-        Dart_CObject::TypedDataType type;
+        Dart_TypedData_Type type;
         int size;
       } expected[] = {
-        { Dart_CObject::kInt8Array, 256},
-        { Dart_CObject::kUint8Array, 256},
-        { Dart_CObject::kInt16Array, 512},
-        { Dart_CObject::kUint16Array, 512},
-        { Dart_CObject::kInt32Array, 1024},
-        { Dart_CObject::kUint32Array, 1024},
-        { Dart_CObject::kInt64Array, 2048},
-        { Dart_CObject::kUint64Array, 2048},
-        { Dart_CObject::kFloat32Array, 1024},
-        { Dart_CObject::kFloat64Array, 2048},
-        { Dart_CObject::kNumberOfTypedDataTypes, -1 }
+        { Dart_TypedData_kInt8, 256},
+        { Dart_TypedData_kUint8, 256},
+        { Dart_TypedData_kInt16, 512},
+        { Dart_TypedData_kUint16, 512},
+        { Dart_TypedData_kInt32, 1024},
+        { Dart_TypedData_kUint32, 1024},
+        { Dart_TypedData_kInt64, 2048},
+        { Dart_TypedData_kUint64, 2048},
+        { Dart_TypedData_kFloat32, 1024},
+        { Dart_TypedData_kFloat64, 2048},
+        { Dart_TypedData_kInvalid, -1 }
       };
 
       int i = 0;
-      while (expected[i].type != Dart_CObject::kNumberOfTypedDataTypes) {
+      while (expected[i].type != Dart_TypedData_kInvalid) {
         CheckTypedData(root->value.as_array.values[i],
                        expected[i].type,
                        expected[i].size);
@@ -2304,49 +2304,49 @@
       Dart_CObject* root =
           GetDeserializedDartMessage(lib, "getTypedDataViewList");
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(Dart_CObject_kArray, root->type);
       struct {
-        Dart_CObject::TypedDataType type;
+        Dart_TypedData_Type type;
         int size;
       } expected[] = {
-        { Dart_CObject::kInt8Array, 256},
-        { Dart_CObject::kUint8Array, 256},
-        { Dart_CObject::kInt16Array, 512},
-        { Dart_CObject::kUint16Array, 512},
-        { Dart_CObject::kInt32Array, 1024},
-        { Dart_CObject::kUint32Array, 1024},
-        { Dart_CObject::kInt64Array, 2048},
-        { Dart_CObject::kUint64Array, 2048},
-        { Dart_CObject::kFloat32Array, 1024},
-        { Dart_CObject::kFloat64Array, 2048},
+        { Dart_TypedData_kInt8, 256},
+        { Dart_TypedData_kUint8, 256},
+        { Dart_TypedData_kInt16, 512},
+        { Dart_TypedData_kUint16, 512},
+        { Dart_TypedData_kInt32, 1024},
+        { Dart_TypedData_kUint32, 1024},
+        { Dart_TypedData_kInt64, 2048},
+        { Dart_TypedData_kUint64, 2048},
+        { Dart_TypedData_kFloat32, 1024},
+        { Dart_TypedData_kFloat64, 2048},
 
-        { Dart_CObject::kInt8Array, 512},
-        { Dart_CObject::kUint8Array, 512},
-        { Dart_CObject::kInt8Array, 1024},
-        { Dart_CObject::kUint8Array, 1024},
-        { Dart_CObject::kInt8Array, 2048},
-        { Dart_CObject::kUint8Array, 2048},
-        { Dart_CObject::kInt8Array, 1024},
-        { Dart_CObject::kUint8Array, 1024},
-        { Dart_CObject::kInt8Array, 2048},
-        { Dart_CObject::kUint8Array, 2048},
+        { Dart_TypedData_kInt8, 512},
+        { Dart_TypedData_kUint8, 512},
+        { Dart_TypedData_kInt8, 1024},
+        { Dart_TypedData_kUint8, 1024},
+        { Dart_TypedData_kInt8, 2048},
+        { Dart_TypedData_kUint8, 2048},
+        { Dart_TypedData_kInt8, 1024},
+        { Dart_TypedData_kUint8, 1024},
+        { Dart_TypedData_kInt8, 2048},
+        { Dart_TypedData_kUint8, 2048},
 
-        { Dart_CObject::kInt16Array, 256},
-        { Dart_CObject::kUint16Array, 256},
-        { Dart_CObject::kInt16Array, 1024},
-        { Dart_CObject::kUint16Array, 1024},
-        { Dart_CObject::kInt16Array, 2048},
-        { Dart_CObject::kUint16Array, 2048},
-        { Dart_CObject::kInt16Array, 1024},
-        { Dart_CObject::kUint16Array, 1024},
-        { Dart_CObject::kInt16Array, 2048},
-        { Dart_CObject::kUint16Array, 2048},
+        { Dart_TypedData_kInt16, 256},
+        { Dart_TypedData_kUint16, 256},
+        { Dart_TypedData_kInt16, 1024},
+        { Dart_TypedData_kUint16, 1024},
+        { Dart_TypedData_kInt16, 2048},
+        { Dart_TypedData_kUint16, 2048},
+        { Dart_TypedData_kInt16, 1024},
+        { Dart_TypedData_kUint16, 1024},
+        { Dart_TypedData_kInt16, 2048},
+        { Dart_TypedData_kUint16, 2048},
 
-        { Dart_CObject::kNumberOfTypedDataTypes, -1 }
+        { Dart_TypedData_kInvalid, -1 }
       };
 
       int i = 0;
-      while (expected[i].type != Dart_CObject::kNumberOfTypedDataTypes) {
+      while (expected[i].type != Dart_TypedData_kInvalid) {
         CheckTypedData(root->value.as_array.values[i],
                        expected[i].type,
                        expected[i].size);
@@ -2360,26 +2360,26 @@
       Dart_CObject* root =
           GetDeserializedDartMessage(lib, "getMultipleTypedDataViewList");
       EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(Dart_CObject_kArray, root->type);
       struct {
-        Dart_CObject::TypedDataType type;
+        Dart_TypedData_Type type;
         int size;
       } expected[] = {
-        { Dart_CObject::kInt8Array, 256},
-        { Dart_CObject::kUint8Array, 256},
-        { Dart_CObject::kInt16Array, 256},
-        { Dart_CObject::kUint16Array, 256},
-        { Dart_CObject::kInt32Array, 256},
-        { Dart_CObject::kUint32Array, 256},
-        { Dart_CObject::kInt64Array, 256},
-        { Dart_CObject::kUint64Array, 256},
-        { Dart_CObject::kFloat32Array, 256},
-        { Dart_CObject::kFloat64Array, 256},
-        { Dart_CObject::kNumberOfTypedDataTypes, -1 }
+        { Dart_TypedData_kInt8, 256},
+        { Dart_TypedData_kUint8, 256},
+        { Dart_TypedData_kInt16, 256},
+        { Dart_TypedData_kUint16, 256},
+        { Dart_TypedData_kInt32, 256},
+        { Dart_TypedData_kUint32, 256},
+        { Dart_TypedData_kInt64, 256},
+        { Dart_TypedData_kUint64, 256},
+        { Dart_TypedData_kFloat32, 256},
+        { Dart_TypedData_kFloat64, 256},
+        { Dart_TypedData_kInvalid, -1 }
       };
 
       int i = 0;
-      while (expected[i].type != Dart_CObject::kNumberOfTypedDataTypes) {
+      while (expected[i].type != Dart_TypedData_kInvalid) {
         CheckTypedData(root->value.as_array.values[i],
                        expected[i].type,
                        expected[i].size);
@@ -2435,34 +2435,34 @@
   // Setup single object message.
   Dart_CObject object;
 
-  object.type = Dart_CObject::kNull;
+  object.type = Dart_CObject_kNull;
   EXPECT(Dart_PostCObject(send_port_id, &object));
 
-  object.type = Dart_CObject::kBool;
+  object.type = Dart_CObject_kBool;
   object.value.as_bool = true;
   EXPECT(Dart_PostCObject(send_port_id, &object));
 
-  object.type = Dart_CObject::kBool;
+  object.type = Dart_CObject_kBool;
   object.value.as_bool = false;
   EXPECT(Dart_PostCObject(send_port_id, &object));
 
-  object.type = Dart_CObject::kInt32;
+  object.type = Dart_CObject_kInt32;
   object.value.as_int32 = 123;
   EXPECT(Dart_PostCObject(send_port_id, &object));
 
-  object.type = Dart_CObject::kString;
+  object.type = Dart_CObject_kString;
   object.value.as_string = const_cast<char*>("456");
   EXPECT(Dart_PostCObject(send_port_id, &object));
 
-  object.type = Dart_CObject::kString;
+  object.type = Dart_CObject_kString;
   object.value.as_string = const_cast<char*>("æøå");
   EXPECT(Dart_PostCObject(send_port_id, &object));
 
-  object.type = Dart_CObject::kDouble;
+  object.type = Dart_CObject_kDouble;
   object.value.as_double = 3.14;
   EXPECT(Dart_PostCObject(send_port_id, &object));
 
-  object.type = Dart_CObject::kArray;
+  object.type = Dart_CObject_kArray;
   object.value.as_array.length = 0;
   EXPECT(Dart_PostCObject(send_port_id, &object));
 
@@ -2471,7 +2471,7 @@
       reinterpret_cast<Dart_CObject*>(
           Dart_ScopeAllocate(
               sizeof(Dart_CObject) + sizeof(Dart_CObject*) * kArrayLength));  // NOLINT
-  array->type = Dart_CObject::kArray;
+  array->type = Dart_CObject_kArray;
   array->value.as_array.length = kArrayLength;
   array->value.as_array.values =
       reinterpret_cast<Dart_CObject**>(array + 1);
@@ -2479,7 +2479,7 @@
     Dart_CObject* element =
         reinterpret_cast<Dart_CObject*>(
             Dart_ScopeAllocate(sizeof(Dart_CObject)));
-    element->type = Dart_CObject::kInt32;
+    element->type = Dart_CObject_kInt32;
     element->value.as_int32 = i;
     array->value.as_array.values[i] = element;
   }
diff --git a/runtime/vm/snapshot_test.dart b/runtime/vm/snapshot_test.dart
index f9c2336..5457ef5 100644
--- a/runtime/vm/snapshot_test.dart
+++ b/runtime/vm/snapshot_test.dart
@@ -7,7 +7,7 @@
 
 class Expect {
   static void equals(x, y) {
-    if (x != y) throw new RuntimeError('not equal');
+    if (x != y) throw new ArgumentError('not equal');
   }
 }
 
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index 39d3357..74f1cd4 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -62,7 +62,7 @@
   // Reserve space for arguments and align frame before entering C++ world.
   // NativeArguments are passed in registers.
   ASSERT(sizeof(NativeArguments) == 4 * kWordSize);
-  __ ReserveAlignedFrameSpace(0);
+  __ ReserveAlignedFrameSpace(4 * kWordSize);  // Reserve space for arguments.
 
   // Pass NativeArguments structure by value and call runtime.
   // Registers A0, A1, A2, and A3 are used.
@@ -161,11 +161,6 @@
   // Cache Isolate pointer into CTX while executing native code.
   __ mov(CTX, A0);
 
-  // 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 A0, A1, A2, and A3 are used.
 
@@ -191,10 +186,12 @@
   __ sw(A2, Address(SP, 2 * kWordSize));
   __ sw(A1, Address(SP, 1 * kWordSize));
   __ sw(A0, Address(SP, 0 * kWordSize));
+  __ mov(A0, SP);  // Pass the pointer to the NativeArguments.
+
+  __ ReserveAlignedFrameSpace(kWordSize);  // Just passing A0.
 
   // Call native function or redirection via simulator.
   __ jalr(T5);
-  __ delay_slot()->mov(A0, SP);  // Pass the pointer to the NativeArguments.
   __ TraceSimMsg("CallNativeCFunctionStub return");
 
   // Reset exit frame information in Isolate structure.
@@ -1478,7 +1475,7 @@
 
 
 // Generate inline cache check for 'num_args'.
-//  AR: return address
+//  RA: return address
 //  S5: Inline cache data object.
 //  S4: Arguments descriptor array.
 // Control flow:
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index a91a7e1..7a34fef 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -72,7 +72,7 @@
 
   bool is_dart_scheme_url = DartUtils::IsDartSchemeURL(url_chars);
   bool is_io_library = DartUtils::IsDartIOLibURL(library_url_string);
-  if (tag == kCanonicalizeUrl) {
+  if (tag == Dart_kCanonicalizeUrl) {
     // If this is a Dart Scheme URL then it is not modified as it will be
     // handled by the VM internally.
     if (is_dart_scheme_url || is_io_library) {
@@ -84,7 +84,7 @@
     return DartUtils::CanonicalizeURL(NULL, library, url_chars);
   }
   if (is_dart_scheme_url) {
-    ASSERT(tag == kImportTag);
+    ASSERT(tag == Dart_kImportTag);
     // Handle imports of other built-in libraries present in the SDK.
     if (DartUtils::IsDartIOLibURL(url_chars)) {
       return Builtin::LoadAndCheckLibrary(Builtin::kIOLibrary);
@@ -95,7 +95,7 @@
     }
   }
   if (is_io_library) {
-    ASSERT(tag == kSourceTag);
+    ASSERT(tag == Dart_kSourceTag);
     return Dart_LoadSource(library,
                            url,
                            Builtin::PartSource(Builtin::kIOLibrary,
@@ -136,7 +136,7 @@
 Dart_Handle TestCase::library_handler(Dart_LibraryTag tag,
                                       Dart_Handle library,
                                       Dart_Handle url) {
-  if (tag == kCanonicalizeUrl) {
+  if (tag == Dart_kCanonicalizeUrl) {
     return url;
   }
   return Api::Success();
@@ -192,12 +192,11 @@
   parsed_function->SetNodeSequence(node_sequence_);
   parsed_function->set_instantiator(NULL);
   parsed_function->set_default_parameter_values(default_parameter_values_);
-  parsed_function->set_expression_temp_var(
-      ParsedFunction::CreateExpressionTempVar(0));
+  parsed_function->EnsureExpressionTemp();
   node_sequence_->scope()->AddVariable(parsed_function->expression_temp_var());
   parsed_function->AllocateVariables();
   const Error& error =
-      Error::Handle(Compiler::CompileParsedFunction(*parsed_function));
+      Error::Handle(Compiler::CompileParsedFunction(parsed_function));
   EXPECT(error.IsNull());
 }
 
diff --git a/sdk/bin/dart b/sdk/bin/dart
index 43855cb..22abed8 100755
--- a/sdk/bin/dart
+++ b/sdk/bin/dart
@@ -12,11 +12,11 @@
   DART_CONFIGURATION="ReleaseIA32"
 fi
 
-if [[ `uname` == 'Darwin' ]];
+if [[ `uname` == 'Darwin' ]]; 
 then
-  BIN_DIR="$CUR_DIR"/../../xcodebuild/$DART_CONFIGURATION/dart-sdk/bin
+  BIN_DIR="$CUR_DIR"/../../xcodebuild/$DART_CONFIGURATION
 else
-  BIN_DIR="$CUR_DIR"/../../out/$DART_CONFIGURATION/dart-sdk/bin
-fi
+  BIN_DIR="$CUR_DIR"/../../out/$DART_CONFIGURATION
+fi 
 
 exec "$BIN_DIR"/dart "$@"
diff --git a/sdk/bin/dart2analyzer b/sdk/bin/dart2analyzer
new file mode 100755
index 0000000..4c17671
--- /dev/null
+++ b/sdk/bin/dart2analyzer
@@ -0,0 +1,33 @@
+#!/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
+
+BIN_DIR="$(cd "${BASH_SOURCE%/*}" ; pwd -P)"
+SDK_DIR="$(cd "${BIN_DIR}/.." ; pwd -P)"
+DART="$BIN_DIR/dart"
+PKG_ANALYZER="$BIN_DIR/../packages/analyzer_experimental/bin/analyzer.dart"
+
+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
+
+if [ $FOUND_SDK = 0 ] ; then
+  exec "$DART" "${PKG_ANALYZER}" --dart-sdk "${SDK_DIR}" "$@"
+else
+  exec "$DART" "${PKG_ANALYZER}" "$@"
+fi
diff --git a/sdk/bin/dart2analyzer_developer b/sdk/bin/dart2analyzer_developer
new file mode 100755
index 0000000..5583382
--- /dev/null
+++ b/sdk/bin/dart2analyzer_developer
@@ -0,0 +1,6 @@
+#!/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.
+
+. ${BASH_SOURCE%_developer}
diff --git a/sdk/bin/pub b/sdk/bin/pub
index 19acaa3..76085ab 100755
--- a/sdk/bin/pub
+++ b/sdk/bin/pub
@@ -1,46 +1,11 @@
 #!/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.
+# Run pub.dart on the Dart VM. This script assumes the Dart SDK's directory
+# structure.
 
-function follow_links() {
-  while [ -h "$1" ]; do
-    # On Mac OS, readlink -f doesn't work.
-    1="$(readlink "$1")"
-  done
-  echo "$1"
-}
+# Setting BIN_DIR this way is ugly, but is needed to handle the case where
+# dart-sdk/bin has been symlinked to. On MacOS, readlink doesn't work
+# with this case.
+BIN_DIR="$(cd "${0%/*}" ; pwd -P)"
+DART_SDK="$(cd "${BIN_DIR%/*}" ; pwd -P)"
 
-# 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.
-BIN_DIR="$(follow_links "$(cd "${PROG_NAME%/*}" ; pwd -P)")"
-
-SDK_DIR="$(cd "${BIN_DIR}/.." ; pwd -P)"
-
-DART="$BIN_DIR/dart"
-
-SNAPSHOT="$BIN_DIR/snapshots/pub.dart.snapshot"
-
-if test -f "$SNAPSHOT"; then
-  # We are running the snapshot in the built SDK.
-  exec "$DART" "--checked" "$SNAPSHOT" "$@"
-else
-  # We are running pub from source in the development repo.
-  if [ -z "$DART_CONFIGURATION" ];
-  then
-    DART_CONFIGURATION="ReleaseIA32"
-  fi
-
-  if [[ `uname` == 'Darwin' ]];
-  then
-    PACKAGES_DIR="$SDK_DIR"/../xcodebuild/$DART_CONFIGURATION/packages/
-  else
-    PACKAGES_DIR="$SDK_DIR"/../out/$DART_CONFIGURATION/packages/
-  fi
-
-  PUB="$SDK_DIR/lib/_internal/pub/bin/pub.dart"
-
-  exec "$DART" "--checked" "--package-root=$PACKAGES_DIR" "$PUB" "$@"
-fi
+exec "$BIN_DIR"/dart "$DART_SDK"/bin/snapshots/pub.dart.snapshot $@
diff --git a/sdk/lib/_internal/compiler/implementation/apiimpl.dart b/sdk/lib/_internal/compiler/implementation/apiimpl.dart
index 067417a..c5cc391 100644
--- a/sdk/lib/_internal/compiler/implementation/apiimpl.dart
+++ b/sdk/lib/_internal/compiler/implementation/apiimpl.dart
@@ -56,6 +56,8 @@
             strips: extractCsvOption(options, '--force-strip='),
             enableConcreteTypeInference:
                 hasOption(options, '--enable-concrete-type-inference'),
+            disableTypeInference:
+                hasOption(options, '--disable-type-inference'),
             preserveComments: hasOption(options, '--preserve-comments'),
             verbose: hasOption(options, '--verbose'),
             sourceMapUri: extractSourceMapUri(options),
diff --git a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
index 7a31f2e..ecc86458 100644
--- a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
@@ -444,6 +444,9 @@
 
   Constant makeTypeConstant(Element element) {
     DartType elementType = element.computeType(compiler).asRaw();
+    if (compiler.mirrorsEnabled) {
+      handler.registerInstantiatedClass(element, elements);
+    }
     DartType constantType =
         compiler.backend.typeImplementation.computeType(compiler);
     Constant constant = new TypeConstant(elementType, constantType);
diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart
index be0fc84..f71d6e6 100644
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -254,6 +254,8 @@
   final bool enableUserAssertions;
   final bool trustTypeAnnotations;
   final bool enableConcreteTypeInference;
+  final bool disableTypeInference;
+
   /**
    * The maximum size of a concrete type before it widens to dynamic during
    * concrete type inference.
@@ -455,6 +457,7 @@
             this.enableUserAssertions: false,
             this.trustTypeAnnotations: false,
             this.enableConcreteTypeInference: false,
+            this.disableTypeInference: false,
             this.maxConcreteTypeSize: 5,
             this.enableMinification: false,
             this.enableNativeLiveTypeAnalysis: false,
@@ -520,6 +523,8 @@
 
   bool get hasBuildId => buildId != UNDETERMINED_BUILD_ID;
 
+  bool get mirrorsEnabled => mirrorSystemClass != null;
+
   int getNextFreeClassId() => nextFreeClassId++;
 
   void ensure(bool condition) {
@@ -881,7 +886,7 @@
 
   void resolveReflectiveDataIfNeeded() {
     // Only need reflective data when dart:mirrors is loaded.
-    if (mirrorSystemClass == null) return;
+    if (!mirrorsEnabled) return;
 
     for (LibraryElement library in libraries.values) {
       for (Link link = library.metadata; !link.isEmpty; link = link.tail) {
diff --git a/sdk/lib/_internal/compiler/implementation/dart2js.dart b/sdk/lib/_internal/compiler/implementation/dart2js.dart
index 96c5ff1..ce1690b 100644
--- a/sdk/lib/_internal/compiler/implementation/dart2js.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart2js.dart
@@ -258,6 +258,7 @@
                       passThrough),
     new OptionHandler('--categories=.*', setCategories),
     new OptionHandler('--global-js-name=.*', checkGlobalName),
+    new OptionHandler('--disable-type-inference', passThrough),
 
     // The following two options must come last.
     new OptionHandler('-.*', (String argument) {
diff --git a/sdk/lib/_internal/compiler/implementation/enqueue.dart b/sdk/lib/_internal/compiler/implementation/enqueue.dart
index 7397b2f..116036a 100644
--- a/sdk/lib/_internal/compiler/implementation/enqueue.dart
+++ b/sdk/lib/_internal/compiler/implementation/enqueue.dart
@@ -170,6 +170,15 @@
     registerInstantiatedType(cls.rawType, elements);
   }
 
+  void registerTypeLiteral(Element element, TreeElements elements) {
+    registerInstantiatedClass(compiler.typeClass, elements);
+    compiler.backend.registerTypeLiteral(elements);
+    if (compiler.mirrorsEnabled) {
+      // In order to use reflectClass, we need to find the constructor.
+      registerInstantiatedClass(element, elements);
+    }
+  }
+
   bool checkNoEnqueuedInvokedInstanceMethods() {
     task.measure(() {
       // Run through the classes and see if we need to compile methods.
@@ -220,22 +229,23 @@
           // registered during codegen on the handleUnseenSelector path, and
           // cause the set of codegen elements to include unresolved elements.
           nativeEnqueuer.registerFieldStore(member);
+          addToWorkList(member);
           return;
         }
         if (universe.hasInvokedSetter(member, compiler)) {
           nativeEnqueuer.registerFieldStore(member);
           // See comment after registerFieldLoad above.
           nativeEnqueuer.registerFieldLoad(member);
+          addToWorkList(member);
           return;
         }
         // Native fields need to go into instanceMembersByName as they
         // are virtual instantiation points and escape points.
       } else {
-        // The codegen inlines instance fields initialization, so it
-        // does not need to add individual fields in the work list.
-        if (isResolutionQueue) {
-          addToWorkList(member);
-        }
+        // All field initializers must be resolved as they could
+        // have an observable side-effect (and cannot be tree-shaken
+        // away).
+        addToWorkList(member);
         return;
       }
     } else if (member.kind == ElementKind.FUNCTION) {
@@ -346,7 +356,7 @@
     // If dart:mirrors is loaded, a const symbol may be used to call a
     // static/top-level method or accessor, instantiate a class, call
     // an instance method or accessor with the given name.
-    if (compiler.mirrorSystemClass == null) return;
+    if (!compiler.mirrorsEnabled) return;
 
     task.ensureAllElementsByName();
 
@@ -437,9 +447,8 @@
             // TODO(sra): Process fields for storing separately.
             nativeEnqueuer.registerFieldLoad(member);
           }
-        } else {
-          addToWorkList(member);
         }
+        addToWorkList(member);
         return true;
       }
       return false;
@@ -738,6 +747,10 @@
       member.isAbstract(compiler) || generatedCode.containsKey(member);
 
   bool addElementToWorkList(Element element, [TreeElements elements]) {
+    // Codegen inlines field initializers, so it does not need to add
+    // individual fields in the work list.
+    if (element.isField() && element.isInstanceMember()) return true;
+
     if (queueIsClosed) {
       throw new SpannableAssertionFailure(element,
                                           "Codegen work list is closed.");
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
index 417dca9..b1786bb 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
@@ -612,6 +612,12 @@
            * print the runtime type JSInt as 'int'.
            */
           js('var classData = desc[""], supr, name = cls, fields = classData'),
+          optional(
+              compiler.mirrorsEnabled,
+              js.if_('typeof classData == "object" && '
+                     'classData instanceof Array',
+                     [js('classData = fields = classData[0]')])),
+
           js.if_('typeof classData == "string"', [
             js('var split = classData.split("/")'),
             js.if_('split.length == 2', [
@@ -640,7 +646,10 @@
             ]),
           ])),
 
-          js('isolateProperties[cls] = defineClass(name, cls, fields, desc)'),
+          js('var constructor = defineClass(name, cls, fields, desc)'),
+          optional(compiler.mirrorsEnabled,
+                   js('constructor["${namer.metadataField}"] = desc')),
+          js('isolateProperties[cls] = constructor'),
           js.if_('supr', js('pendingClasses[cls] = supr'))
         ])
       ]),
@@ -1161,7 +1170,16 @@
       if (member.isAbstract(compiler)) return;
       jsAst.Expression code = backend.generatedCode[member];
       if (code == null) return;
-      builder.addProperty(namer.getName(member), code);
+      String name = namer.getName(member);
+      builder.addProperty(name, code);
+      var metadata = buildMetadataFunction(member);
+      if (metadata != null) {
+        builder.addProperty('@$name', metadata);
+      }
+      String reflectionName = getReflectionName(member);
+      if (reflectionName != null) {
+        builder.addProperty('+$reflectionName', js('0'));
+      }
       code = backend.generatedBailoutCode[member];
       if (code != null) {
         builder.addProperty(namer.getBailoutName(member), code);
@@ -1178,6 +1196,25 @@
     emitExtraAccessors(member, builder);
   }
 
+  String getReflectionName(Element element) {
+    if (!compiler.mirrorsEnabled) return null;
+    String name = element.name.slowToString();
+    if (element.isGetter()) return name;
+    if (element.isSetter()) return '$name=';
+    if (element.isFunction()) {
+      FunctionElement function = element;
+      int requiredParameterCount = function.requiredParameterCount(compiler);
+      int optionalParameterCount = function.optionalParameterCount(compiler);
+      String suffix = '$name:$requiredParameterCount:$optionalParameterCount';
+      return (function.isConstructor()) ? 'new $suffix' : suffix;
+    }
+    if (element.isGenerativeConstructorBody()) {
+      return null;
+    }
+    throw compiler.internalErrorOnElement(
+        element, 'Do not know how to reflect on this');
+  }
+
   /**
    * Documentation wanted -- johnniwinther
    *
@@ -1438,6 +1475,9 @@
     buffer.write('$superName;');
     int bufferClassLength = buffer.length;
 
+    var fieldMetadata = [];
+    bool hasMetadata = false;
+
     visitClassFields(classElement, (Element member,
                                     String name,
                                     String accessorName,
@@ -1453,6 +1493,13 @@
       if (!classIsNative || needsAccessor) {
         buffer.write(separator);
         separator = ',';
+        if (compiler.mirrorsEnabled) {
+          var metadata = buildMetadataFunction(member);
+          fieldMetadata.add(metadata);
+          if (metadata != null) {
+            hasMetadata = true;
+          }
+        }
         if (!needsAccessor) {
           // Emit field for constructor generation.
           assert(!classIsNative);
@@ -1496,7 +1543,12 @@
 
     bool fieldsAdded = buffer.length > bufferClassLength;
     String compactClassData = buffer.toString();
-    builder.addProperty('', js.string(compactClassData));
+    jsAst.Expression classDataNode = js.string(compactClassData);
+    if (hasMetadata) {
+      fieldMetadata.insert(0, classDataNode);
+      classDataNode = new jsAst.ArrayInitializer.from(fieldMetadata);
+    }
+    builder.addProperty('', classDataNode);
     return fieldsAdded;
   }
 
@@ -1796,7 +1848,13 @@
     for (Element element in Elements.sortedByPosition(elements)) {
       CodeBuffer buffer = bufferForElement(element, eagerBuffer);
       jsAst.Expression code = backend.generatedCode[element];
-      emitStaticFunction(buffer, namer.getName(element), code);
+      String name = namer.getName(element);
+      emitStaticFunction(buffer, name, code);
+      var metadata = buildMetadataFunction(element);
+      if (metadata != null) {
+        buffer.write(',$n$n"@$name":$_');
+        buffer.write(jsAst.prettyPrint(metadata, compiler));
+      }
       jsAst.Expression bailoutCode = backend.generatedBailoutCode[element];
       if (bailoutCode != null) {
         pendingElementsWithBailouts.remove(element);
@@ -2937,7 +2995,7 @@
   /// annotated with itself.  The metadata function is used by
   /// mirrors_patch to implement DeclarationMirror.metadata.
   jsAst.Fun buildMetadataFunction(Element element) {
-    if (compiler.mirrorSystemClass == null) return null;
+    if (!compiler.mirrorsEnabled) return null;
     var metadata = [];
     Link link = element.metadata;
     // TODO(ahe): Why is metadata sometimes null?
@@ -3238,7 +3296,9 @@
     return '''
 (function (reflectionData) {
   if (!init.libraries) init.libraries = [];
+  if (!init.mangledNames) init.mangledNames = {};
   var libraries = init.libraries;
+  var mangledNames = init.mangledNames;
   var hasOwnProperty = Object.prototype.hasOwnProperty;
   var length = reflectionData.length;
   for (var i = 0; i < length; i++) {
@@ -3252,13 +3312,29 @@
     for (var property in descriptor) {
       if (!hasOwnProperty.call(descriptor, property)) continue;
       var element = descriptor[property];
-      if (typeof element === "function") {
+      if (property.substring(0, 1) == "@") {
+        property = property.substring(1);
+        ${namer.CURRENT_ISOLATE}[property]["${namer.metadataField}"] = element;
+      } else if (typeof element === "function") {
         ${namer.CURRENT_ISOLATE}[property] = element;
         functions.push(property);
       } else {
-        $classesCollector[property] = element;
+        var newDesc = {};
+        var previousProp;
+        for (var prop in element) {
+          if (!hasOwnProperty.call(element, prop)) continue;
+          var firstChar = prop.substring(0, 1);
+          if (firstChar == "+") {
+            mangledNames[previousProp] = prop.substring(1);
+          } else if (firstChar == "@" && prop != "@") {
+            newDesc[prop.substring(1)]["${namer.metadataField}"] ='''
+'''element[prop];
+          } else {
+            newDesc[previousProp = prop] = element[prop];
+          }
+        }
+        $classesCollector[property] = newDesc;
         classes.push(property);
-        classes.push(element[""]);
       }
     }
     libraries.push([name, uri, classes, functions, metadata]);
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
index c83e714..77766eb 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
@@ -176,6 +176,7 @@
 
   final String getterPrefix = r'get$';
   final String setterPrefix = r'set$';
+  final String metadataField = '@';
 
   /**
    * Map from top-level or static elements to their unique identifiers provided
diff --git a/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart b/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart
index 2cbd650..cd4e627 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart
@@ -144,13 +144,10 @@
 }
 
 class Primitives {
-  static int hashCodeSeed = 0;
-
   static int objectHashCode(object) {
     int hash = JS('int|Null', r'#.$identityHash', object);
     if (hash == null) {
-      // TOOD(ahe): We should probably randomize this somehow.
-      hash = ++hashCodeSeed;
+      hash = JS('int', '(Math.random() * 0x3fffffff) | 0');
       JS('void', r'#.$identityHash = #', object, hash);
     }
     return JS('int', '#', hash);
@@ -573,11 +570,11 @@
     // TODO(ahe): Generalize this and improve test coverage of
     // reflecting on intercepted classes.
     if (JS('bool', '# == "String"', className)) return const JSString();
-    if (JS('bool', '# == "int"', int)) return const JSInt();
-    if (JS('bool', '# == "double"', int)) return const JSDouble();
-    if (JS('bool', '# == "num"', int)) return const JSNumber();
-    if (JS('bool', '# == "bool"', int)) return const JSBool();
-    if (JS('bool', '# == "List"', int)) return const JSArray();
+    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();
     return JS('var', '#[#]', JS_CURRENT_ISOLATE(), className);
   }
 
@@ -947,26 +944,41 @@
   String toString() => "Closure";
 }
 
+/// Represents a 'tear-off' closure, that is an instance method bound
+/// to a specific receiver (instance).
 class BoundClosure extends Closure {
-  var self;
-  var target;
-  var receiver;
+  /// The receiver or interceptor.
+  // TODO(ahe): This could just be the interceptor, we always know if
+  // we need the interceptor when generating the call method.
+  final _self;
+
+  /// The method name.
+  final String _target;
+
+  /// The receiver.
+  final _receiver;
 
   bool operator==(other) {
     if (identical(this, other)) return true;
     if (other is! BoundClosure) return false;
     return JS('bool', '# === # && # === # && # === #',
-        self, other.self,
-        target, other.target,
-        receiver, other.receiver);
+        _self, other._self,
+        _target, other._target,
+        _receiver, other._receiver);
   }
 
   int get hashCode {
     return JS('int', '(# + # + #) & 0x3ffffff',
-        self.hashCode,
-        target.hashCode,
-        receiver.hashCode);
+        _self.hashCode,
+        _target.hashCode,
+        _receiver.hashCode);
   }
+
+  static selfOf(BoundClosure closure) => closure._self;
+
+  static String targetOf(BoundClosure closure) => closure._target;
+
+  static revceiverOf(BoundClosure closure) => closure._receiver;
 }
 
 bool jsHasOwnProperty(var jsObject, String property) {
@@ -1432,5 +1444,15 @@
  * field that is currently being initialized.
  */
 void throwCyclicInit(String staticName) {
-  throw new RuntimeError("Cyclic initialization for static $staticName");
+  throw new CyclicInitializationError(
+      "Cyclic initialization for static $staticName");
+}
+
+/**
+ * Error thrown when a runtime error occurs.
+ */
+class RuntimeError implements Error {
+  final message;
+  RuntimeError(this.message);
+  String toString() => "RuntimeError: $message";
 }
diff --git a/sdk/lib/_internal/compiler/implementation/lib/js_mirrors.dart b/sdk/lib/_internal/compiler/implementation/lib/js_mirrors.dart
index d1f93ed..2a50b31 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/js_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/js_mirrors.dart
@@ -10,10 +10,12 @@
 import 'dart:_foreign_helper' show JS, JS_CURRENT_ISOLATE;
 import 'dart:_collection-dev' as _symbol_dev;
 import 'dart:_js_helper' show
+    BoundClosure,
     Closure,
     JSInvocationMirror,
     Null,
     Primitives,
+    RuntimeError,
     createInvocationMirror;
 import 'dart:_interceptors' show Interceptor;
 
@@ -30,6 +32,10 @@
   static final Map<String, List<LibraryMirror>> librariesByName =
       computeLibrariesByName();
 
+  static final Map<String, String> mangledNames = computeMangledNames();
+
+  static final Map<String, String> reflectiveNames = computeReflectiveNames();
+
   Iterable<LibraryMirror> findLibrary(Symbol libraryName) {
     return new List<LibraryMirror>.from(librariesByName[n(libraryName)]);
   }
@@ -52,6 +58,31 @@
     }
     return result;
   }
+
+  static Map<String, String> computeMangledNames() {
+    var mangledNames = JS('', 'init.mangledNames');
+    var keys = JS('List', '''
+(function(mangled, hasOwnProperty) {
+  var result = [];
+  for (var key in mangled) {
+    if (hasOwnProperty.call(mangled, key)) result.push(key);
+  }
+  return result;
+})(#, Object.prototype.hasOwnProperty)''', mangledNames);
+    var result = <String, String>{};
+    for (String key in keys) {
+      result[key] = JS('String', '#[#]', mangledNames, key);
+    }
+    return result;
+  }
+
+  static Map<String, String> computeReflectiveNames() {
+    var result = <String, String>{};
+    mangledNames.forEach((String mangledName, String reflectiveName) {
+      result[reflectiveName] = mangledName;
+    });
+    return result;
+  }
 }
 
 class JsTypeMirror implements TypeMirror {
@@ -76,9 +107,9 @@
 
   Map<Symbol, ClassMirror> get classes {
     var result = new Map<Symbol, ClassMirror>();
-    for (int i = 0; i < _classes.length; i += 2) {
-      Symbol symbol = s(_classes[i]);
-      JsClassMirror cls = reflectClassByName(symbol, _classes[i + 1]);
+    for (String className in _classes) {
+      Symbol symbol = s(className);
+      JsClassMirror cls = reflectClassByName(symbol);
       result[symbol] = cls;
       cls._owner = this;
     }
@@ -106,7 +137,8 @@
           // TODO(ahe): Create accessor for accessing $.  It is also
           // used in js_helper.
           new JsMethodMirror(
-              symbol, JS('', '#[#]', JS_CURRENT_ISOLATE(), name), parameterCount);
+              symbol, JS('', '#[#]', JS_CURRENT_ISOLATE(), name),
+              parameterCount);
       // TODO(ahe): Cache mirrors.
       result[symbol] = mirror;
       mirror._owner = this;
@@ -166,9 +198,9 @@
 
 final Expando<ClassMirror> classMirrors = new Expando<ClassMirror>();
 
-ClassMirror reflectType(Type key) => reflectClassByName(s('$key'), null);
+ClassMirror reflectType(Type key) => reflectClassByName(s('$key'));
 
-ClassMirror reflectClassByName(Symbol symbol, String fields) {
+ClassMirror reflectClassByName(Symbol symbol) {
   String className = n(symbol);
   var constructor = Primitives.getConstructor(className);
   if (constructor == null) {
@@ -176,9 +208,27 @@
     // TODO(ahe): How to handle intercepted classes?
     throw new UnsupportedError('Cannot find class for: $className');
   }
+  var descriptor = JS('', '#["@"]', constructor);
+  var fields;
+  var fieldsMetadata;
+  if (descriptor == null) {
+    // This is a native class, or an intercepted class.
+    // TODO(ahe): Preserve descriptor for such classes.
+  } else {
+    fields = JS('', '#[""]', descriptor);
+    if (fields is List) {
+      fieldsMetadata = fields.getRange(1, fields.length).toList();
+      fields = fields[0];
+    }
+    if (fields is! String) {
+      // TODO(ahe): This is CSP mode.  Find a way to determine the
+      // fields of this class.
+      fields = '';
+    }
+  }
   var mirror = classMirrors[constructor];
   if (mirror == null) {
-    mirror = new JsClassMirror(symbol, constructor, fields);
+    mirror = new JsClassMirror(symbol, constructor, fields, fieldsMetadata);
     classMirrors[constructor] = mirror;
   }
   return mirror;
@@ -223,9 +273,9 @@
     // Copy the list to ensure that it can safely be passed to
     // JavaScript.
     var jsList = new List.from(positionalArguments);
-    return _invoke(
-        memberName, JSInvocationMirror.METHOD,
-        '${n(memberName)}\$${positionalArguments.length}', jsList);
+    String reflectiveName = '${n(memberName)}:${positionalArguments.length}:0';
+    String mangledName = JsMirrorSystem.reflectiveNames[reflectiveName];
+    return _invoke(memberName, JSInvocationMirror.METHOD, mangledName, jsList);
   }
 
   InstanceMirror _invoke(Symbol name,
@@ -262,11 +312,15 @@
   final Symbol simpleName;
   final _jsConstructor;
   final String _fields;
+  final List _fieldsMetadata;
   List _metadata;
   // Set as side-effect of accessing JsLibraryMirror.classes.
   JsLibraryMirror _owner;
 
-  JsClassMirror(this.simpleName, this._jsConstructor, this._fields);
+  JsClassMirror(this.simpleName,
+                this._jsConstructor,
+                this._fields,
+                this._fieldsMetadata);
 
   Symbol get qualifiedName => computeQualifiedName(owner, simpleName);
 
@@ -292,8 +346,13 @@
     var result = new Map<Symbol, VariableMirror>();
     var s = _fields.split(";");
     var fields = s[1] == "" ? [] : s[1].split(",");
+    int fieldNumber = 0;
     for (String field in fields) {
-      JsVariableMirror mirror = new JsVariableMirror.from(field);
+      var metadata;
+      if (_fieldsMetadata != null) {
+        metadata = _fieldsMetadata[fieldNumber++];
+      }
+      JsVariableMirror mirror = new JsVariableMirror.from(field, metadata);
       result[mirror.simpleName] = mirror;
       mirror._owner = this;
     }
@@ -373,9 +432,7 @@
 
   List<InstanceMirror> get metadata {
     if (_metadata == null) {
-      var metadataFunction = JS('', '#.prototype["@"]', _jsConstructor);
-      _metadata = (metadataFunction == null)
-          ? const [] : JS('', '#()', metadataFunction);
+      _metadata = extractMetadata(JS('', '#.prototype', _jsConstructor));
     }
     return _metadata.map(reflect).toList();
   }
@@ -387,28 +444,40 @@
   // TODO(ahe): The values in these fields are virtually untested.
   final Symbol simpleName;
   final String _jsName;
-  final bool _readOnly;
+  final bool isFinal;
+  final bool isStatic;
+  final _metadataFunction;
   DeclarationMirror _owner;
+  List _metadata;
 
-  JsVariableMirror(this.simpleName, this._jsName, this._readOnly);
+  JsVariableMirror(this.simpleName,
+                   this._jsName,
+                   this.isFinal,
+                   this.isStatic,
+                   this._metadataFunction);
 
-  factory JsVariableMirror.from(String descriptor) {
+  factory JsVariableMirror.from(String descriptor, metadataFunction) {
     int length = descriptor.length;
     var code = fieldCode(descriptor.codeUnitAt(length - 1));
-    if (code == 0) {
-      throw new RuntimeError('Bad field descriptor: $descriptor');
+    bool isFinal = false;
+    // code might be 0 if the accessors aren't needed, or if they are
+    // inherited.
+    // TODO(ahe): Ensure code is only 0 for inherited fields.
+    if (code != 0) {
+      bool hasGetter = (code & 3) != 0;
+      bool hasSetter = (code >> 2) != 0;
+      isFinal = !hasSetter;
+      length--;
     }
-    bool hasGetter = (code & 3) != 0;
-    bool hasSetter = (code >> 2) != 0;
     String jsName;
-    String accessorName = jsName = descriptor.substring(0, length - 1);
+    String accessorName = jsName = descriptor.substring(0, length);
     int divider = descriptor.indexOf(":");
     if (divider > 0) {
       accessorName = accessorName.substring(0, divider);
       jsName = accessorName.substring(divider + 1);
     }
-    bool readOnly = !hasSetter;
-    return new JsVariableMirror(s(accessorName), jsName, readOnly);
+    return new JsVariableMirror(
+        s(accessorName), jsName, isFinal, false, metadataFunction);
   }
 
   TypeMirror get type => JsMirrorSystem._dynamicType;
@@ -417,6 +486,18 @@
 
   Symbol get qualifiedName => computeQualifiedName(owner, simpleName);
 
+  List<InstanceMirror> get metadata {
+    if (_metadata == null) {
+      _metadata = (_metadataFunction == null)
+          ? const [] : JS('', '#()', _metadataFunction);
+    }
+    return _metadata.map(reflect).toList();
+  }
+
+  bool get isPrivate => n(simpleName).startsWith('_');
+
+  String toString() => 'VariableMirror(${n(qualifiedName)})';
+
   static int fieldCode(int code) {
     if (code >= 60 && code <= 64) return code - 59;
     if (code >= 123 && code <= 126) return code - 117;
@@ -442,9 +523,16 @@
     if (callName == null) {
       throw new RuntimeError('Cannot find callName on "$reflectee"');
     }
-    var jsFunction = JS('', '#[#]', reflectee, callName);
     int parameterCount = int.parse(callName.split(r'$')[1]);
-    return new JsMethodMirror(s(callName), jsFunction, parameterCount);
+    if (reflectee is BoundClosure) {
+      var target = BoundClosure.targetOf(reflectee);
+      var self = BoundClosure.selfOf(reflectee);
+      return new JsMethodMirror(
+          s(target), JS('', '#[#]', self, target), parameterCount);
+    } else {
+      var jsFunction = JS('', '#[#]', reflectee, callName);
+      return new JsMethodMirror(s(callName), jsFunction, parameterCount);
+    }
   }
 
   InstanceMirror apply(List positionalArguments,
@@ -465,6 +553,7 @@
   final _jsFunction;
   final int _parameterCount;
   DeclarationMirror _owner;
+  List _metadata;
 
   JsMethodMirror(this.simpleName, this._jsFunction, this._parameterCount);
 
@@ -476,6 +565,13 @@
   DeclarationMirror get owner => _owner;
 
   Symbol get qualifiedName => computeQualifiedName(owner, simpleName);
+
+  List<InstanceMirror> get metadata {
+    if (_metadata == null) {
+      _metadata = extractMetadata(_jsFunction);
+    }
+    return _metadata.map(reflect).toList();
+  }
 }
 
 Symbol computeQualifiedName(DeclarationMirror owner, Symbol simpleName) {
@@ -484,3 +580,9 @@
   if (ownerName == '') return simpleName;
   return s('$ownerName.${n(simpleName)}');
 }
+
+List extractMetadata(victim) {
+  var metadataFunction = JS('', '#["@"]', victim);
+  return (metadataFunction == null)
+      ? const [] : JS('', '#()', metadataFunction);
+}
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index 6e2eb36..d409045 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -2251,8 +2251,7 @@
         // Set the type of the node to [Type] to mark this send as a
         // type literal.
         mapping.setType(node, compiler.typeClass.computeType(compiler));
-        world.registerInstantiatedClass(compiler.typeClass, mapping);
-        compiler.backend.registerTypeLiteral(mapping);
+        world.registerTypeLiteral(target, mapping);
       }
     }
 
@@ -2294,6 +2293,7 @@
     if (node.isCall) {
       if (Elements.isUnresolved(target) ||
           target.isGetter() ||
+          target.isField() ||
           Elements.isClosureSend(node, target)) {
         // If we don't know what we're calling or if we are calling a getter,
         // we need to register that fact that we may be calling a closure
@@ -2515,16 +2515,10 @@
       return;
     }
 
-    // Compute the signature of the target method taking into account the
-    // type arguments that are specified in the redirection, and store it on
-    // the return node.
-    ClassElement targetClass = redirectionTarget.getEnclosingClass();
-    InterfaceType type = mapping.getType(node.expression)
-        .subst(currentClass.typeVariables, targetClass.typeVariables);
-    mapping.setType(node, type);
-
     // Check that the target constructor is type compatible with the
     // redirecting constructor.
+    ClassElement targetClass = redirectionTarget.getEnclosingClass();
+    InterfaceType type = mapping.getType(node.expression);
     FunctionType targetType = redirectionTarget.computeType(compiler)
         .subst(type.typeArguments, targetClass.typeVariables);
     FunctionType constructorType = constructor.computeType(compiler);
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index 76e92c0..1c4f47d 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -3414,7 +3414,7 @@
             compiler.enqueuer.resolution.getCachedElements(
                 functionElement.declaration);
         ClassElement targetClass = functionElement.getEnclosingClass();
-        type = treeElements.getType(redirectionNode)
+        type = treeElements.getType(redirectionNode.expression)
             .subst(type.typeArguments, targetClass.typeVariables);
       }
       functionElement = functionElement.redirectionTarget;
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
index 797bc85..cbf3579 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
@@ -1677,7 +1677,6 @@
       // Register this invocation to collect the types used at all call sites.
       backend.registerDynamicInvocation(node, node.selector);
     }
-    world.registerStaticUse(superMethod);
   }
 
   visitFieldGet(HFieldGet node) {
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
index 4236ba1..915908f 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
@@ -1418,8 +1418,8 @@
 
   HInstruction get value {
     assert(isSetter);
-    // Index 0: 'this'.
-    return inputs[1];
+    // The 'inputs' are [receiver, value] or [interceptor, receiver, value].
+    return inputs.last;
   }
 }
 
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart b/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
index ab3ec41..5227623 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
@@ -27,6 +27,7 @@
     HType candidateType = HType.CONFLICTING;
     for (int i = 0, length = phi.inputs.length; i < length; i++) {
       HType inputType = phi.inputs[i].instructionType;
+      if (inputType.isConflicting()) return HType.CONFLICTING;
       if (ignoreUnknowns && inputType.isUnknown()) continue;
       // Phis need to combine the incoming types using the union operation.
       // For example, if one incoming edge has type integer and the other has
diff --git a/sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart
index accc506..9a21b45 100644
--- a/sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart
@@ -152,19 +152,24 @@
   TypeMask get typeType => internal.typeType;
 
   TypeMask getReturnTypeOfElement(Element element) {
+    if (compiler.disableTypeInference) return dynamicType;
     return internal.getReturnTypeOfElement(element);
   }
   TypeMask getTypeOfElement(Element element) {
+    if (compiler.disableTypeInference) return dynamicType;
     return internal.getTypeOfElement(element);
   }
   TypeMask getTypeOfNode(Element owner, Node node) {
+    if (compiler.disableTypeInference) return dynamicType;
     return internal.getTypeOfNode(owner, node);
   }
   TypeMask getTypeOfSelector(Selector selector) {
+    if (compiler.disableTypeInference) return dynamicType;
     return internal.getTypeOfSelector(selector);
   }
 
   bool analyzeMain(Element element) {
+    if (compiler.disableTypeInference) return true;
     bool result = internal.analyzeMain(element);
     if (internal.optimismState == OPTIMISTIC) return result;
     assert(internal.optimismState == RETRY);
@@ -348,6 +353,10 @@
       bool wasAnalyzed = analyzeCount.containsKey(element);
       if (wasAnalyzed) {
         recompiles++;
+        if (recompiles >= numberOfElementsToAnalyze) {
+          compiler.log('Ran out of budget for inferring.');
+          break;
+        }
         if (compiler.verbose) recomputeWatch.start();
       }
       bool changed =
@@ -812,7 +821,7 @@
       return isTypeValuable(result);
     });
     if (result == null) {
-      result = dynamicType;
+      result = new TypeMask.nonNullEmpty();
     }
     return result;
   }
diff --git a/sdk/lib/_internal/pub/lib/src/command_lish.dart b/sdk/lib/_internal/pub/lib/src/command_lish.dart
index 20bbdd8..8e4e09c 100644
--- a/sdk/lib/_internal/pub/lib/src/command_lish.dart
+++ b/sdk/lib/_internal/pub/lib/src/command_lish.dart
@@ -54,8 +54,8 @@
       return log.progress('Uploading', () {
         // TODO(nweiz): Cloud Storage can provide an XML-formatted error. We
         // should report that error and exit.
-        var newUri = server.resolve("/packages/versions/new.json");
-        return client.get(newUri).then((response) {
+        var newUri = server.resolve("/api/packages/versions/new");
+        return client.get(newUri, headers: PUB_API_HEADERS).then((response) {
           var parameters = parseJsonResponse(response);
 
           var url = _expectField(parameters, 'url', response);
@@ -78,7 +78,7 @@
           var location = response.headers['location'];
           if (location == null) throw new PubHttpException(response);
           return location;
-        }).then((location) => client.get(location))
+        }).then((location) => client.get(location, headers: PUB_API_HEADERS))
           .then(handleJsonSuccess);
       });
     }).catchError((error) {
diff --git a/sdk/lib/_internal/pub/lib/src/command_uploader.dart b/sdk/lib/_internal/pub/lib/src/command_uploader.dart
index c3b9be8..cb6bf8b 100644
--- a/sdk/lib/_internal/pub/lib/src/command_uploader.dart
+++ b/sdk/lib/_internal/pub/lib/src/command_uploader.dart
@@ -63,13 +63,16 @@
       var uploader = commandOptions.rest[0];
       return oauth2.withClient(cache, (client) {
         if (command == 'add') {
-          var url = server.resolve("/packages/${Uri.encodeComponent(package)}"
-              "/uploaders.json");
-          return client.post(url, fields: {"email": uploader});
+          var url = server.resolve("/api/packages/"
+              "${Uri.encodeComponent(package)}/uploaders");
+          return client.post(url,
+              headers: PUB_API_HEADERS,
+              fields: {"email": uploader});
         } else { // command == 'remove'
-          var url = server.resolve("/packages/${Uri.encodeComponent(package)}"
-              "/uploaders/${Uri.encodeComponent(uploader)}.json");
-          return client.delete(url);
+          var url = server.resolve("/api/packages/"
+              "${Uri.encodeComponent(package)}/uploaders/"
+              "${Uri.encodeComponent(uploader)}");
+          return client.delete(url, headers: PUB_API_HEADERS);
         }
       });
     }).then(handleJsonSuccess)
diff --git a/sdk/lib/_internal/pub/lib/src/hosted_source.dart b/sdk/lib/_internal/pub/lib/src/hosted_source.dart
index a5c9992..beabfd1 100644
--- a/sdk/lib/_internal/pub/lib/src/hosted_source.dart
+++ b/sdk/lib/_internal/pub/lib/src/hosted_source.dart
@@ -34,13 +34,13 @@
   /// site.
   Future<List<Version>> getVersions(String name, description) {
     var url = _makeUrl(description,
-        (server, package) => "$server/packages/$package.json");
+        (server, package) => "$server/api/packages/$package");
 
     log.io("Get versions from $url.");
-    return httpClient.read(url).then((body) {
+    return httpClient.read(url, headers: PUB_API_HEADERS).then((body) {
       var doc = json.parse(body);
       return doc['versions']
-          .map((version) => new Version.parse(version))
+          .map((version) => new Version.parse(version['version']))
           .toList();
     }).catchError((ex) {
       var parsed = _parseDescription(description);
@@ -53,15 +53,17 @@
   Future<Pubspec> describeUncached(PackageId id) {
     // Request it from the server.
     var url = _makeVersionUrl(id, (server, package, version) =>
-        "$server/packages/$package/versions/$version.yaml");
+        "$server/api/packages/$package/versions/$version");
 
     log.io("Describe package at $url.");
-    return httpClient.read(url).then((yaml) {
+    return httpClient.read(url, headers: PUB_API_HEADERS).then((version) {
+      version = json.parse(version);
+
       // TODO(rnystrom): After this is pulled down, we could place it in
       // a secondary cache of just pubspecs. This would let us have a
       // persistent cache for pubspecs for packages that haven't actually
       // been installed.
-      return new Pubspec.parse(null, yaml, systemCache.sources);
+      return new Pubspec.fromMap(version['pubspec'], systemCache.sources);
     }).catchError((ex) {
       var parsed = _parseDescription(id.description);
       _throwFriendlyError(ex, id, parsed.last);
diff --git a/sdk/lib/_internal/pub/lib/src/http.dart b/sdk/lib/_internal/pub/lib/src/http.dart
index 00fa952..e7da34c 100644
--- a/sdk/lib/_internal/pub/lib/src/http.dart
+++ b/sdk/lib/_internal/pub/lib/src/http.dart
@@ -14,6 +14,7 @@
 import 'io.dart';
 import 'log.dart' as log;
 import 'oauth2.dart' as oauth2;
+import 'sdk.dart' as sdk;
 import 'utils.dart';
 
 // TODO(nweiz): make this configurable
@@ -24,6 +25,13 @@
 /// Headers and field names that should be censored in the log output.
 final _CENSORED_FIELDS = const ['refresh_token', 'authorization'];
 
+/// Headers required for pub.dartlang.org API requests.
+///
+/// The Accept header tells pub.dartlang.org which version of the API we're
+/// expecting, so it can either serve that version or give us a 406 error if
+/// it's not supported.
+final PUB_API_HEADERS = const {'Accept': 'application/vnd.pub.v2+json'};
+
 /// Whether dart:io's SecureSocket has been initialized with pub's resources
 /// yet.
 bool _initializedSecureSocket = false;
@@ -54,8 +62,6 @@
       stackTrace = localStackTrace;
     }
 
-    // TODO(nweiz): Ideally the timeout would extend to reading from the
-    // response input stream, but until issue 3657 is fixed that's not feasible.
     return timeout(inner.send(request).then((streamedResponse) {
       _logResponse(streamedResponse);
 
@@ -69,6 +75,13 @@
         return streamedResponse;
       }
 
+      if (status == 406 &&
+          request.headers['Accept'] == PUB_API_HEADERS['Accept']) {
+        fail("Pub ${sdk.version} is incompatible with the current version of "
+                 "${request.url.host}.\n"
+             "Upgrade pub to the latest version and try again.");
+      }
+
       return http.Response.fromStream(streamedResponse).then((response) {
         throw new PubHttpException(response);
       });
diff --git a/sdk/lib/_internal/pub/lib/src/pubspec.dart b/sdk/lib/_internal/pub/lib/src/pubspec.dart
index e01cab1..2100cc6 100644
--- a/sdk/lib/_internal/pub/lib/src/pubspec.dart
+++ b/sdk/lib/_internal/pub/lib/src/pubspec.dart
@@ -74,6 +74,13 @@
   bool get isEmpty =>
     name == null && version == Version.none && dependencies.isEmpty;
 
+  /// Returns a Pubspec object for an already-parsed map representing its
+  /// contents.
+  ///
+  /// This will validate that [contents] is a valid pubspec.
+  factory Pubspec.fromMap(Map contents, SourceRegistry sources) =>
+    _parseMap(null, contents, sources);
+
   // TODO(rnystrom): Instead of allowing a null argument here, split this up
   // into load(), parse(), and _parse() like LockFile does.
   /// Parses the pubspec stored at [filePath] whose text is [contents]. If the
@@ -82,9 +89,6 @@
   /// file system.
   factory Pubspec.parse(String filePath, String contents,
       SourceRegistry sources) {
-    var name = null;
-    var version = Version.none;
-
     if (contents.trim() == '') return new Pubspec.empty();
 
     var parsedPubspec = loadYaml(contents);
@@ -94,123 +98,7 @@
       throw new FormatException('The pubspec must be a YAML mapping.');
     }
 
-    if (parsedPubspec.containsKey('name')) {
-      name = parsedPubspec['name'];
-      if (name is! String) {
-        throw new FormatException(
-            'The pubspec "name" field should be a string, but was "$name".');
-      }
-    }
-
-    if (parsedPubspec.containsKey('version')) {
-      version = new Version.parse(parsedPubspec['version']);
-    }
-
-    var dependencies = _parseDependencies(filePath, sources,
-        parsedPubspec['dependencies']);
-
-    var devDependencies = _parseDependencies(filePath, sources,
-        parsedPubspec['dev_dependencies']);
-
-    // Make sure the same package doesn't appear as both a regular and dev
-    // dependency.
-    var dependencyNames = dependencies.map((dep) => dep.name).toSet();
-    var collisions = dependencyNames.intersection(
-        devDependencies.map((dep) => dep.name).toSet());
-
-    if (!collisions.isEmpty) {
-      var packageNames;
-      if (collisions.length == 1) {
-        packageNames = 'Package "${collisions.first}"';
-      } else {
-        var names = collisions.toList();
-        names.sort();
-        var buffer = new StringBuffer();
-        buffer.write("Packages ");
-        for (var i = 0; i < names.length; i++) {
-          buffer.write('"');
-          buffer.write(names[i]);
-          buffer.write('"');
-          if (i == names.length - 2) {
-            buffer.write(", ");
-          } else if (i == names.length - 1) {
-            buffer.write(", and ");
-          }
-        }
-
-        packageNames = buffer.toString();
-      }
-      throw new FormatException(
-          '$packageNames cannot appear in both "dependencies" and '
-          '"dev_dependencies".');
-    }
-
-    var environmentYaml = parsedPubspec['environment'];
-    var sdkConstraint = VersionConstraint.any;
-    if (environmentYaml != null) {
-      if (environmentYaml is! Map) {
-        throw new FormatException(
-            'The pubspec "environment" field should be a map, but was '
-            '"$environmentYaml".');
-      }
-
-      var sdkYaml = environmentYaml['sdk'];
-      if (sdkYaml is! String) {
-        throw new FormatException(
-            'The "sdk" field of "environment" should be a string, but was '
-            '"$sdkYaml".');
-      }
-
-      sdkConstraint = new VersionConstraint.parse(sdkYaml);
-    }
-    var environment = new PubspecEnvironment(sdkConstraint);
-
-    // Even though the pub app itself doesn't use these fields, we validate
-    // them here so that users find errors early before they try to upload to
-    // the server:
-    // TODO(rnystrom): We should split this validation into separate layers:
-    // 1. Stuff that is required in any pubspec to perform any command. Things
-    //    like "must have a name". That should go here.
-    // 2. Stuff that is required to upload a package. Things like "homepage
-    //    must use a valid scheme". That should go elsewhere. pub upload should
-    //    call it, and we should provide a separate command to show the user,
-    //    and also expose it to the editor in some way.
-
-    if (parsedPubspec.containsKey('homepage')) {
-      _validateFieldUrl(parsedPubspec['homepage'], 'homepage');
-    }
-    if (parsedPubspec.containsKey('documentation')) {
-      _validateFieldUrl(parsedPubspec['documentation'], 'documentation');
-    }
-
-    if (parsedPubspec.containsKey('author') &&
-        parsedPubspec['author'] is! String) {
-      throw new FormatException(
-          'The "author" field should be a string, but was '
-          '${parsedPubspec["author"]}.');
-    }
-
-    if (parsedPubspec.containsKey('authors')) {
-      var authors = parsedPubspec['authors'];
-      if (authors is List) {
-        // All of the elements must be strings.
-        if (!authors.every((author) => author is String)) {
-          throw new FormatException('The "authors" field should be a string '
-              'or a list of strings, but was "$authors".');
-        }
-      } else if (authors is! String) {
-        throw new FormatException('The pubspec "authors" field should be a '
-            'string or a list of strings, but was "$authors".');
-      }
-
-      if (parsedPubspec.containsKey('author')) {
-        throw new FormatException('A pubspec should not have both an "author" '
-            'and an "authors" field.');
-      }
-    }
-
-    return new Pubspec(name, version, dependencies, devDependencies,
-        environment, parsedPubspec);
+    return _parseMap(filePath, parsedPubspec, sources);
   }
 }
 
@@ -231,6 +119,128 @@
   }
 }
 
+Pubspec _parseMap(String filePath, Map map, SourceRegistry sources) {
+  var name = null;
+  var version = Version.none;
+
+  if (map.containsKey('name')) {
+    name = map['name'];
+    if (name is! String) {
+      throw new FormatException(
+          'The pubspec "name" field should be a string, but was "$name".');
+    }
+  }
+
+  if (map.containsKey('version')) {
+    version = new Version.parse(map['version']);
+  }
+
+  var dependencies = _parseDependencies(filePath, sources,
+      map['dependencies']);
+
+  var devDependencies = _parseDependencies(filePath, sources,
+      map['dev_dependencies']);
+
+  // Make sure the same package doesn't appear as both a regular and dev
+  // dependency.
+  var dependencyNames = dependencies.map((dep) => dep.name).toSet();
+  var collisions = dependencyNames.intersection(
+      devDependencies.map((dep) => dep.name).toSet());
+
+  if (!collisions.isEmpty) {
+    var packageNames;
+    if (collisions.length == 1) {
+      packageNames = 'Package "${collisions.first}"';
+    } else {
+      var names = collisions.toList();
+      names.sort();
+      var buffer = new StringBuffer();
+      buffer.write("Packages ");
+      for (var i = 0; i < names.length; i++) {
+        buffer.write('"');
+        buffer.write(names[i]);
+        buffer.write('"');
+        if (i == names.length - 2) {
+          buffer.write(", ");
+        } else if (i == names.length - 1) {
+          buffer.write(", and ");
+        }
+      }
+
+      packageNames = buffer.toString();
+    }
+    throw new FormatException(
+        '$packageNames cannot appear in both "dependencies" and '
+        '"dev_dependencies".');
+  }
+
+  var environmentYaml = map['environment'];
+  var sdkConstraint = VersionConstraint.any;
+  if (environmentYaml != null) {
+    if (environmentYaml is! Map) {
+      throw new FormatException(
+          'The pubspec "environment" field should be a map, but was '
+          '"$environmentYaml".');
+    }
+
+    var sdkYaml = environmentYaml['sdk'];
+    if (sdkYaml is! String) {
+      throw new FormatException(
+          'The "sdk" field of "environment" should be a string, but was '
+          '"$sdkYaml".');
+    }
+
+    sdkConstraint = new VersionConstraint.parse(sdkYaml);
+  }
+  var environment = new PubspecEnvironment(sdkConstraint);
+
+  // Even though the pub app itself doesn't use these fields, we validate
+  // them here so that users find errors early before they try to upload to
+  // the server:
+  // TODO(rnystrom): We should split this validation into separate layers:
+  // 1. Stuff that is required in any pubspec to perform any command. Things
+  //    like "must have a name". That should go here.
+  // 2. Stuff that is required to upload a package. Things like "homepage
+  //    must use a valid scheme". That should go elsewhere. pub upload should
+  //    call it, and we should provide a separate command to show the user,
+  //    and also expose it to the editor in some way.
+
+  if (map.containsKey('homepage')) {
+    _validateFieldUrl(map['homepage'], 'homepage');
+  }
+  if (map.containsKey('documentation')) {
+    _validateFieldUrl(map['documentation'], 'documentation');
+  }
+
+  if (map.containsKey('author') && map['author'] is! String) {
+    throw new FormatException(
+        'The "author" field should be a string, but was '
+        '${map["author"]}.');
+  }
+
+  if (map.containsKey('authors')) {
+    var authors = map['authors'];
+    if (authors is List) {
+      // All of the elements must be strings.
+      if (!authors.every((author) => author is String)) {
+        throw new FormatException('The "authors" field should be a string '
+            'or a list of strings, but was "$authors".');
+      }
+    } else if (authors is! String) {
+      throw new FormatException('The pubspec "authors" field should be a '
+          'string or a list of strings, but was "$authors".');
+    }
+
+    if (map.containsKey('author')) {
+      throw new FormatException('A pubspec should not have both an "author" '
+          'and an "authors" field.');
+    }
+  }
+
+  return new Pubspec(name, version, dependencies, devDependencies,
+      environment, map);
+}
+
 List<PackageDep> _parseDependencies(String pubspecPath, SourceRegistry sources,
     yaml) {
   var dependencies = <PackageDep>[];
diff --git a/sdk/lib/_internal/pub/test/deploy/copies_dart_js_next_to_entrypoints_test.dart b/sdk/lib/_internal/pub/test/deploy/copies_dart_js_next_to_entrypoints_test.dart
index 7eecff3..417233b 100644
--- a/sdk/lib/_internal/pub/test/deploy/copies_dart_js_next_to_entrypoints_test.dart
+++ b/sdk/lib/_internal/pub/test/deploy/copies_dart_js_next_to_entrypoints_test.dart
@@ -19,11 +19,24 @@
     currentSchedule.timeout *= 3;
 
     serve([
+      d.dir('api', [
+        d.dir('packages', [
+          d.file('browser', json.stringify({
+            'versions': [packageVersionApiMap(packageMap('browser', '1.0.0'))]
+          })),
+          d.dir('browser', [
+            d.dir('versions', [
+              d.file('1.0.0', json.stringify(
+                  packageVersionApiMap(
+                      packageMap('browser', '1.0.0'),
+                      full: true)))
+            ])
+          ])
+        ])
+      ]),
       d.dir('packages', [
-        d.file('browser.json', json.stringify({'versions': ['1.0.0']})),
         d.dir('browser', [
           d.dir('versions', [
-            d.file('1.0.0.yaml', yaml(packageMap("browser", "1.0.0"))),
             d.tar('1.0.0.tar.gz', [
               d.file('pubspec.yaml', yaml(packageMap("browser", "1.0.0"))),
               d.dir('lib', [
diff --git a/sdk/lib/_internal/pub/test/descriptor/tar.dart b/sdk/lib/_internal/pub/test/descriptor/tar.dart
index 02eca7c..0dd8b82 100644
--- a/sdk/lib/_internal/pub/test/descriptor/tar.dart
+++ b/sdk/lib/_internal/pub/test/descriptor/tar.dart
@@ -15,7 +15,8 @@
 import '../../lib/src/utils.dart';
 
 /// Describes a tar file and its contents.
-class TarFileDescriptor extends DirectoryDescriptor {
+class TarFileDescriptor extends DirectoryDescriptor
+    implements ReadableDescriptor {
   TarFileDescriptor(String name, List<Descriptor> contents)
       : super(name, contents);
 
diff --git a/sdk/lib/_internal/pub/test/hosted/version_negotiation_test.dart b/sdk/lib/_internal/pub/test/hosted/version_negotiation_test.dart
new file mode 100644
index 0000000..2e51f7b
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/hosted/version_negotiation_test.dart
@@ -0,0 +1,68 @@
+// 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 pub_tests;
+
+import 'dart:io';
+
+import 'package:scheduled_test/scheduled_server.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+
+  forBothPubInstallAndUpdate((command) {
+    integration('sends the correct Accept header', () {
+      var server = new ScheduledServer();
+
+      d.appDir([{
+        "hosted": {
+          "name": "foo",
+          "url": server.url.then((url) => url.toString())
+        }
+      }]).create();
+
+      var pub = startPub(args: [command.name]);
+
+      server.handle('GET', '/api/packages/foo', (request) {
+        expect(request.headers['Accept'], ['application/vnd.pub.v2+json']);
+      });
+
+      pub.kill();
+    });
+
+    integration('prints a friendly error if the version is out-of-date', () {
+      var server = new ScheduledServer();
+
+      d.appDir([{
+        "hosted": {
+          "name": "foo",
+          "url": server.url.then((url) => url.toString())
+        }
+      }]).create();
+
+      var pub = startPub(args: [command.name]);
+
+      server.handle('GET', '/api/packages/foo', (request) {
+        request.response.statusCode = 406;
+        request.response.close();
+      });
+
+      // TODO(nweiz): this shouldn't request the versions twice (issue 11077).
+      server.handle('GET', '/api/packages/foo', (request) {
+        request.response.statusCode = 406;
+        request.response.close();
+      });
+
+      pub.shouldExit(1);
+
+      expect(pub.remainingStderr(), completion(equals(
+          "Pub 0.1.2+3 is incompatible with the current version of localhost.\n"
+          "Upgrade pub to the latest version and try again.")));
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/lish/upload_form_provides_an_error_test.dart b/sdk/lib/_internal/pub/test/lish/upload_form_provides_an_error_test.dart
index 6a3b2a1..c2d753b 100644
--- a/sdk/lib/_internal/pub/test/lish/upload_form_provides_an_error_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/upload_form_provides_an_error_test.dart
@@ -22,7 +22,7 @@
 
     confirmPublish(pub);
 
-    server.handle('GET', '/packages/versions/new.json', (request) {
+    server.handle('GET', '/api/packages/versions/new', (request) {
       request.response.statusCode = 400;
       request.response.write(json.stringify({
         'error': {'message': 'your request sucked'}
diff --git a/sdk/lib/_internal/pub/test/lish/upload_form_provides_invalid_json_test.dart b/sdk/lib/_internal/pub/test/lish/upload_form_provides_invalid_json_test.dart
index 3f2c486..3a1b2cb 100644
--- a/sdk/lib/_internal/pub/test/lish/upload_form_provides_invalid_json_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/upload_form_provides_invalid_json_test.dart
@@ -22,7 +22,7 @@
 
     confirmPublish(pub);
 
-    server.handle('GET', '/packages/versions/new.json', (request) {
+    server.handle('GET', '/api/packages/versions/new', (request) {
       request.response.write('{not json');
       request.response.close();
     });
diff --git a/sdk/lib/_internal/pub/test/lish/utils.dart b/sdk/lib/_internal/pub/test/lish/utils.dart
index ba921e2..6ee3f5e 100644
--- a/sdk/lib/_internal/pub/test/lish/utils.dart
+++ b/sdk/lib/_internal/pub/test/lish/utils.dart
@@ -14,7 +14,7 @@
 import '../test_pub.dart';
 
 void handleUploadForm(ScheduledServer server, [Map body]) {
-  server.handle('GET', '/packages/versions/new.json', (request) {
+  server.handle('GET', '/api/packages/versions/new', (request) {
     return server.url.then((url) {
       expect(request.headers.value('authorization'),
           equals('Bearer access token'));
diff --git a/sdk/lib/_internal/pub/test/oauth2/with_a_malformed_credentials_authenticates_again_test.dart b/sdk/lib/_internal/pub/test/oauth2/with_a_malformed_credentials_authenticates_again_test.dart
index e207d1b..574117b 100644
--- a/sdk/lib/_internal/pub/test/oauth2/with_a_malformed_credentials_authenticates_again_test.dart
+++ b/sdk/lib/_internal/pub/test/oauth2/with_a_malformed_credentials_authenticates_again_test.dart
@@ -29,7 +29,7 @@
     confirmPublish(pub);
     authorizePub(pub, server, "new access token");
 
-    server.handle('GET', '/packages/versions/new.json', (request) {
+    server.handle('GET', '/api/packages/versions/new', (request) {
       expect(request.headers.value('authorization'),
           equals('Bearer new access token'));
 
diff --git a/sdk/lib/_internal/pub/test/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart b/sdk/lib/_internal/pub/test/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart
index 853d7d9..35653ff 100644
--- a/sdk/lib/_internal/pub/test/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart
+++ b/sdk/lib/_internal/pub/test/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart
@@ -24,7 +24,7 @@
     var pub = startPublish(server);
     confirmPublish(pub);
 
-    server.handle('GET', '/packages/versions/new.json', (request) {
+    server.handle('GET', '/api/packages/versions/new', (request) {
       expect(request.headers.value('authorization'),
           equals('Bearer access token'));
 
diff --git a/sdk/lib/_internal/pub/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart b/sdk/lib/_internal/pub/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart
index 1a103e9..bbfdc64 100644
--- a/sdk/lib/_internal/pub/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart
+++ b/sdk/lib/_internal/pub/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart
@@ -45,7 +45,7 @@
     expect(pub.nextLine(), completion(matches(r'Uploading\.\.\.+')));
     authorizePub(pub, server, 'new access token');
 
-    server.handle('GET', '/packages/versions/new.json', (request) {
+    server.handle('GET', '/api/packages/versions/new', (request) {
       expect(request.headers.value('authorization'),
           equals('Bearer new access token'));
 
diff --git a/sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart b/sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart
index 7622e474..17eed6f 100644
--- a/sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart
+++ b/sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart
@@ -45,7 +45,7 @@
       });
     });
 
-    server.handle('GET', '/packages/versions/new.json', (request) {
+    server.handle('GET', '/api/packages/versions/new', (request) {
       expect(request.headers.value('authorization'),
           equals('Bearer new access token'));
 
diff --git a/sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart b/sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart
index a844eff..0961868 100644
--- a/sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart
+++ b/sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart
@@ -32,7 +32,7 @@
           "packages has expired and can't be automatically refreshed.")));
     authorizePub(pub, server, "new access token");
 
-    server.handle('GET', '/packages/versions/new.json', (request) {
+    server.handle('GET', '/api/packages/versions/new', (request) {
       expect(request.headers.value('authorization'),
           equals('Bearer new access token'));
 
diff --git a/sdk/lib/_internal/pub/test/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart b/sdk/lib/_internal/pub/test/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart
index ebba5dc..1790e85 100644
--- a/sdk/lib/_internal/pub/test/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart
+++ b/sdk/lib/_internal/pub/test/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart
@@ -24,7 +24,7 @@
     confirmPublish(pub);
     authorizePub(pub, server);
 
-    server.handle('GET', '/packages/versions/new.json', (request) {
+    server.handle('GET', '/api/packages/versions/new', (request) {
       expect(request.headers.value('authorization'),
           equals('Bearer access token'));
 
diff --git a/sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart b/sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
index a5a8e04..6457091 100644
--- a/sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
+++ b/sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
@@ -25,7 +25,7 @@
 
     confirmPublish(pub);
 
-    server.handle('GET', '/packages/versions/new.json', (request) {
+    server.handle('GET', '/api/packages/versions/new', (request) {
       var response = request.response;
       response.statusCode = 401;
       response.headers.set('www-authenticate', 'Bearer error="invalid_token",'
diff --git a/sdk/lib/_internal/pub/test/pub_uploader_test.dart b/sdk/lib/_internal/pub/test/pub_uploader_test.dart
index 7da77c2..741abf0 100644
--- a/sdk/lib/_internal/pub/test/pub_uploader_test.dart
+++ b/sdk/lib/_internal/pub/test/pub_uploader_test.dart
@@ -58,7 +58,7 @@
     d.credentialsFile(server, 'access token').create();
     var pub = startPubUploader(server, ['--package', 'pkg', 'add', 'email']);
 
-    server.handle('POST', '/packages/pkg/uploaders.json', (request) {
+    server.handle('POST', '/api/packages/pkg/uploaders', (request) {
       expect(new ByteStream(request).toBytes().then((bodyBytes) {
         expect(new String.fromCharCodes(bodyBytes), equals('email=email'));
 
@@ -80,7 +80,7 @@
     d.credentialsFile(server, 'access token').create();
     var pub = startPubUploader(server, ['--package', 'pkg', 'remove', 'email']);
 
-    server.handle('DELETE', '/packages/pkg/uploaders/email.json', (request) {
+    server.handle('DELETE', '/api/packages/pkg/uploaders/email', (request) {
       request.response.headers.contentType =
           new ContentType("application", "json");
       request.response.write(json.stringify({
@@ -100,7 +100,7 @@
     d.credentialsFile(server, 'access token').create();
     var pub = startPubUploader(server, ['add', 'email']);
 
-    server.handle('POST', '/packages/test_pkg/uploaders.json', (request) {
+    server.handle('POST', '/api/packages/test_pkg/uploaders', (request) {
       request.response.headers.contentType =
           new ContentType("application", "json");
       request.response.write(json.stringify({
@@ -118,7 +118,7 @@
     d.credentialsFile(server, 'access token').create();
     var pub = startPubUploader(server, ['--package', 'pkg', 'add', 'email']);
 
-    server.handle('POST', '/packages/pkg/uploaders.json', (request) {
+    server.handle('POST', '/api/packages/pkg/uploaders', (request) {
       request.response.statusCode = 400;
       request.response.headers.contentType =
           new ContentType("application", "json");
@@ -138,7 +138,7 @@
     var pub = startPubUploader(server,
         ['--package', 'pkg', 'remove', 'e/mail']);
 
-    server.handle('DELETE', '/packages/pkg/uploaders/e%2Fmail.json', (request) {
+    server.handle('DELETE', '/api/packages/pkg/uploaders/e%2Fmail', (request) {
       request.response.statusCode = 400;
       request.response.headers.contentType =
           new ContentType("application", "json");
@@ -157,7 +157,7 @@
     d.credentialsFile(server, 'access token').create();
     var pub = startPubUploader(server, ['--package', 'pkg', 'add', 'email']);
 
-    server.handle('POST', '/packages/pkg/uploaders.json', (request) {
+    server.handle('POST', '/api/packages/pkg/uploaders', (request) {
       request.response.write("{not json");
       request.response.close();
     });
@@ -172,7 +172,7 @@
     d.credentialsFile(server, 'access token').create();
     var pub = startPubUploader(server, ['--package', 'pkg', 'remove', 'email']);
 
-    server.handle('DELETE', '/packages/pkg/uploaders/email.json', (request) {
+    server.handle('DELETE', '/api/packages/pkg/uploaders/email', (request) {
       request.response.write("{not json");
       request.response.close();
     });
diff --git a/sdk/lib/_internal/pub/test/test_pub.dart b/sdk/lib/_internal/pub/test/test_pub.dart
index 1a784e7..0414397 100644
--- a/sdk/lib/_internal/pub/test/test_pub.dart
+++ b/sdk/lib/_internal/pub/test/test_pub.dart
@@ -147,16 +147,26 @@
   return sleep(10);
 }
 
-/// The [d.DirectoryDescriptor] describing the server layout of packages that
-/// are being served via [servePackages]. This is `null` if [servePackages] has
-/// not yet been called for this test.
+/// The [d.DirectoryDescriptor] describing the server layout of `/api/packages`
+/// on the test server.
+///
+/// This contains metadata for packages that are being served via
+/// [servePackages]. It's `null` if [servePackages] has not yet been called for
+/// this test.
+d.DirectoryDescriptor _servedApiPackageDir;
+
+/// The [d.DirectoryDescriptor] describing the server layout of `/packages` on
+/// the test server.
+///
+/// This contains the tarballs for packages that are being served via
+/// [servePackages]. It's `null` if [servePackages] has not yet been called for
+/// this test.
 d.DirectoryDescriptor _servedPackageDir;
 
-/// A map from package names to version numbers to YAML-serialized pubspecs for
-/// those packages. This represents the packages currently being served by
-/// [servePackages], and is `null` if [servePackages] has not yet been called
-/// for this test.
-Map<String, Map<String, String>> _servedPackages;
+/// A map from package names to parsed pubspec maps for those packages. This
+/// represents the packages currently being served by [servePackages], and is
+/// `null` if [servePackages] has not yet been called for this test.
+Map<String, List<Map>> _servedPackages;
 
 /// Creates an HTTP server that replicates the structure of pub.dartlang.org.
 /// [pubspecs] is a list of unserialized pubspecs representing the packages to
@@ -166,12 +176,17 @@
 /// are being served. Previous packages will continue to be served.
 void servePackages(List<Map> pubspecs) {
   if (_servedPackages == null || _servedPackageDir == null) {
-    _servedPackages = <String, Map<String, String>>{};
+    _servedPackages = <String, List<Map>>{};
+    _servedApiPackageDir = d.dir('packages', []);
     _servedPackageDir = d.dir('packages', []);
-    serve([_servedPackageDir]);
+    serve([
+      d.dir('api', [_servedApiPackageDir]),
+      _servedPackageDir
+    ]);
 
     currentSchedule.onComplete.schedule(() {
       _servedPackages = null;
+      _servedApiPackageDir = null;
       _servedPackageDir = null;
     }, 'cleaning up served packages');
   }
@@ -181,28 +196,36 @@
       for (var spec in resolvedPubspecs) {
         var name = spec['name'];
         var version = spec['version'];
-        var versions = _servedPackages.putIfAbsent(
-            name, () => <String, String>{});
-        versions[version] = yaml(spec);
+        var versions = _servedPackages.putIfAbsent(name, () => []);
+        versions.add(spec);
       }
 
+      _servedApiPackageDir.contents.clear();
       _servedPackageDir.contents.clear();
       for (var name in _servedPackages.keys) {
-        var versions = _servedPackages[name].keys.toList();
-        _servedPackageDir.contents.addAll([
-          d.file('$name.json', json.stringify({'versions': versions})),
+        _servedApiPackageDir.contents.addAll([
+          d.file('$name', json.stringify({
+            'name': name,
+            'uploaders': ['nweiz@google.com'],
+            'versions': _servedPackages[name].map(packageVersionApiMap).toList()
+          })),
           d.dir(name, [
-            d.dir('versions', flatten(versions.map((version) {
-              return [
-                d.file('$version.yaml', _servedPackages[name][version]),
-                d.tar('$version.tar.gz', [
-                  d.file('pubspec.yaml', _servedPackages[name][version]),
-                  d.libDir(name, '$name $version')
-                ])
-              ];
-            })))
+            d.dir('versions', _servedPackages[name].map((pubspec) {
+              return d.file(pubspec['version'], json.stringify(
+                  packageVersionApiMap(pubspec, full: true)));
+            }))
           ])
         ]);
+
+        _servedPackageDir.contents.add(d.dir(name, [
+          d.dir('versions', _servedPackages[name].map((pubspec) {
+            var version = pubspec['version'];
+            return d.tar('$version.tar.gz', [
+              d.file('pubspec.yaml', json.stringify(pubspec)),
+              d.libDir(name, '$name $version')
+            ]);
+          }))
+        ]));
       }
     });
   }, 'initializing the package server');
@@ -632,6 +655,37 @@
   }
 }
 
+/// Returns a Map in the format used by the pub.dartlang.org API to represent a
+/// package version.
+///
+/// [pubspec] is the parsed pubspec of the package version. If [full] is true,
+/// this returns the complete map, including metadata that's only included when
+/// requesting the package version directly.
+Map packageVersionApiMap(Map pubspec, {bool full: false}) {
+  var name = pubspec['name'];
+  var version = pubspec['version'];
+  var map = {
+    'pubspec': pubspec,
+    'version': version,
+    'url': '/api/packages/$name/versions/$version',
+    'archive_url': '/packages/$name/versions/$version.tar.gz',
+    'new_dartdoc_url': '/api/packages/$name/versions/$version'
+        '/new_dartdoc',
+    'package_url': '/api/packages/$name'
+  };
+
+  if (full) {
+    mapAddAll(map, {
+      'downloads': 0,
+      'created': '2012-09-25T18:38:28.685260',
+      'libraries': ['$name.dart'],
+      'uploader': ['nweiz@google.com']
+    });
+  }
+
+  return map;
+}
+
 /// Compares the [actual] output from running pub with [expected]. For [String]
 /// patterns, ignores leading and trailing whitespace differences and tries to
 /// report the offending difference in a nice way. For other [Pattern]s, just
diff --git a/sdk/lib/_internal/pub/test/validator/dependency_test.dart b/sdk/lib/_internal/pub/test/validator/dependency_test.dart
index 9eba069..89f1bf7 100644
--- a/sdk/lib/_internal/pub/test/validator/dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/validator/dependency_test.dart
@@ -35,7 +35,7 @@
 setUpDependency(Map dep, {List<String> hostedVersions}) {
   useMockClient(new MockClient((request) {
     expect(request.method, equals("GET"));
-    expect(request.url.path, equals("/packages/foo.json"));
+    expect(request.url.path, equals("/api/packages/foo"));
 
     if (hostedVersions == null) {
       return new Future.value(new http.Response("not found", 404));
@@ -43,7 +43,8 @@
       return new Future.value(new http.Response(json.stringify({
         "name": "foo",
         "uploaders": ["nweiz@google.com"],
-        "versions": hostedVersions
+        "versions": hostedVersions.map((version) =>
+            packageVersionApiMap(packageMap('foo', version))).toList()
       }), 200));
     }
   }));
diff --git a/sdk/lib/core/errors.dart b/sdk/lib/core/errors.dart
index 34fcaed..060eba7 100644
--- a/sdk/lib/core/errors.dart
+++ b/sdk/lib/core/errors.dart
@@ -229,16 +229,23 @@
   String toString() => "Out of Memory";
 }
 
+
 class StackOverflowError implements Error {
   const StackOverflowError();
   String toString() => "Stack Overflow";
 }
 
 /**
- * Error thrown when a runtime error occurs.
+ * Error thrown when a lazily initialized variable cannot be initialized.
+ *
+ * A static/library variable with an initializer expression is initialized
+ * the first time it is read. If evaluating the initializer expression causes
+ * another read of the variable, this error is thrown.
  */
-class RuntimeError implements Error {
-  final message;
-  RuntimeError(this.message);
-  String toString() => "RuntimeError: $message";
+class CyclicInitializationError implements Error {
+  final String variableName;
+  const CyclicInitializationError([this.variableName]);
+  String toString() => variableName == null
+      ? "Reading static variable during its initialization"
+      : "Reading static variable '$variableName' during its initialization";
 }
diff --git a/sdk/lib/core/uri.dart b/sdk/lib/core/uri.dart
index c8277e7..a7926dd 100644
--- a/sdk/lib/core/uri.dart
+++ b/sdk/lib/core/uri.dart
@@ -82,6 +82,16 @@
   final String fragment;
 
   /**
+   * Cache the computed return value of [pathSegements].
+   */
+  List<String> _pathSegments;
+
+  /**
+   * Cache the computed return value of [queryParameters].
+   */
+  Map<String, String> _queryParameters;
+
+  /**
    * Creates a new URI object by parsing a URI string.
    */
   static Uri parse(String uri) => new Uri._fromMatch(_splitRe.firstMatch(uri));
@@ -167,10 +177,19 @@
    * Returns the URI path split into its segments. Each of the
    * segments in the returned list have been decoded. If the path is
    * empty the empty list will be returned.
+   *
+   * The returned list is immutable and will throw [StateError] on any
+   * calls that would mutate it.
    */
   List<String> get pathSegments {
-    if (path == "") return const<String>[];
-    return path.split("/").map(Uri.decodeComponent).toList(growable: false);
+    if (_pathSegments == null) {
+      _pathSegments = new UnmodifiableListView(
+        path == "" ? const<String>[]
+                   : path.split("/")
+                         .map(Uri.decodeComponent)
+                         .toList(growable: false));
+    }
+    return _pathSegments;
   }
 
   /*
@@ -178,19 +197,27 @@
    * specified for FORM post in the HTML 4.01 specification. Each key
    * and value in the returned map have been decoded. If there is no
    * query the empty map will be returned.
+   *
+   * The returned map is immutable and will throw [StateError] on any
+   * calls that would mutate it.
    */
   Map<String, String> get queryParameters {
-    return query.split("&").fold({}, (map, element) {
+    if (_queryParameters == null) {
+      var map;
+      map = query.split("&").fold({}, (map, element) {
         int index = element.indexOf("=");
         if (index == -1) {
-          if (!element.isEmpty) map[element] = "";
+          if (!element.isEmpty) map[decodeQueryComponent(element)] = "";
         } else if (index != 0) {
           var key = element.substring(0, index);
           var value = element.substring(index + 1);
           map[Uri.decodeQueryComponent(key)] = decodeQueryComponent(value);
         }
         return map;
-    });
+      });
+      _queryParameters = new _UnmodifiableMap(map);
+    }
+    return _queryParameters;
   }
 
   static String _makeScheme(String scheme) {
@@ -310,17 +337,18 @@
     int length = component.length;
     int index = 0;
     int prevIndex = 0;
-    while (index < length) {
 
-      // Copy a part of the component string to the result.
-      fillResult() {
-        if (result == null) {
-          assert(prevIndex == 0);
-          result = new StringBuffer(component.substring(prevIndex, index));
-        } else {
-          result.write(component.substring(prevIndex, index));
-        }
+    // Copy a part of the component string to the result.
+    void fillResult() {
+      if (result == null) {
+        assert(prevIndex == 0);
+        result = new StringBuffer(component.substring(prevIndex, index));
+      } else {
+        result.write(component.substring(prevIndex, index));
       }
+    }
+
+    while (index < length) {
 
       // Normalize percent encoding to uppercase and don't encode
       // unreserved characters.
@@ -353,6 +381,7 @@
         index++;
       }
     }
+    if (result != null && prevIndex != index) fillResult();
     assert(index == length);
 
     if (result == null) return component;
@@ -944,3 +973,30 @@
                 //              pqrstuvwxyz   ~
       0x47ff];  // 0x70 - 0x7f  1111111111100010
 }
+
+class _UnmodifiableMap<K, V> implements Map<K, V> {
+  final Map _map;
+  const _UnmodifiableMap(this._map);
+
+  bool containsValue(V value) => _map.containsValue(value);
+  bool containsKey(K key) => _map.containsKey(key);
+  V operator [](K 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");
+  }
+  V remove(K 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/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 084abb2..ea38b93d 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -433,7 +433,7 @@
   @DomName('HTMLAudioElement.HTMLAudioElement')
   @DocsEditable
   factory AudioElement([String src]) {
-    if (?src) {
+    if (src != null) {
       return AudioElement._create_1(src);
     }
     return AudioElement._create_2();
@@ -475,12 +475,12 @@
 
 
 @DocsEditable
-@DomName('BarInfo')
-// http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#barprop (Rename to BarProp?)
-@Experimental // non-standard
-class BarInfo native "BarInfo" {
+@DomName('BarProp')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#barprop
+@deprecated // standard
+class BarProp native "BarProp" {
 
-  @DomName('BarInfo.visible')
+  @DomName('BarProp.visible')
   @DocsEditable
   final bool visible;
 }
@@ -770,12 +770,12 @@
 
 @DocsEditable
 @DomName('Canvas2DContextAttributes')
-@Experimental // untriaged
+// http://wiki.whatwg.org/wiki/CanvasOpaque#Suggested_IDL
+@Experimental
 class Canvas2DContextAttributes native "Canvas2DContextAttributes" {
 
   @DomName('Canvas2DContextAttributes.alpha')
   @DocsEditable
-  @Experimental // untriaged
   bool alpha;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -808,7 +808,7 @@
   @DomName('HTMLCanvasElement.getContext')
   @DocsEditable
   CanvasRenderingContext getContext(String contextId, [Map attrs]) {
-    if (?attrs) {
+    if (attrs != null) {
       var attrs_1 = convertDartToNative_Dictionary(attrs);
       return _getContext_1(contextId, attrs_1);
     }
@@ -1130,7 +1130,7 @@
   @DocsEditable
   @Creates('ImageData|=Object')
   ImageData createImageData(num sw, num sh) {
-    return _convertNativeToDart_ImageData(_createImageData_1(sw, sh));
+    return convertNativeToDart_ImageData(_createImageData_1(sw, sh));
   }
   @JSName('createImageData')
   @DomName('CanvasRenderingContext2D.createImageData')
@@ -1142,8 +1142,8 @@
   @DocsEditable
   @Creates('ImageData|=Object')
   ImageData createImageDataFromImageData(ImageData imagedata) {
-    var imagedata_1 = _convertDartToNative_ImageData(imagedata);
-    return _convertNativeToDart_ImageData(_createImageDataFromImageData_1(imagedata_1));
+    var imagedata_1 = convertDartToNative_ImageData(imagedata);
+    return convertNativeToDart_ImageData(_createImageDataFromImageData_1(imagedata_1));
   }
   @JSName('createImageData')
   @DomName('CanvasRenderingContext2D.createImageData')
@@ -1177,14 +1177,15 @@
 
   @DomName('CanvasRenderingContext2D.getContextAttributes')
   @DocsEditable
-  @Experimental // untriaged
+  // http://wiki.whatwg.org/wiki/CanvasOpaque#Suggested_IDL
+  @Experimental
   Canvas2DContextAttributes getContextAttributes() native;
 
   @DomName('CanvasRenderingContext2D.getImageData')
   @DocsEditable
   @Creates('ImageData|=Object')
   ImageData getImageData(num sx, num sy, num sw, num sh) {
-    return _convertNativeToDart_ImageData(_getImageData_1(sx, sy, sw, sh));
+    return convertNativeToDart_ImageData(_getImageData_1(sx, sy, sw, sh));
   }
   @JSName('getImageData')
   @DomName('CanvasRenderingContext2D.getImageData')
@@ -1219,13 +1220,13 @@
   @DomName('CanvasRenderingContext2D.putImageData')
   @DocsEditable
   void putImageData(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) {
-    if (!?dirtyX && !?dirtyY && !?dirtyWidth && !?dirtyHeight) {
-      var imagedata_1 = _convertDartToNative_ImageData(imagedata);
+    if (dirtyX == null && dirtyY == null && dirtyWidth == null && dirtyHeight == null) {
+      var imagedata_1 = convertDartToNative_ImageData(imagedata);
       _putImageData_1(imagedata_1, dx, dy);
       return;
     }
-    if (?dirtyX && ?dirtyY && ?dirtyWidth && ?dirtyHeight) {
-      var imagedata_2 = _convertDartToNative_ImageData(imagedata);
+    if (dirtyHeight != null && dirtyWidth != null && dirtyY != null && dirtyX != null) {
+      var imagedata_2 = convertDartToNative_ImageData(imagedata);
       _putImageData_2(imagedata_2, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
       return;
     }
@@ -1278,7 +1279,7 @@
 
   @DomName('CanvasRenderingContext2D.strokeRect')
   @DocsEditable
-  void strokeRect(num x, num y, num width, num height, [num lineWidth]) native;
+  void strokeRect(num x, num y, num width, num height) native;
 
   @DomName('CanvasRenderingContext2D.strokeText')
   @DocsEditable
@@ -1299,7 +1300,7 @@
   @Experimental
   @Creates('ImageData|=Object')
   ImageData getImageDataHD(num sx, num sy, num sw, num sh) {
-    return _convertNativeToDart_ImageData(_getImageDataHD_1(sx, sy, sw, sh));
+    return convertNativeToDart_ImageData(_getImageDataHD_1(sx, sy, sw, sh));
   }
   @JSName('webkitGetImageDataHD')
   @DomName('CanvasRenderingContext2D.webkitGetImageDataHD')
@@ -1316,13 +1317,13 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
   void putImageDataHD(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) {
-    if (!?dirtyX && !?dirtyY && !?dirtyWidth && !?dirtyHeight) {
-      var imagedata_1 = _convertDartToNative_ImageData(imagedata);
+    if (dirtyX == null && dirtyY == null && dirtyWidth == null && dirtyHeight == null) {
+      var imagedata_1 = convertDartToNative_ImageData(imagedata);
       _putImageDataHD_1(imagedata_1, dx, dy);
       return;
     }
-    if (?dirtyX && ?dirtyY && ?dirtyWidth && ?dirtyHeight) {
-      var imagedata_2 = _convertDartToNative_ImageData(imagedata);
+    if (dirtyHeight != null && dirtyWidth != null && dirtyY != null && dirtyX != null) {
+      var imagedata_2 = convertDartToNative_ImageData(imagedata);
       _putImageDataHD_2(imagedata_2, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
       return;
     }
@@ -1574,6 +1575,14 @@
   @DocsEditable
   final int length;
 
+  @DomName('CharacterData.nextElementSibling')
+  @DocsEditable
+  final Element nextElementSibling;
+
+  @DomName('CharacterData.previousElementSibling')
+  @DocsEditable
+  final Element previousElementSibling;
+
   @DomName('CharacterData.appendData')
   @DocsEditable
   void appendData(String data) native;
@@ -1623,6 +1632,17 @@
 @DocsEditable
 @DomName('Comment')
 class Comment extends CharacterData native "Comment" {
+
+  @DomName('Comment.Comment')
+  @DocsEditable
+  factory Comment([String data]) {
+    if (data != null) {
+      return Comment._create_1(data);
+    }
+    return Comment._create_2();
+  }
+  static Comment _create_1(data) => JS('Comment', 'new Comment(#)', data);
+  static Comment _create_2() => JS('Comment', 'new Comment()');
 }
 // 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
@@ -1631,17 +1651,16 @@
 
 @DocsEditable
 @DomName('Composition')
-@Experimental // untriaged
+// http://www.w3.org/TR/ime-api/#idl-def-Composition
+@Experimental
 class Composition native "Composition" {
 
   @DomName('Composition.caret')
   @DocsEditable
-  @Experimental // untriaged
   final Range caret;
 
   @DomName('Composition.text')
   @DocsEditable
-  @Experimental // untriaged
   final Node text;
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -1690,10 +1709,6 @@
   MemoryInfo get memory => _isConsoleDefined ?
       JS('MemoryInfo', 'console.memory') : null;
 
-  @DomName('Console.profiles')
-  List<ScriptProfile> get profiles => _isConsoleDefined ?
-      JS('List<ScriptProfile>', 'console.profiles') : null;
-
   @DomName('Console.assertCondition')
   void assertCondition(bool condition, Object arg) => _isConsoleDefined ?
       JS('void', 'console.assertCondition(#, #)', condition, arg) : null;
@@ -1880,12 +1895,12 @@
 
 @DocsEditable
 @DomName('CSS')
-@Experimental // untriaged
+// http://www.w3.org/TR/css3-conditional/#the-css-interface
+@Experimental // None
 class Css native "CSS" {
 
   @DomName('CSS.supports')
   @DocsEditable
-  @Experimental // untriaged
   bool supports(String conditionText_OR_property, [String value]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2043,6 +2058,14 @@
   @DocsEditable
   String name;
 
+  @JSName('None')
+  @DomName('WebKitCSSKeyframesRule')
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental
+  // http://www.w3.org/TR/css3-animations/#csskeyframesrule
+  CssKeyframeRule item(int index) native;
+
   @DomName('WebKitCSSKeyframesRule.deleteRule')
   @DocsEditable
   void deleteRule(String key) native;
@@ -2159,7 +2182,6 @@
 
   @DomName('CSSRule.SUPPORTS_RULE')
   @DocsEditable
-  @Experimental // untriaged
   static const int SUPPORTS_RULE = 12;
 
   @DomName('CSSRule.UNKNOWN_RULE')
@@ -2215,9 +2237,13 @@
 
 @DomName('CSSStyleDeclaration')
 class CssStyleDeclaration native "CSSStyleDeclaration" {
-  factory CssStyleDeclaration() => _CssStyleDeclarationFactoryProvider.createCssStyleDeclaration();
-  factory CssStyleDeclaration.css(String css) =>
-      _CssStyleDeclarationFactoryProvider.createCssStyleDeclaration_css(css);
+  factory CssStyleDeclaration() => new CssStyleDeclaration.css('');
+
+  factory CssStyleDeclaration.css(String css) {
+    final style = new Element.tag('div').style;
+    style.cssText = css;
+    return style;
+  }
 
 
   @DomName('CSSStyleDeclaration.cssText')
@@ -2236,23 +2262,11 @@
   @DocsEditable
   String getPropertyPriority(String propertyName) native;
 
-  @DomName('CSSStyleDeclaration.getPropertyShorthand')
-  @DocsEditable
-  // http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface
-  @deprecated // deprecated
-  String getPropertyShorthand(String propertyName) native;
-
   @JSName('getPropertyValue')
   @DomName('CSSStyleDeclaration.getPropertyValue')
   @DocsEditable
   String _getPropertyValue(String propertyName) native;
 
-  @DomName('CSSStyleDeclaration.isPropertyImplicit')
-  @DocsEditable
-  // http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface
-  @deprecated // deprecated
-  bool isPropertyImplicit(String propertyName) native;
-
   @DomName('CSSStyleDeclaration.item')
   @DocsEditable
   String item(int index) native;
@@ -5520,29 +5534,24 @@
 
 @DocsEditable
 @DomName('CSSSupportsRule')
-@Experimental // untriaged
 class CssSupportsRule extends CssRule native "CSSSupportsRule" {
 
   @DomName('CSSSupportsRule.conditionText')
   @DocsEditable
-  @Experimental // untriaged
   final String conditionText;
 
   @DomName('CSSSupportsRule.cssRules')
   @DocsEditable
-  @Experimental // untriaged
   @Returns('_CssRuleList')
   @Creates('_CssRuleList')
   final List<CssRule> cssRules;
 
   @DomName('CSSSupportsRule.deleteRule')
   @DocsEditable
-  @Experimental // untriaged
   void deleteRule(int index) native;
 
   @DomName('CSSSupportsRule.insertRule')
   @DocsEditable
-  @Experimental // untriaged
   int insertRule(String rule, int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5693,7 +5702,7 @@
 
   @DomName('Clipboard.setDragImage')
   @DocsEditable
-  void setDragImage(ImageElement image, int x, int y) native;
+  void setDragImage(Element element, int x, int y) native;
 }
 // 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
@@ -5997,17 +6006,17 @@
   @DomName('DirectoryEntry.getDirectory')
   @DocsEditable
   void __getDirectory(String path, {Map options, _EntryCallback successCallback, _ErrorCallback errorCallback}) {
-    if (?errorCallback) {
+    if (errorCallback != null) {
       var options_1 = convertDartToNative_Dictionary(options);
       ___getDirectory_1(path, options_1, successCallback, errorCallback);
       return;
     }
-    if (?successCallback) {
+    if (successCallback != null) {
       var options_2 = convertDartToNative_Dictionary(options);
       ___getDirectory_2(path, options_2, successCallback);
       return;
     }
-    if (?options) {
+    if (options != null) {
       var options_3 = convertDartToNative_Dictionary(options);
       ___getDirectory_3(path, options_3);
       return;
@@ -6046,17 +6055,17 @@
   @DomName('DirectoryEntry.getFile')
   @DocsEditable
   void __getFile(String path, {Map options, _EntryCallback successCallback, _ErrorCallback errorCallback}) {
-    if (?errorCallback) {
+    if (errorCallback != null) {
       var options_1 = convertDartToNative_Dictionary(options);
       ___getFile_1(path, options_1, successCallback, errorCallback);
       return;
     }
-    if (?successCallback) {
+    if (successCallback != null) {
       var options_2 = convertDartToNative_Dictionary(options);
       ___getFile_2(path, options_2, successCallback);
       return;
     }
-    if (?options) {
+    if (options != null) {
       var options_3 = convertDartToNative_Dictionary(options);
       ___getFile_3(path, options_3);
       return;
@@ -6231,6 +6240,14 @@
   @deprecated // nonstandard
   String charset;
 
+  @DomName('Document.childElementCount')
+  @DocsEditable
+  final int childElementCount;
+
+  @DomName('Document.children')
+  @DocsEditable
+  final HtmlCollection children;
+
   @DomName('Document.cookie')
   @DocsEditable
   String cookie;
@@ -6254,6 +6271,10 @@
   @DocsEditable
   final String domain;
 
+  @DomName('Document.firstElementChild')
+  @DocsEditable
+  final Element firstElementChild;
+
   @DomName('Document.fontloader')
   @DocsEditable
   // http://www.w3.org/TR/css3-fonts/#document-fontloader
@@ -6270,6 +6291,10 @@
   @DocsEditable
   final DomImplementation implementation;
 
+  @DomName('Document.lastElementChild')
+  @DocsEditable
+  final Element lastElementChild;
+
   @JSName('lastModified')
   /// Moved to [HtmlDocument].
   @DomName('Document.lastModified')
@@ -6589,7 +6614,7 @@
   @Experimental
   // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/index.html#dfn-document-register
   CustomElementConstructor register(String name, [Map options]) {
-    if (?options) {
+    if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
       return _register_1(name, options_1);
     }
@@ -6858,13 +6883,24 @@
 
 @DomName('DocumentFragment')
 class DocumentFragment extends Node native "DocumentFragment" {
-  factory DocumentFragment() => _DocumentFragmentFactoryProvider.createDocumentFragment();
+  factory DocumentFragment() => document.createDocumentFragment();
 
-  factory DocumentFragment.html(String html) =>
-      _DocumentFragmentFactoryProvider.createDocumentFragment_html(html);
+  factory DocumentFragment.html(String html) {
+    final fragment = new DocumentFragment();
+    fragment.innerHtml = html;
+    return fragment;
+  }
 
-  factory DocumentFragment.svg(String svgContent) =>
-      _DocumentFragmentFactoryProvider.createDocumentFragment_svg(svgContent);
+  factory DocumentFragment.svg(String svgContent) {
+    final fragment = new DocumentFragment();
+    final e = new svg.SvgSvgElement();
+    e.innerHtml = svgContent;
+
+    // Copy list first since we don't want liveness during iteration.
+    final List nodes = new List.from(e.nodes);
+    fragment.nodes.addAll(nodes);
+    return fragment;
+  }
 
   // Native field is used only by Dart code so does not lead to instantiation
   // of native classes
@@ -6928,6 +6964,18 @@
   }
 
 
+  @DomName('DocumentFragment.childElementCount')
+  @DocsEditable
+  final int childElementCount;
+
+  @DomName('DocumentFragment.firstElementChild')
+  @DocsEditable
+  final Element firstElementChild;
+
+  @DomName('DocumentFragment.lastElementChild')
+  @DocsEditable
+  final Element lastElementChild;
+
   @JSName('querySelector')
   @DomName('DocumentFragment.querySelector')
   @DocsEditable
@@ -7080,6 +7128,10 @@
   @DomName('DOMSettableTokenList.value')
   @DocsEditable
   String value;
+
+  @JSName('None')
+  @DomName('DOMSettableTokenList')
+  String item(int index) native;
 }
 // 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
@@ -7153,6 +7205,8 @@
 
 @DomName('DOMStringMap')
 abstract class DomStringMap {
+
+  String None(String name);
 }
 // 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
@@ -7773,7 +7827,7 @@
    * * [insertAdjacentElement]
    */
   void insertAdjacentHtml(String where, String html) {
-    if (JS('bool', '!!#.insertAdjacentHtml', this)) {
+    if (JS('bool', '!!#.insertAdjacentHTML', this)) {
       _insertAdjacentHtml(where, html);
     } else {
       _insertAdjacentNode(where, new DocumentFragment.html(html));
@@ -7781,7 +7835,7 @@
   }
 
   @JSName('insertAdjacentHTML')
-  void _insertAdjacentHTML(String where, String text) native;
+  void _insertAdjacentHtml(String where, String text) native;
 
   /**
    * Inserts [element] into the DOM at the specified location.
@@ -8300,11 +8354,6 @@
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   static const EventStreamProvider<Event> fullscreenErrorEvent = const EventStreamProvider<Event>('webkitfullscreenerror');
 
-  @JSName('children')
-  @DomName('Element.children')
-  @DocsEditable
-  final HtmlCollection $dom_children;
-
   @DomName('Element.contentEditable')
   @DocsEditable
   String contentEditable;
@@ -8376,6 +8425,12 @@
   @DocsEditable
   void click() native;
 
+  @DomName('Element.getInputContext')
+  @DocsEditable
+  // http://www.w3.org/TR/ime-api/#the-getinputcontext-method
+  @Experimental
+  InputMethodContext getInputContext() native;
+
   @DomName('Element.ALLOW_KEYBOARD_INPUT')
   @DocsEditable
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-element-requestfullscreen
@@ -8392,6 +8447,11 @@
   @DocsEditable
   final int $dom_childElementCount;
 
+  @JSName('children')
+  @DomName('Element.children')
+  @DocsEditable
+  final HtmlCollection $dom_children;
+
   @JSName('className')
   @DomName('Element.className')
   @DocsEditable
@@ -9103,6 +9163,28 @@
 // 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.
 
+
+@DocsEditable
+@DomName('Entity')
+@Experimental // untriaged
+class Entity extends Node native "Entity" {
+
+  @DomName('Entity.notationName')
+  @DocsEditable
+  final String notationName;
+
+  @DomName('Entity.publicId')
+  @DocsEditable
+  final String publicId;
+
+  @DomName('Entity.systemId')
+  @DocsEditable
+  final String systemId;
+}
+// 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.
+
 // WARNING: Do not edit - generated code.
 
 
@@ -9480,6 +9562,14 @@
   @DocsEditable
   void $dom_initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg) native;
 
+  @DomName('Event.path')
+  @DocsEditable
+  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#extensions-to-event
+  @Experimental
+  @Returns('NodeList')
+  @Creates('NodeList')
+  List<Node> path() native;
+
   @DomName('Event.preventDefault')
   @DocsEditable
   void preventDefault() native;
@@ -9560,7 +9650,7 @@
   @DomName('EventSource.EventSource')
   @DocsEditable
   static EventSource _factoryEventSource(String url, [Map eventSourceInit]) {
-    if (?eventSourceInit) {
+    if (eventSourceInit != null) {
       return EventSource._create_1(url, eventSourceInit);
     }
     return EventSource._create_2(url);
@@ -10446,10 +10536,10 @@
 @SupportedBrowser(SupportedBrowser.SAFARI)
 class FormData native "FormData" {
 
-  @DomName('FormData.DOMFormData')
+  @DomName('FormData.FormData')
   @DocsEditable
   factory FormData([FormElement form]) {
-    if (?form) {
+    if (form != null) {
       return FormData._create_1(form);
     }
     return FormData._create_2();
@@ -10531,6 +10621,10 @@
   @DocsEditable
   String target;
 
+  @JSName('None')
+  @DomName('HTMLFormElement')
+  Node item(int index) native;
+
   @DomName('HTMLFormElement.checkValidity')
   @DocsEditable
   bool checkValidity() native;
@@ -10852,7 +10946,7 @@
   @DocsEditable
   final int length;
 
-  dynamic get state => _convertNativeToDart_SerializedScriptValue(this._get_state);
+  dynamic get state => convertNativeToDart_SerializedScriptValue(this._get_state);
   @JSName('state')
   @DomName('History.state')
   @DocsEditable
@@ -11211,6 +11305,10 @@
 @DomName('HTMLFormControlsCollection')
 class HtmlFormControlsCollection extends HtmlCollection native "HTMLFormControlsCollection" {
 
+  @JSName('None')
+  @DomName('HTMLFormControlsCollection')
+  Node item(int index) native;
+
   @DomName('HTMLFormControlsCollection.namedItem')
   @DocsEditable
   Node namedItem(String name) native;
@@ -12937,42 +13035,36 @@
 
 @DocsEditable
 @DomName('InputMethodContext')
-@Experimental // untriaged
+// http://www.w3.org/TR/ime-api/#idl-def-InputMethodContext
+@Experimental
 class InputMethodContext native "InputMethodContext" {
 
   @DomName('InputMethodContext.composition')
   @DocsEditable
-  @Experimental // untriaged
   final Composition composition;
 
   @DomName('InputMethodContext.enabled')
   @DocsEditable
-  @Experimental // untriaged
   bool enabled;
 
   @DomName('InputMethodContext.locale')
   @DocsEditable
-  @Experimental // untriaged
   final String locale;
 
   @DomName('InputMethodContext.confirmComposition')
   @DocsEditable
-  @Experimental // untriaged
   void confirmComposition() native;
 
   @DomName('InputMethodContext.open')
   @DocsEditable
-  @Experimental // untriaged
   bool open() native;
 
   @DomName('InputMethodContext.setCaretRectangle')
   @DocsEditable
-  @Experimental // untriaged
   void setCaretRectangle(Node anchor, int x, int y, int w, int h) native;
 
   @DomName('InputMethodContext.setExclusionRectangle')
   @DocsEditable
-  @Experimental // untriaged
   void setExclusionRectangle(Node anchor, int x, int y, int w, int h) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13327,7 +13419,8 @@
 
 
 @DomName('MIDIErrorCallback')
-@Experimental // untriaged
+// http://webaudio.github.io/web-midi-api/#midierrorcallback
+@Experimental
 typedef void MidiErrorCallback(DomError error);
 // 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
@@ -13660,6 +13753,12 @@
   @DocsEditable
   String mediaGroup;
 
+  @DomName('HTMLMediaElement.mediaKeys')
+  @DocsEditable
+  // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html
+  @Experimental
+  MediaKeys mediaKeys;
+
   @DomName('HTMLMediaElement.muted')
   @DocsEditable
   bool muted;
@@ -13993,6 +14092,11 @@
   @DomName('MediaKeyError.code')
   @DocsEditable
   final int code;
+
+  @DomName('MediaKeyError.systemCode')
+  @DocsEditable
+  @Experimental // non-standard
+  final int systemCode;
 }
 // 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
@@ -14040,6 +14144,112 @@
 
 
 @DocsEditable
+@DomName('MediaKeyMessageEvent')
+// https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-mediakeymessageevent
+@Experimental
+class MediaKeyMessageEvent extends Event native "MediaKeyMessageEvent" {
+
+  @JSName('destinationURL')
+  @DomName('MediaKeyMessageEvent.destinationURL')
+  @DocsEditable
+  final String destinationUrl;
+
+  @DomName('MediaKeyMessageEvent.message')
+  @DocsEditable
+  final Uint8List message;
+}
+// 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.
+
+
+@DocsEditable
+@DomName('MediaKeyNeededEvent')
+// https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-mediakeyneededevent
+@Experimental
+class MediaKeyNeededEvent extends Event native "MediaKeyNeededEvent" {
+
+  @DomName('MediaKeyNeededEvent.initData')
+  @DocsEditable
+  final Uint8List initData;
+}
+// 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.
+
+
+@DocsEditable
+@DomName('MediaKeySession')
+// https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-mediakeysession
+@Experimental
+class MediaKeySession extends EventTarget native "MediaKeySession" {
+
+  @DomName('MediaKeySession.error')
+  @DocsEditable
+  final MediaKeyError error;
+
+  @DomName('MediaKeySession.keySystem')
+  @DocsEditable
+  final String keySystem;
+
+  @DomName('MediaKeySession.sessionId')
+  @DocsEditable
+  final String sessionId;
+
+  @JSName('addEventListener')
+  @DomName('MediaKeySession.addEventListener')
+  @DocsEditable
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
+
+  @DomName('MediaKeySession.close')
+  @DocsEditable
+  void close() native;
+
+  @DomName('MediaKeySession.dispatchEvent')
+  @DocsEditable
+  bool dispatchEvent(Event evt) native;
+
+  @JSName('removeEventListener')
+  @DomName('MediaKeySession.removeEventListener')
+  @DocsEditable
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
+
+  @DomName('MediaKeySession.update')
+  @DocsEditable
+  void update(Uint8List key) native;
+}
+// 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.
+
+
+@DocsEditable
+@DomName('MediaKeys')
+// https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html
+@Experimental
+class MediaKeys native "MediaKeys" {
+
+  @DomName('MediaKeys.MediaKeys')
+  @DocsEditable
+  factory MediaKeys(String keySystem) {
+    return MediaKeys._create_1(keySystem);
+  }
+  static MediaKeys _create_1(keySystem) => JS('MediaKeys', 'new MediaKeys(#)', keySystem);
+
+  @DomName('MediaKeys.keySystem')
+  @DocsEditable
+  final String keySystem;
+
+  @DomName('MediaKeys.createSession')
+  @DocsEditable
+  MediaKeySession createSession(String type, Uint8List initData) native;
+}
+// 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.
+
+
+@DocsEditable
 @DomName('MediaList')
 @Unstable
 class MediaList native "MediaList" {
@@ -14107,61 +14317,63 @@
 
 
 @DocsEditable
-@DomName('MediaSource')
-// https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#mediasource
+@DomName('WebKitMediaSource')
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
-class MediaSource extends EventTarget native "MediaSource" {
+// https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#mediasource
+class MediaSource extends EventTarget native "WebKitMediaSource" {
 
-  @DomName('MediaSource.MediaSource')
+  @DomName('WebKitMediaSource.WebKitMediaSource')
   @DocsEditable
   factory MediaSource() {
     return MediaSource._create_1();
   }
-  static MediaSource _create_1() => JS('MediaSource', 'new MediaSource()');
+  static MediaSource _create_1() => JS('MediaSource', 'new WebKitMediaSource()');
 
-  @DomName('MediaSource.activeSourceBuffers')
+  @DomName('WebKitMediaSource.activeSourceBuffers')
   @DocsEditable
   final SourceBufferList activeSourceBuffers;
 
-  @DomName('MediaSource.duration')
+  @DomName('WebKitMediaSource.duration')
   @DocsEditable
   num duration;
 
-  @DomName('MediaSource.readyState')
+  @DomName('WebKitMediaSource.readyState')
   @DocsEditable
   final String readyState;
 
-  @DomName('MediaSource.sourceBuffers')
+  @DomName('WebKitMediaSource.sourceBuffers')
   @DocsEditable
   final SourceBufferList sourceBuffers;
 
   @JSName('addEventListener')
-  @DomName('MediaSource.addEventListener')
+  @DomName('WebKitMediaSource.addEventListener')
   @DocsEditable
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  @DomName('MediaSource.addSourceBuffer')
+  @DomName('WebKitMediaSource.addSourceBuffer')
   @DocsEditable
   SourceBuffer addSourceBuffer(String type) native;
 
-  @DomName('MediaSource.dispatchEvent')
+  @DomName('WebKitMediaSource.dispatchEvent')
   @DocsEditable
   bool dispatchEvent(Event event) native;
 
-  @DomName('MediaSource.endOfStream')
+  @DomName('WebKitMediaSource.endOfStream')
   @DocsEditable
   void endOfStream(String error) native;
 
-  @DomName('MediaSource.isTypeSupported')
+  @DomName('WebKitMediaSource.isTypeSupported')
   @DocsEditable
   static bool isTypeSupported(String type) native;
 
   @JSName('removeEventListener')
-  @DomName('MediaSource.removeEventListener')
+  @DomName('WebKitMediaSource.removeEventListener')
   @DocsEditable
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  @DomName('MediaSource.removeSourceBuffer')
+  @DomName('WebKitMediaSource.removeSourceBuffer')
   @DocsEditable
   void removeSourceBuffer(SourceBuffer buffer) native;
 }
@@ -14191,7 +14403,7 @@
   @DomName('MediaStream.MediaStream')
   @DocsEditable
   factory MediaStream([stream_OR_tracks]) {
-    if (!?stream_OR_tracks) {
+    if (stream_OR_tracks == null) {
       return MediaStream._create_1();
     }
     if ((stream_OR_tracks is MediaStream || stream_OR_tracks == null)) {
@@ -14255,7 +14467,6 @@
 
   @DomName('MediaStream.stop')
   @DocsEditable
-  @Experimental // untriaged
   void stop() native;
 
   @DomName('MediaStream.onaddtrack')
@@ -14507,7 +14718,7 @@
   @DocsEditable
   @Unstable
   @Creates('=List')
-  final List ports;
+  final List<MessagePort> ports;
 
   WindowBase get source => _convertNativeToDart_Window(this._get_source);
   @JSName('source')
@@ -14553,7 +14764,7 @@
   @DomName('MessagePort.postMessage')
   @DocsEditable
   void postMessage(/*any*/ message, [List messagePorts]) {
-    if (?messagePorts) {
+    if (messagePorts != null) {
       var message_1 = convertDartToNative_SerializedScriptValue(message);
       _postMessage_1(message_1, messagePorts);
       return;
@@ -14695,12 +14906,12 @@
 
 @DocsEditable
 @DomName('MIDIConnectionEvent')
-@Experimental // untriaged
+// http://webaudio.github.io/web-midi-api/#midiconnectionevent-interface
+@Experimental
 class MidiConnectionEvent extends Event native "MIDIConnectionEvent" {
 
   @DomName('MIDIConnectionEvent.port')
   @DocsEditable
-  @Experimental // untriaged
   final MidiPort port;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14710,7 +14921,8 @@
 
 @DocsEditable
 @DomName('MIDIInput')
-@Experimental // untriaged
+// http://webaudio.github.io/web-midi-api/#idl-def-MIDIInput
+@Experimental
 class MidiInput extends MidiPort implements EventTarget native "MIDIInput" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14720,17 +14932,16 @@
 
 @DocsEditable
 @DomName('MIDIMessageEvent')
-@Experimental // untriaged
+// http://webaudio.github.io/web-midi-api/#midimessageevent-interface
+@Experimental
 class MidiMessageEvent extends Event native "MIDIMessageEvent" {
 
   @DomName('MIDIMessageEvent.data')
   @DocsEditable
-  @Experimental // untriaged
   final Uint8List data;
 
   @DomName('MIDIMessageEvent.receivedTime')
   @DocsEditable
-  @Experimental // untriaged
   final num receivedTime;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14739,60 +14950,66 @@
 
 
 @DocsEditable
+@DomName('MIDIOutput')
+// http://webaudio.github.io/web-midi-api/#midioutput-interface
+@Experimental
+class MidiOutput extends MidiPort native "MIDIOutput" {
+
+  @DomName('MIDIOutput.send')
+  @DocsEditable
+  void send(Uint8List data, [num timestamp]) native;
+}
+// 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.
+
+
+@DocsEditable
 @DomName('MIDIPort')
-@Experimental // untriaged
+// http://webaudio.github.io/web-midi-api/#idl-def-MIDIPort
+@Experimental
 class MidiPort extends EventTarget native "MIDIPort" {
 
   @DomName('MIDIPort.disconnectEvent')
   @DocsEditable
-  @Experimental // untriaged
   static const EventStreamProvider<MidiConnectionEvent> disconnectEvent = const EventStreamProvider<MidiConnectionEvent>('disconnect');
 
   @DomName('MIDIPort.id')
   @DocsEditable
-  @Experimental // untriaged
   final String id;
 
   @DomName('MIDIPort.manufacturer')
   @DocsEditable
-  @Experimental // untriaged
   final String manufacturer;
 
   @DomName('MIDIPort.name')
   @DocsEditable
-  @Experimental // untriaged
   final String name;
 
   @DomName('MIDIPort.type')
   @DocsEditable
-  @Experimental // untriaged
   final String type;
 
   @DomName('MIDIPort.version')
   @DocsEditable
-  @Experimental // untriaged
   final String version;
 
   @JSName('addEventListener')
   @DomName('MIDIPort.addEventListener')
   @DocsEditable
-  @Experimental // untriaged
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   @DomName('MIDIPort.dispatchEvent')
   @DocsEditable
-  @Experimental // untriaged
   bool dispatchEvent(Event event) native;
 
   @JSName('removeEventListener')
   @DomName('MIDIPort.removeEventListener')
   @DocsEditable
-  @Experimental // untriaged
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   @DomName('MIDIPort.ondisconnect')
   @DocsEditable
-  @Experimental // untriaged
   Stream<MidiConnectionEvent> get onDisconnect => disconnectEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16298,7 +16515,7 @@
   @DomName('Notification.Notification')
   @DocsEditable
   static Notification _factoryNotification(String title, [Map options]) {
-    if (?options) {
+    if (options != null) {
       return Notification._create_1(title, options);
     }
     return Notification._create_2(title);
@@ -16578,16 +16795,16 @@
   @DomName('HTMLOptionElement.HTMLOptionElement')
   @DocsEditable
   factory OptionElement([String data, String value, bool defaultSelected, bool selected]) {
-    if (?selected) {
+    if (selected != null) {
       return OptionElement._create_1(data, value, defaultSelected, selected);
     }
-    if (?defaultSelected) {
+    if (defaultSelected != null) {
       return OptionElement._create_2(data, value, defaultSelected);
     }
-    if (?value) {
+    if (value != null) {
       return OptionElement._create_3(data, value);
     }
-    if (?data) {
+    if (data != null) {
       return OptionElement._create_4(data);
     }
     return OptionElement._create_5();
@@ -16791,10 +17008,10 @@
 @Experimental
 class Path native "Path" {
 
-  @DomName('Path.DOMPath')
+  @DomName('Path.Path')
   @DocsEditable
   factory Path([path_OR_text]) {
-    if (!?path_OR_text) {
+    if (path_OR_text == null) {
       return Path._create_1();
     }
     if ((path_OR_text is Path || path_OR_text == null)) {
@@ -16879,37 +17096,44 @@
 
   @DomName('Performance.clearMarks')
   @DocsEditable
-  @Experimental // untriaged
+  // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
+  @Experimental
   void clearMarks(String markName) native;
 
   @DomName('Performance.clearMeasures')
   @DocsEditable
-  @Experimental // untriaged
+  // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
+  @Experimental
   void clearMeasures(String measureName) native;
 
   @DomName('Performance.getEntries')
   @DocsEditable
-  @Experimental // untriaged
+  // http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute
+  @Experimental
   List<PerformanceEntry> getEntries() native;
 
   @DomName('Performance.getEntriesByName')
   @DocsEditable
-  @Experimental // untriaged
+  // http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute
+  @Experimental
   List<PerformanceEntry> getEntriesByName(String name, String entryType) native;
 
   @DomName('Performance.getEntriesByType')
   @DocsEditable
-  @Experimental // untriaged
+  // http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute
+  @Experimental
   List<PerformanceEntry> getEntriesByType(String entryType) native;
 
   @DomName('Performance.mark')
   @DocsEditable
-  @Experimental // untriaged
+  // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
+  @Experimental
   void mark(String markName) native;
 
   @DomName('Performance.measure')
   @DocsEditable
-  @Experimental // untriaged
+  // 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;
 
   @DomName('Performance.now')
@@ -16922,7 +17146,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
-  // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
+  // http://www.w3c-test.org/webperf/specs/ResourceTiming/#extensions-performance-interface
   void clearResourceTimings() native;
 
   @JSName('webkitSetResourceTimingBufferSize')
@@ -17514,7 +17738,6 @@
 class Range native "Range" {
   factory Range() => document.$dom_createRange();
 
-
   @DomName('Range.END_TO_END')
   @DocsEditable
   static const int END_TO_END = 2;
@@ -18038,7 +18261,7 @@
   @DomName('RTCPeerConnection.addStream')
   @DocsEditable
   void addStream(MediaStream stream, [Map mediaConstraints]) {
-    if (?mediaConstraints) {
+    if (mediaConstraints != null) {
       var mediaConstraints_1 = convertDartToNative_Dictionary(mediaConstraints);
       _addStream_1(stream, mediaConstraints_1);
       return;
@@ -18062,7 +18285,7 @@
   @DomName('RTCPeerConnection.createAnswer')
   @DocsEditable
   void _createAnswer(_RtcSessionDescriptionCallback successCallback, [_RtcErrorCallback failureCallback, Map mediaConstraints]) {
-    if (?mediaConstraints) {
+    if (mediaConstraints != null) {
       var mediaConstraints_1 = convertDartToNative_Dictionary(mediaConstraints);
       __createAnswer_1(successCallback, failureCallback, mediaConstraints_1);
       return;
@@ -18087,7 +18310,7 @@
   @DomName('RTCPeerConnection.createDataChannel')
   @DocsEditable
   RtcDataChannel createDataChannel(String label, [Map options]) {
-    if (?options) {
+    if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
       return _createDataChannel_1(label, options_1);
     }
@@ -18105,7 +18328,7 @@
   @DomName('RTCPeerConnection.createOffer')
   @DocsEditable
   void _createOffer(_RtcSessionDescriptionCallback successCallback, [_RtcErrorCallback failureCallback, Map mediaConstraints]) {
-    if (?mediaConstraints) {
+    if (mediaConstraints != null) {
       var mediaConstraints_1 = convertDartToNative_Dictionary(mediaConstraints);
       __createOffer_1(successCallback, failureCallback, mediaConstraints_1);
       return;
@@ -18186,13 +18409,13 @@
   @DomName('RTCPeerConnection.updateIce')
   @DocsEditable
   void updateIce([Map configuration, Map mediaConstraints]) {
-    if (?mediaConstraints) {
+    if (mediaConstraints != null) {
       var configuration_1 = convertDartToNative_Dictionary(configuration);
       var mediaConstraints_2 = convertDartToNative_Dictionary(mediaConstraints);
       _updateIce_1(configuration_1, mediaConstraints_2);
       return;
     }
-    if (?configuration) {
+    if (configuration != null) {
       var configuration_3 = convertDartToNative_Dictionary(configuration);
       _updateIce_2(configuration_3);
       return;
@@ -18450,79 +18673,6 @@
 
 
 @DocsEditable
-@DomName('ScriptProfile')
-@deprecated // nonstandard
-class ScriptProfile native "ScriptProfile" {
-
-  @DomName('ScriptProfile.head')
-  @DocsEditable
-  final ScriptProfileNode head;
-
-  @DomName('ScriptProfile.idleTime')
-  @DocsEditable
-  final num idleTime;
-
-  @DomName('ScriptProfile.title')
-  @DocsEditable
-  final String title;
-
-  @DomName('ScriptProfile.uid')
-  @DocsEditable
-  final int uid;
-}
-// 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.
-
-
-@DocsEditable
-@DomName('ScriptProfileNode')
-@deprecated // nonstandard
-class ScriptProfileNode native "ScriptProfileNode" {
-
-  @JSName('callUID')
-  @DomName('ScriptProfileNode.callUID')
-  @DocsEditable
-  final int callUid;
-
-  @DomName('ScriptProfileNode.functionName')
-  @DocsEditable
-  final String functionName;
-
-  @DomName('ScriptProfileNode.lineNumber')
-  @DocsEditable
-  final int lineNumber;
-
-  @DomName('ScriptProfileNode.numberOfCalls')
-  @DocsEditable
-  final int numberOfCalls;
-
-  @DomName('ScriptProfileNode.selfTime')
-  @DocsEditable
-  final num selfTime;
-
-  @DomName('ScriptProfileNode.totalTime')
-  @DocsEditable
-  final num totalTime;
-
-  @DomName('ScriptProfileNode.url')
-  @DocsEditable
-  final String url;
-
-  @DomName('ScriptProfileNode.visible')
-  @DocsEditable
-  final bool visible;
-
-  @DomName('ScriptProfileNode.children')
-  @DocsEditable
-  List<ScriptProfileNode> children() native;
-}
-// 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.
-
-
-@DocsEditable
 @DomName('SecurityPolicy')
 // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#securitypolicy
 @Experimental
@@ -18608,7 +18758,6 @@
 
   @DomName('SecurityPolicyViolationEvent.columnNumber')
   @DocsEditable
-  @Experimental // untriaged
   final int columnNumber;
 
   @JSName('documentURI')
@@ -18963,24 +19112,26 @@
 
 
 @DocsEditable
-@DomName('SourceBuffer')
-// https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#sourcebuffer
+@DomName('WebKitSourceBuffer')
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
-class SourceBuffer native "SourceBuffer" {
+// https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#sourcebuffer
+class SourceBuffer native "WebKitSourceBuffer" {
 
-  @DomName('SourceBuffer.buffered')
+  @DomName('WebKitSourceBuffer.buffered')
   @DocsEditable
   final TimeRanges buffered;
 
-  @DomName('SourceBuffer.timestampOffset')
+  @DomName('WebKitSourceBuffer.timestampOffset')
   @DocsEditable
   num timestampOffset;
 
-  @DomName('SourceBuffer.abort')
+  @DomName('WebKitSourceBuffer.abort')
   @DocsEditable
   void abort() native;
 
-  @DomName('SourceBuffer.append')
+  @DomName('WebKitSourceBuffer.append')
   @DocsEditable
   @Experimental // non-standard
   void append(Uint8List data) native;
@@ -18991,12 +19142,14 @@
 
 
 @DocsEditable
-@DomName('SourceBufferList')
-// https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#sourcebufferlist
+@DomName('WebKitSourceBufferList')
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
-class SourceBufferList extends EventTarget with ListMixin<SourceBuffer>, ImmutableListMixin<SourceBuffer> implements JavaScriptIndexingBehavior, List<SourceBuffer> native "SourceBufferList" {
+// https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#sourcebufferlist
+class SourceBufferList extends EventTarget with ListMixin<SourceBuffer>, ImmutableListMixin<SourceBuffer> implements JavaScriptIndexingBehavior, List<SourceBuffer> native "WebKitSourceBufferList" {
 
-  @DomName('SourceBufferList.length')
+  @DomName('WebKitSourceBufferList.length')
   @DocsEditable
   int get length => JS("int", "#.length", this);
 
@@ -19045,20 +19198,20 @@
   // -- end List<SourceBuffer> mixins.
 
   @JSName('addEventListener')
-  @DomName('SourceBufferList.addEventListener')
+  @DomName('WebKitSourceBufferList.addEventListener')
   @DocsEditable
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  @DomName('SourceBufferList.dispatchEvent')
+  @DomName('WebKitSourceBufferList.dispatchEvent')
   @DocsEditable
   bool dispatchEvent(Event event) native;
 
-  @DomName('SourceBufferList.item')
+  @DomName('WebKitSourceBufferList.item')
   @DocsEditable
   SourceBuffer item(int index) native;
 
   @JSName('removeEventListener')
-  @DomName('SourceBufferList.removeEventListener')
+  @DomName('WebKitSourceBufferList.removeEventListener')
   @DocsEditable
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 }
@@ -19494,47 +19647,40 @@
 
 @DocsEditable
 @DomName('SpeechSynthesis')
-@Experimental // untriaged
+// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section
+@Experimental
 class SpeechSynthesis native "SpeechSynthesis" {
 
   @DomName('SpeechSynthesis.paused')
   @DocsEditable
-  @Experimental // untriaged
   final bool paused;
 
   @DomName('SpeechSynthesis.pending')
   @DocsEditable
-  @Experimental // untriaged
   final bool pending;
 
   @DomName('SpeechSynthesis.speaking')
   @DocsEditable
-  @Experimental // untriaged
   final bool speaking;
 
   @DomName('SpeechSynthesis.cancel')
   @DocsEditable
-  @Experimental // untriaged
   void cancel() native;
 
   @DomName('SpeechSynthesis.getVoices')
   @DocsEditable
-  @Experimental // untriaged
   List<SpeechSynthesisVoice> getVoices() native;
 
   @DomName('SpeechSynthesis.pause')
   @DocsEditable
-  @Experimental // untriaged
   void pause() native;
 
   @DomName('SpeechSynthesis.resume')
   @DocsEditable
-  @Experimental // untriaged
   void resume() native;
 
   @DomName('SpeechSynthesis.speak')
   @DocsEditable
-  @Experimental // untriaged
   void speak(SpeechSynthesisUtterance utterance) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19544,22 +19690,20 @@
 
 @DocsEditable
 @DomName('SpeechSynthesisEvent')
-@Experimental // untriaged
+// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section
+@Experimental
 class SpeechSynthesisEvent extends Event native "SpeechSynthesisEvent" {
 
   @DomName('SpeechSynthesisEvent.charIndex')
   @DocsEditable
-  @Experimental // untriaged
   final int charIndex;
 
   @DomName('SpeechSynthesisEvent.elapsedTime')
   @DocsEditable
-  @Experimental // untriaged
   final num elapsedTime;
 
   @DomName('SpeechSynthesisEvent.name')
   @DocsEditable
-  @Experimental // untriaged
   final String name;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19569,48 +19713,42 @@
 
 @DocsEditable
 @DomName('SpeechSynthesisUtterance')
-@Experimental // untriaged
+// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section
+@Experimental
 class SpeechSynthesisUtterance extends EventTarget native "SpeechSynthesisUtterance" {
 
   @DomName('SpeechSynthesisUtterance.boundaryEvent')
   @DocsEditable
-  @Experimental // untriaged
   static const EventStreamProvider<SpeechSynthesisEvent> boundaryEvent = const EventStreamProvider<SpeechSynthesisEvent>('boundary');
 
   @DomName('SpeechSynthesisUtterance.endEvent')
   @DocsEditable
-  @Experimental // untriaged
   static const EventStreamProvider<SpeechSynthesisEvent> endEvent = const EventStreamProvider<SpeechSynthesisEvent>('end');
 
   @DomName('SpeechSynthesisUtterance.errorEvent')
   @DocsEditable
-  @Experimental // untriaged
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
   @DomName('SpeechSynthesisUtterance.markEvent')
   @DocsEditable
-  @Experimental // untriaged
   static const EventStreamProvider<SpeechSynthesisEvent> markEvent = const EventStreamProvider<SpeechSynthesisEvent>('mark');
 
   @DomName('SpeechSynthesisUtterance.pauseEvent')
   @DocsEditable
-  @Experimental // untriaged
   static const EventStreamProvider<Event> pauseEvent = const EventStreamProvider<Event>('pause');
 
   @DomName('SpeechSynthesisUtterance.resumeEvent')
   @DocsEditable
-  @Experimental // untriaged
   static const EventStreamProvider<SpeechSynthesisEvent> resumeEvent = const EventStreamProvider<SpeechSynthesisEvent>('resume');
 
   @DomName('SpeechSynthesisUtterance.startEvent')
   @DocsEditable
-  @Experimental // untriaged
   static const EventStreamProvider<SpeechSynthesisEvent> startEvent = const EventStreamProvider<SpeechSynthesisEvent>('start');
 
   @DomName('SpeechSynthesisUtterance.SpeechSynthesisUtterance')
   @DocsEditable
   factory SpeechSynthesisUtterance([String text]) {
-    if (?text) {
+    if (text != null) {
       return SpeechSynthesisUtterance._create_1(text);
     }
     return SpeechSynthesisUtterance._create_2();
@@ -19620,67 +19758,54 @@
 
   @DomName('SpeechSynthesisUtterance.lang')
   @DocsEditable
-  @Experimental // untriaged
   String lang;
 
   @DomName('SpeechSynthesisUtterance.pitch')
   @DocsEditable
-  @Experimental // untriaged
   num pitch;
 
   @DomName('SpeechSynthesisUtterance.rate')
   @DocsEditable
-  @Experimental // untriaged
   num rate;
 
   @DomName('SpeechSynthesisUtterance.text')
   @DocsEditable
-  @Experimental // untriaged
   String text;
 
   @DomName('SpeechSynthesisUtterance.voice')
   @DocsEditable
-  @Experimental // untriaged
   SpeechSynthesisVoice voice;
 
   @DomName('SpeechSynthesisUtterance.volume')
   @DocsEditable
-  @Experimental // untriaged
   num volume;
 
   @DomName('SpeechSynthesisUtterance.onboundary')
   @DocsEditable
-  @Experimental // untriaged
   Stream<SpeechSynthesisEvent> get onBoundary => boundaryEvent.forTarget(this);
 
   @DomName('SpeechSynthesisUtterance.onend')
   @DocsEditable
-  @Experimental // untriaged
   Stream<SpeechSynthesisEvent> get onEnd => endEvent.forTarget(this);
 
   @DomName('SpeechSynthesisUtterance.onerror')
   @DocsEditable
-  @Experimental // untriaged
   Stream<Event> get onError => errorEvent.forTarget(this);
 
   @DomName('SpeechSynthesisUtterance.onmark')
   @DocsEditable
-  @Experimental // untriaged
   Stream<SpeechSynthesisEvent> get onMark => markEvent.forTarget(this);
 
   @DomName('SpeechSynthesisUtterance.onpause')
   @DocsEditable
-  @Experimental // untriaged
   Stream<Event> get onPause => pauseEvent.forTarget(this);
 
   @DomName('SpeechSynthesisUtterance.onresume')
   @DocsEditable
-  @Experimental // untriaged
   Stream<SpeechSynthesisEvent> get onResume => resumeEvent.forTarget(this);
 
   @DomName('SpeechSynthesisUtterance.onstart')
   @DocsEditable
-  @Experimental // untriaged
   Stream<SpeechSynthesisEvent> get onStart => startEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19690,34 +19815,30 @@
 
 @DocsEditable
 @DomName('SpeechSynthesisVoice')
-@Experimental // untriaged
+// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section
+@Experimental
 class SpeechSynthesisVoice native "SpeechSynthesisVoice" {
 
   @JSName('default')
   @DomName('SpeechSynthesisVoice.default')
   @DocsEditable
-  @Experimental // untriaged
   final bool defaultValue;
 
   @DomName('SpeechSynthesisVoice.lang')
   @DocsEditable
-  @Experimental // untriaged
   final String lang;
 
   @DomName('SpeechSynthesisVoice.localService')
   @DocsEditable
-  @Experimental // untriaged
   final bool localService;
 
   @DomName('SpeechSynthesisVoice.name')
   @DocsEditable
-  @Experimental // untriaged
   final String name;
 
   @JSName('voiceURI')
   @DomName('SpeechSynthesisVoice.voiceURI')
   @DocsEditable
-  @Experimental // untriaged
   final String voiceUri;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19809,6 +19930,11 @@
   @DocsEditable
   final int $dom_length;
 
+  @JSName('None')
+  @DomName('Storage')
+  @Unstable
+  String anonymousIndexedGetter(index_OR_name) native;
+
   @JSName('clear')
   @DomName('Storage.clear')
   @DocsEditable
@@ -20499,7 +20625,7 @@
 
 @DomName('Text')
 class Text extends CharacterData native "Text" {
-  factory Text(String data) => _TextFactoryProvider.createText(data);
+  factory Text(String data) => document.$dom_createTextNode(data);
 
   @JSName('webkitInsertionParent')
   @DomName('Text.webkitInsertionParent')
@@ -21893,13 +22019,13 @@
   @DomName('WebSocket.WebSocket')
   @DocsEditable
   factory WebSocket(String url, [protocol_OR_protocols]) {
-    if ((url is String || url == null) && !?protocol_OR_protocols) {
+    if ((url is String || url == null) && protocol_OR_protocols == null) {
       return WebSocket._create_1(url);
     }
-    if ((url is String || url == null) && (protocol_OR_protocols is List<String> || protocol_OR_protocols == null)) {
+    if ((protocol_OR_protocols is List<String> || protocol_OR_protocols == null) && (url is String || url == null)) {
       return WebSocket._create_2(url, protocol_OR_protocols);
     }
-    if ((url is String || url == null) && (protocol_OR_protocols is String || protocol_OR_protocols == null)) {
+    if ((protocol_OR_protocols is String || protocol_OR_protocols == null) && (url is String || url == null)) {
       return WebSocket._create_3(url, protocol_OR_protocols);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -22487,7 +22613,6 @@
 
   @DomName('Window.DOMContentLoadedEvent')
   @DocsEditable
-  @Experimental // untriaged
   static const EventStreamProvider<Event> contentLoadedEvent = const EventStreamProvider<Event>('DOMContentLoaded');
 
   @DomName('Window.devicemotionEvent')
@@ -22547,7 +22672,6 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
-  @Experimental // untriaged
   static const EventStreamProvider<AnimationEvent> animationEndEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationEnd');
 
   @DomName('Window.webkitAnimationIterationEvent')
@@ -22555,7 +22679,6 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
-  @Experimental // untriaged
   static const EventStreamProvider<AnimationEvent> animationIterationEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationIteration');
 
   @DomName('Window.webkitAnimationStartEvent')
@@ -22563,7 +22686,6 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
-  @Experimental // untriaged
   static const EventStreamProvider<AnimationEvent> animationStartEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationStart');
 
   @DomName('Window.PERSISTENT')
@@ -22581,7 +22703,6 @@
   @JSName('CSS')
   @DomName('Window.CSS')
   @DocsEditable
-  @Experimental // untriaged
   final Css css;
 
   @DomName('Window.applicationCache')
@@ -22636,11 +22757,11 @@
 
   @DomName('Window.locationbar')
   @DocsEditable
-  final BarInfo locationbar;
+  final BarProp locationbar;
 
   @DomName('Window.menubar')
   @DocsEditable
-  final BarInfo menubar;
+  final BarProp menubar;
 
   @DomName('Window.name')
   @DocsEditable
@@ -22698,7 +22819,7 @@
   @DocsEditable
   // https://developer.mozilla.org/en-US/docs/DOM/window.personalbar
   @deprecated // deprecated
-  final BarInfo personalbar;
+  final BarProp personalbar;
 
   @DomName('Window.screen')
   @DocsEditable
@@ -22730,7 +22851,7 @@
 
   @DomName('Window.scrollbars')
   @DocsEditable
-  final BarInfo scrollbars;
+  final BarProp scrollbars;
 
   WindowBase get self => _convertNativeToDart_Window(this._get_self);
   @JSName('self')
@@ -22746,7 +22867,8 @@
 
   @DomName('Window.speechSynthesis')
   @DocsEditable
-  @Experimental // untriaged
+  // https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section
+  @Experimental
   final SpeechSynthesis speechSynthesis;
 
   @DomName('Window.status')
@@ -22755,7 +22877,7 @@
 
   @DomName('Window.statusbar')
   @DocsEditable
-  final BarInfo statusbar;
+  final BarProp statusbar;
 
   @DomName('Window.styleMedia')
   @DocsEditable
@@ -22765,7 +22887,7 @@
 
   @DomName('Window.toolbar')
   @DocsEditable
-  final BarInfo toolbar;
+  final BarProp toolbar;
 
   WindowBase get top => _convertNativeToDart_Window(this._get_top);
   @JSName('top')
@@ -22803,6 +22925,18 @@
   @Returns('Window|=Object')
   final dynamic _get_window;
 
+  @DomName('Window')
+  @Creates('Window|=Object')
+  @Returns('Window|=Object')
+  WindowBase anonymousIndexedGetter(int index) {
+    return _convertNativeToDart_Window(_anonymousIndexedGetter_1(index));
+  }
+  @JSName('None')
+  @DomName('Window')
+  @Creates('Window|=Object')
+  @Returns('Window|=Object')
+  _anonymousIndexedGetter_1(index) native;
+
   @JSName('addEventListener')
   @DomName('Window.addEventListener')
   @DocsEditable
@@ -22820,12 +22954,6 @@
   @DocsEditable
   String btoa(String string) native;
 
-  @DomName('Window.captureEvents')
-  @DocsEditable
-  // http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-flow-capture
-  @deprecated // deprecated
-  void captureEvents() native;
-
   @JSName('clearInterval')
   @DomName('Window.clearInterval')
   @DocsEditable
@@ -22895,7 +23023,7 @@
   @DomName('Window.postMessage')
   @DocsEditable
   void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) {
-    if (?messagePorts) {
+    if (messagePorts != null) {
       var message_1 = convertDartToNative_SerializedScriptValue(message);
       _postMessage_1(message_1, targetOrigin, messagePorts);
       return;
@@ -22917,12 +23045,6 @@
   @DocsEditable
   void print() native;
 
-  @DomName('Window.releaseEvents')
-  @DocsEditable
-  // http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-flow-capture
-  @deprecated // deprecated
-  void releaseEvents() native;
-
   @JSName('removeEventListener')
   @DomName('Window.removeEventListener')
   @DocsEditable
@@ -23034,7 +23156,6 @@
 
   @DomName('Window.onDOMContentLoaded')
   @DocsEditable
-  @Experimental // untriaged
   Stream<Event> get onContentLoaded => contentLoadedEvent.forTarget(this);
 
   @DomName('Window.onabort')
@@ -23249,17 +23370,17 @@
 
   @DomName('Window.onwebkitAnimationEnd')
   @DocsEditable
-  @Experimental // untriaged
+  @Experimental
   Stream<AnimationEvent> get onAnimationEnd => animationEndEvent.forTarget(this);
 
   @DomName('Window.onwebkitAnimationIteration')
   @DocsEditable
-  @Experimental // untriaged
+  @Experimental
   Stream<AnimationEvent> get onAnimationIteration => animationIterationEvent.forTarget(this);
 
   @DomName('Window.onwebkitAnimationStart')
   @DocsEditable
-  @Experimental // untriaged
+  @Experimental
   Stream<AnimationEvent> get onAnimationStart => animationStartEvent.forTarget(this);
 
 
@@ -23299,8 +23420,8 @@
     _returnValue = value;
     // FF and IE use the value as the return value, Chrome will return this from
     // the event callback function.
-    if (JS('bool', '("returnValue" in #)', _base)) {
-      JS('void', '#.returnValue = #', _base, value);
+    if (JS('bool', '("returnValue" in #)', wrapped)) {
+      JS('void', '#.returnValue = #', wrapped, value);
     }
   }
 }
@@ -24101,16 +24222,6 @@
 
 
 @DocsEditable
-@DomName('EntityReference')
-@deprecated // deprecated
-abstract class _EntityReference extends Node native "EntityReference" {
-}
-// 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.
-
-
-@DocsEditable
 @DomName('EntryArray')
 // http://www.w3.org/TR/file-system-api/#the-entry-interface
 @Experimental
@@ -24564,7 +24675,7 @@
   @DomName('SharedWorker.SharedWorker')
   @DocsEditable
   factory _SharedWorker(String scriptURL, [String name]) {
-    if (?name) {
+    if (name != null) {
       return _SharedWorker._create_1(scriptURL, name);
     }
     return _SharedWorker._create_2(scriptURL);
@@ -24798,7 +24909,7 @@
   @DomName('WebKitCSSMatrix.WebKitCSSMatrix')
   @DocsEditable
   factory _WebKitCSSMatrix([String cssValue]) {
-    if (?cssValue) {
+    if (cssValue != null) {
       return _WebKitCSSMatrix._create_1(cssValue);
     }
     return _WebKitCSSMatrix._create_2();
@@ -28837,57 +28948,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-class _CssStyleDeclarationFactoryProvider {
-  static CssStyleDeclaration createCssStyleDeclaration_css(String css) {
-    final style = new Element.tag('div').style;
-    style.cssText = css;
-    return style;
-  }
-
-  static CssStyleDeclaration createCssStyleDeclaration() {
-    return new CssStyleDeclaration.css('');
-  }
-}
-
-class _DocumentFragmentFactoryProvider {
-  @DomName('Document.createDocumentFragment')
-  static DocumentFragment createDocumentFragment() =>
-      document.createDocumentFragment();
-
-  static DocumentFragment createDocumentFragment_html(String html) {
-    final fragment = new DocumentFragment();
-    fragment.innerHtml = html;
-    return fragment;
-  }
-
-  // TODO(nweiz): enable this when XML is ported.
-  // factory DocumentFragment.xml(String xml) {
-  //   final fragment = new DocumentFragment();
-  //   final e = new XMLElement.tag("xml");
-  //   e.innerHtml = xml;
-  //
-  //   // Copy list first since we don't want liveness during iteration.
-  //   final List nodes = new List.from(e.nodes);
-  //   fragment.nodes.addAll(nodes);
-  //   return fragment;
-  // }
-
-  static DocumentFragment createDocumentFragment_svg(String svgContent) {
-    final fragment = new DocumentFragment();
-    final e = new svg.SvgSvgElement();
-    e.innerHtml = svgContent;
-
-    // Copy list first since we don't want liveness during iteration.
-    final List nodes = new List.from(e.nodes);
-    fragment.nodes.addAll(nodes);
-    return fragment;
-  }
-}
-// 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.
-
-
 // Conversions for Window.  These check if the window is the local
 // window, and if it's not, wraps or unwraps it with a secure wrapper.
 // We need to test for EventTarget here as well as it's a base type.
@@ -28935,49 +28995,6 @@
     return e;
   }
 }
-
-// Conversions for ImageData
-//
-// On Firefox, the returned ImageData is a plain object.
-
-class _TypedImageData implements ImageData {
-  final Uint8ClampedList data;
-  final int height;
-  final int width;
-
-  _TypedImageData(this.data, this.height, this.width);
-}
-
-ImageData _convertNativeToDart_ImageData(nativeImageData) {
-
-  // None of the native getters that return ImageData have the type ImageData
-  // since that is incorrect for FireFox (which returns a plain Object).  So we
-  // need something that tells the compiler that the ImageData class has been
-  // instantiated.
-  // TODO(sra): Remove this when all the ImageData returning APIs have been
-  // annotated as returning the union ImageData + Object.
-  JS('ImageData', '0');
-
-  if (nativeImageData is ImageData) return nativeImageData;
-
-  // On Firefox the above test fails because imagedata is a plain object.
-  // So we create a _TypedImageData.
-
-  return new _TypedImageData(
-      JS('var', '#.data', nativeImageData),
-      JS('var', '#.height', nativeImageData),
-      JS('var', '#.width', nativeImageData));
-}
-
-// We can get rid of this conversion if _TypedImageData implements the fields
-// with native names.
-_convertDartToNative_ImageData(ImageData imageData) {
-  if (imageData is _TypedImageData) {
-    return JS('', '{data: #, height: #, width: #}',
-        imageData.data, imageData.height, imageData.width);
-  }
-  return imageData;
-}
 // 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.
@@ -29183,15 +29200,6 @@
         "Cannot initialize a KeyboardEvent from a KeyEvent.");
   }
 }
-// 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.
-
-
-class _TextFactoryProvider {
-  static Text createText(String data) =>
-      JS('Text', 'document.createTextNode(#)', data);
-}
 // Copyright (c) 2011, 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.
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index 0821628..f5a4b1a 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -599,15 +599,15 @@
 
 
 @DocsEditable
-@DomName('BarInfo')
-// http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#barprop (Rename to BarProp?)
-@Experimental // non-standard
-class BarInfo extends NativeFieldWrapperClass1 {
-  BarInfo.internal();
+@DomName('BarProp')
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#barprop
+@deprecated // standard
+class BarProp extends NativeFieldWrapperClass1 {
+  BarProp.internal();
 
-  @DomName('BarInfo.visible')
+  @DomName('BarProp.visible')
   @DocsEditable
-  bool get visible native "BarInfo_visible_Getter";
+  bool get visible native "BarProp_visible_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -686,13 +686,13 @@
   String get type native "Blob_type_Getter";
 
   Blob slice([int start, int end, String contentType]) {
-    if (?contentType) {
+    if (contentType != null) {
       return _slice_1(start, end, contentType);
     }
-    if (?end) {
+    if (end != null) {
       return _slice_2(start, end);
     }
-    if (?start) {
+    if (start != null) {
       return _slice_3(start);
     }
     return _slice_4();
@@ -971,18 +971,17 @@
 
 @DocsEditable
 @DomName('Canvas2DContextAttributes')
-@Experimental // untriaged
+// http://wiki.whatwg.org/wiki/CanvasOpaque#Suggested_IDL
+@Experimental
 class Canvas2DContextAttributes extends NativeFieldWrapperClass1 {
   Canvas2DContextAttributes.internal();
 
   @DomName('Canvas2DContextAttributes.alpha')
   @DocsEditable
-  @Experimental // untriaged
   bool get alpha native "Canvas2DContextAttributes_alpha_Getter";
 
   @DomName('Canvas2DContextAttributes.alpha')
   @DocsEditable
-  @Experimental // untriaged
   void set alpha(bool value) native "Canvas2DContextAttributes_alpha_Setter";
 
 }
@@ -1409,7 +1408,7 @@
   void clearRect(num x, num y, num width, num height) native "CanvasRenderingContext2D_clearRect_Callback";
 
   void clip([String winding]) {
-    if (?winding) {
+    if (winding != null) {
       _clip_1(winding);
       return;
     }
@@ -1438,10 +1437,10 @@
   CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) native "CanvasRenderingContext2D_createLinearGradient_Callback";
 
   CanvasPattern createPattern(canvas_OR_image, String repetitionType) {
-    if ((canvas_OR_image is CanvasElement || canvas_OR_image == null) && (repetitionType is String || repetitionType == null)) {
+    if ((repetitionType is String || repetitionType == null) && (canvas_OR_image is CanvasElement || canvas_OR_image == null)) {
       return _createPattern_1(canvas_OR_image, repetitionType);
     }
-    if ((canvas_OR_image is ImageElement || canvas_OR_image == null) && (repetitionType is String || repetitionType == null)) {
+    if ((repetitionType is String || repetitionType == null) && (canvas_OR_image is ImageElement || canvas_OR_image == null)) {
       return _createPattern_2(canvas_OR_image, repetitionType);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -1456,39 +1455,39 @@
   CanvasGradient createRadialGradient(num x0, num y0, num r0, num x1, num y1, num r1) native "CanvasRenderingContext2D_createRadialGradient_Callback";
 
   void _drawImage(canvas_OR_image_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 ((canvas_OR_image_OR_video is ImageElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && !?sw_OR_width && !?height_OR_sh && !?dx && !?dy && !?dw && !?dh) {
+    if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_video is ImageElement || canvas_OR_image_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
       _drawImage_1(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y);
       return;
     }
-    if ((canvas_OR_image_OR_video is ImageElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && (sw_OR_width is num || sw_OR_width == null) && (height_OR_sh is num || height_OR_sh == null) && !?dx && !?dy && !?dw && !?dh) {
+    if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_video is ImageElement || canvas_OR_image_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
       _drawImage_2(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
       return;
     }
-    if ((canvas_OR_image_OR_video is ImageElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && (sw_OR_width is num || sw_OR_width == null) && (height_OR_sh is num || height_OR_sh == null) && (dx is num || dx == null) && (dy is num || dy == null) && (dw is num || dw == null) && (dh is num || dh == null)) {
+    if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_video is ImageElement || canvas_OR_image_OR_video == null)) {
       _drawImage_3(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
       return;
     }
-    if ((canvas_OR_image_OR_video is CanvasElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && !?sw_OR_width && !?height_OR_sh && !?dx && !?dy && !?dw && !?dh) {
+    if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_video is CanvasElement || canvas_OR_image_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
       _drawImage_4(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y);
       return;
     }
-    if ((canvas_OR_image_OR_video is CanvasElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && (sw_OR_width is num || sw_OR_width == null) && (height_OR_sh is num || height_OR_sh == null) && !?dx && !?dy && !?dw && !?dh) {
+    if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_video is CanvasElement || canvas_OR_image_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
       _drawImage_5(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
       return;
     }
-    if ((canvas_OR_image_OR_video is CanvasElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && (sw_OR_width is num || sw_OR_width == null) && (height_OR_sh is num || height_OR_sh == null) && (dx is num || dx == null) && (dy is num || dy == null) && (dw is num || dw == null) && (dh is num || dh == null)) {
+    if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_video is CanvasElement || canvas_OR_image_OR_video == null)) {
       _drawImage_6(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
       return;
     }
-    if ((canvas_OR_image_OR_video is VideoElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && !?sw_OR_width && !?height_OR_sh && !?dx && !?dy && !?dw && !?dh) {
+    if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_video is VideoElement || canvas_OR_image_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
       _drawImage_7(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y);
       return;
     }
-    if ((canvas_OR_image_OR_video is VideoElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && (sw_OR_width is num || sw_OR_width == null) && (height_OR_sh is num || height_OR_sh == null) && !?dx && !?dy && !?dw && !?dh) {
+    if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_video is VideoElement || canvas_OR_image_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
       _drawImage_8(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
       return;
     }
-    if ((canvas_OR_image_OR_video is VideoElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && (sw_OR_width is num || sw_OR_width == null) && (height_OR_sh is num || height_OR_sh == null) && (dx is num || dx == null) && (dy is num || dy == null) && (dw is num || dw == null) && (dh is num || dh == null)) {
+    if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_video is VideoElement || canvas_OR_image_OR_video == null)) {
       _drawImage_9(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
       return;
     }
@@ -1514,7 +1513,7 @@
   void _drawImage_9(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D__drawImage_9_Callback";
 
   void fill([String winding]) {
-    if (?winding) {
+    if (winding != null) {
       _fill_1(winding);
       return;
     }
@@ -1531,7 +1530,7 @@
   void fillRect(num x, num y, num width, num height) native "CanvasRenderingContext2D_fillRect_Callback";
 
   void fillText(String text, num x, num y, [num maxWidth]) {
-    if (?maxWidth) {
+    if (maxWidth != null) {
       _fillText_1(text, x, y, maxWidth);
       return;
     }
@@ -1545,7 +1544,8 @@
 
   @DomName('CanvasRenderingContext2D.getContextAttributes')
   @DocsEditable
-  @Experimental // untriaged
+  // http://wiki.whatwg.org/wiki/CanvasOpaque#Suggested_IDL
+  @Experimental
   Canvas2DContextAttributes getContextAttributes() native "CanvasRenderingContext2D_getContextAttributes_Callback";
 
   @DomName('CanvasRenderingContext2D.getImageData')
@@ -1557,7 +1557,7 @@
   List<num> getLineDash() native "CanvasRenderingContext2D_getLineDash_Callback";
 
   bool isPointInPath(num x, num y, [String winding]) {
-    if (?winding) {
+    if (winding != null) {
       return _isPointInPath_1(x, y, winding);
     }
     return _isPointInPath_2(x, y);
@@ -1584,11 +1584,11 @@
   void moveTo(num x, num y) native "CanvasRenderingContext2D_moveTo_Callback";
 
   void putImageData(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) {
-    if ((imagedata is ImageData || imagedata == null) && (dx is num || dx == null) && (dy is num || dy == null) && !?dirtyX && !?dirtyY && !?dirtyWidth && !?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) {
       _putImageData_1(imagedata, dx, dy);
       return;
     }
-    if ((imagedata is ImageData || imagedata == null) && (dx is num || dx == null) && (dy is num || dy == null) && (dirtyX is num || dirtyX == null) && (dirtyY is num || dirtyY == null) && (dirtyWidth is num || dirtyWidth == null) && (dirtyHeight is num || dirtyHeight == null)) {
+    if ((dirtyHeight is num || dirtyHeight == null) && (dirtyWidth is num || dirtyWidth == null) && (dirtyY is num || dirtyY == null) && (dirtyX is num || dirtyX == null) && (dy is num || dy == null) && (dx is num || dx == null) && (imagedata is ImageData || imagedata == null)) {
       _putImageData_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
       return;
     }
@@ -1635,21 +1635,12 @@
   @DocsEditable
   void stroke() native "CanvasRenderingContext2D_stroke_Callback";
 
-  void strokeRect(num x, num y, num width, num height, [num lineWidth]) {
-    if (?lineWidth) {
-      _strokeRect_1(x, y, width, height, lineWidth);
-      return;
-    }
-    _strokeRect_2(x, y, width, height);
-    return;
-  }
-
-  void _strokeRect_1(x, y, width, height, lineWidth) native "CanvasRenderingContext2D__strokeRect_1_Callback";
-
-  void _strokeRect_2(x, y, width, height) native "CanvasRenderingContext2D__strokeRect_2_Callback";
+  @DomName('CanvasRenderingContext2D.strokeRect')
+  @DocsEditable
+  void strokeRect(num x, num y, num width, num height) native "CanvasRenderingContext2D_strokeRect_Callback";
 
   void strokeText(String text, num x, num y, [num maxWidth]) {
-    if (?maxWidth) {
+    if (maxWidth != null) {
       _strokeText_1(text, x, y, maxWidth);
       return;
     }
@@ -1677,11 +1668,11 @@
   ImageData getImageDataHD(num sx, num sy, num sw, num sh) native "CanvasRenderingContext2D_webkitGetImageDataHD_Callback";
 
   void putImageDataHD(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) {
-    if ((imagedata is ImageData || imagedata == null) && (dx is num || dx == null) && (dy is num || dy == null) && !?dirtyX && !?dirtyY && !?dirtyWidth && !?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) {
       _webkitPutImageDataHD_1(imagedata, dx, dy);
       return;
     }
-    if ((imagedata is ImageData || imagedata == null) && (dx is num || dx == null) && (dy is num || dy == null) && (dirtyX is num || dirtyX == null) && (dirtyY is num || dirtyY == null) && (dirtyWidth is num || dirtyWidth == null) && (dirtyHeight is num || dirtyHeight == null)) {
+    if ((dirtyHeight is num || dirtyHeight == null) && (dirtyWidth is num || dirtyWidth == null) && (dirtyY is num || dirtyY == null) && (dirtyX is num || dirtyX == null) && (dy is num || dy == null) && (dx is num || dx == null) && (imagedata is ImageData || imagedata == null)) {
       _webkitPutImageDataHD_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
       return;
     }
@@ -1928,6 +1919,14 @@
   @DocsEditable
   int get length native "CharacterData_length_Getter";
 
+  @DomName('CharacterData.nextElementSibling')
+  @DocsEditable
+  Element get nextElementSibling native "CharacterData_nextElementSibling_Getter";
+
+  @DomName('CharacterData.previousElementSibling')
+  @DocsEditable
+  Element get previousElementSibling native "CharacterData_previousElementSibling_Getter";
+
   @DomName('CharacterData.appendData')
   @DocsEditable
   void appendData(String data) native "CharacterData_appendData_Callback";
@@ -1986,6 +1985,15 @@
 class Comment extends CharacterData {
   Comment.internal() : super.internal();
 
+  @DomName('Comment.Comment')
+  @DocsEditable
+  factory Comment([String data]) {
+    return Comment._create_1(data);
+  }
+
+  @DocsEditable
+  static Comment _create_1(data) native "Comment__create_1constructorCallback";
+
 }
 // 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
@@ -1996,18 +2004,17 @@
 
 @DocsEditable
 @DomName('Composition')
-@Experimental // untriaged
+// http://www.w3.org/TR/ime-api/#idl-def-Composition
+@Experimental
 class Composition extends NativeFieldWrapperClass1 {
   Composition.internal();
 
   @DomName('Composition.caret')
   @DocsEditable
-  @Experimental // untriaged
   Range get caret native "Composition_caret_Getter";
 
   @DomName('Composition.text')
   @DocsEditable
-  @Experimental // untriaged
   Node get text native "Composition_text_Getter";
 
 }
@@ -2058,11 +2065,6 @@
   @Experimental
   MemoryInfo get memory native "Console_memory_Getter";
 
-  @DomName('Console.profiles')
-  @DocsEditable
-  @Experimental
-  List<ScriptProfile> get profiles native "Console_profiles_Getter";
-
   @DomName('Console.assertCondition')
   @DocsEditable
   @Experimental
@@ -2275,23 +2277,24 @@
 
 @DocsEditable
 @DomName('CSS')
-@Experimental // untriaged
+// http://www.w3.org/TR/css3-conditional/#the-css-interface
+@Experimental // None
 class Css extends NativeFieldWrapperClass1 {
   Css.internal();
 
   bool supports(String conditionText_OR_property, [String value]) {
-    if ((conditionText_OR_property is String || conditionText_OR_property == null) && (value is String || value == null)) {
+    if ((value is String || value == null) && (conditionText_OR_property is String || conditionText_OR_property == null)) {
       return _supports_1(conditionText_OR_property, value);
     }
-    if ((conditionText_OR_property is String || conditionText_OR_property == null) && !?value) {
+    if ((conditionText_OR_property is String || conditionText_OR_property == null) && value == null) {
       return _supports_2(conditionText_OR_property);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  bool _supports_1(conditionText_OR_property, value) native "DOMWindowCSS__supports_1_Callback";
+  bool _supports_1(conditionText_OR_property, value) native "CSS__supports_1_Callback";
 
-  bool _supports_2(conditionText_OR_property) native "DOMWindowCSS__supports_2_Callback";
+  bool _supports_2(conditionText_OR_property) native "CSS__supports_2_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2488,6 +2491,13 @@
   @DocsEditable
   void set name(String value) native "WebKitCSSKeyframesRule_name_Setter";
 
+  @DomName('WebKitCSSKeyframesRule')
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental
+  // http://www.w3.org/TR/css3-animations/#csskeyframesrule
+  CssKeyframeRule item(int index) native "WebKitCSSKeyframesRule_None_Callback";
+
   @DomName('WebKitCSSKeyframesRule.deleteRule')
   @DocsEditable
   void deleteRule(String key) native "WebKitCSSKeyframesRule_deleteRule_Callback";
@@ -2620,7 +2630,6 @@
 
   @DomName('CSSRule.SUPPORTS_RULE')
   @DocsEditable
-  @Experimental // untriaged
   static const int SUPPORTS_RULE = 12;
 
   @DomName('CSSRule.UNKNOWN_RULE')
@@ -2681,9 +2690,13 @@
 
 @DomName('CSSStyleDeclaration')
 class CssStyleDeclaration extends NativeFieldWrapperClass1 {
-  factory CssStyleDeclaration() => _CssStyleDeclarationFactoryProvider.createCssStyleDeclaration();
-  factory CssStyleDeclaration.css(String css) =>
-      _CssStyleDeclarationFactoryProvider.createCssStyleDeclaration_css(css);
+  factory CssStyleDeclaration() => new CssStyleDeclaration.css('');
+
+  factory CssStyleDeclaration.css(String css) {
+    final style = new Element.tag('div').style;
+    style.cssText = css;
+    return style;
+  }
 
   CssStyleDeclaration.internal();
 
@@ -2707,22 +2720,10 @@
   @DocsEditable
   String getPropertyPriority(String propertyName) native "CSSStyleDeclaration_getPropertyPriority_Callback";
 
-  @DomName('CSSStyleDeclaration.getPropertyShorthand')
-  @DocsEditable
-  // http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface
-  @deprecated // deprecated
-  String getPropertyShorthand(String propertyName) native "CSSStyleDeclaration_getPropertyShorthand_Callback";
-
   @DomName('CSSStyleDeclaration.getPropertyValue')
   @DocsEditable
   String _getPropertyValue(String propertyName) native "CSSStyleDeclaration_getPropertyValue_Callback";
 
-  @DomName('CSSStyleDeclaration.isPropertyImplicit')
-  @DocsEditable
-  // http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface
-  @deprecated // deprecated
-  bool isPropertyImplicit(String propertyName) native "CSSStyleDeclaration_isPropertyImplicit_Callback";
-
   @DomName('CSSStyleDeclaration.item')
   @DocsEditable
   String item(int index) native "CSSStyleDeclaration_item_Callback";
@@ -5964,7 +5965,7 @@
   List<CssRule> get rules native "CSSStyleSheet_rules_Getter";
 
   int addRule(String selector, String style, [int index]) {
-    if (?index) {
+    if (index != null) {
       return _addRule_1(selector, style, index);
     }
     return _addRule_2(selector, style);
@@ -5997,28 +5998,23 @@
 
 @DocsEditable
 @DomName('CSSSupportsRule')
-@Experimental // untriaged
 class CssSupportsRule extends CssRule {
   CssSupportsRule.internal() : super.internal();
 
   @DomName('CSSSupportsRule.conditionText')
   @DocsEditable
-  @Experimental // untriaged
   String get conditionText native "CSSSupportsRule_conditionText_Getter";
 
   @DomName('CSSSupportsRule.cssRules')
   @DocsEditable
-  @Experimental // untriaged
   List<CssRule> get cssRules native "CSSSupportsRule_cssRules_Getter";
 
   @DomName('CSSSupportsRule.deleteRule')
   @DocsEditable
-  @Experimental // untriaged
   void deleteRule(int index) native "CSSSupportsRule_deleteRule_Callback";
 
   @DomName('CSSSupportsRule.insertRule')
   @DocsEditable
-  @Experimental // untriaged
   int insertRule(String rule, int index) native "CSSSupportsRule_insertRule_Callback";
 
 }
@@ -6195,7 +6191,7 @@
 
   @DomName('Clipboard.setDragImage')
   @DocsEditable
-  void setDragImage(ImageElement image, int x, int y) native "Clipboard_setDragImage_Callback";
+  void setDragImage(Element element, int x, int y) native "Clipboard_setDragImage_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6262,11 +6258,11 @@
   int get length native "DataTransferItemList_length_Getter";
 
   void add(data_OR_file, [String type]) {
-    if ((data_OR_file is File || data_OR_file == null) && !?type) {
+    if ((data_OR_file is File || data_OR_file == null) && type == null) {
       _add_1(data_OR_file);
       return;
     }
-    if ((data_OR_file is String || data_OR_file == null) && (type is String || type == null)) {
+    if ((type is String || type == null) && (data_OR_file is String || data_OR_file == null)) {
       _add_2(data_OR_file, type);
       return;
     }
@@ -6714,6 +6710,14 @@
   @deprecated // nonstandard
   void set charset(String value) native "Document_charset_Setter";
 
+  @DomName('Document.childElementCount')
+  @DocsEditable
+  int get childElementCount native "Document_childElementCount_Getter";
+
+  @DomName('Document.children')
+  @DocsEditable
+  HtmlCollection get children native "Document_children_Getter";
+
   @DomName('Document.cookie')
   @DocsEditable
   String get cookie native "Document_cookie_Getter";
@@ -6734,6 +6738,10 @@
   @DocsEditable
   String get domain native "Document_domain_Getter";
 
+  @DomName('Document.firstElementChild')
+  @DocsEditable
+  Element get firstElementChild native "Document_firstElementChild_Getter";
+
   @DomName('Document.fontloader')
   @DocsEditable
   // http://www.w3.org/TR/css3-fonts/#document-fontloader
@@ -6749,6 +6757,10 @@
   @DocsEditable
   DomImplementation get implementation native "Document_implementation_Getter";
 
+  @DomName('Document.lastElementChild')
+  @DocsEditable
+  Element get lastElementChild native "Document_lastElementChild_Getter";
+
   /// Moved to [HtmlDocument].
   @DomName('Document.lastModified')
   @DocsEditable
@@ -6868,10 +6880,10 @@
   DocumentFragment createDocumentFragment() native "Document_createDocumentFragment_Callback";
 
   Element $dom_createElement(String localName_OR_tagName, [String typeExtension]) {
-    if ((localName_OR_tagName is String || localName_OR_tagName == null) && !?typeExtension) {
+    if ((localName_OR_tagName is String || localName_OR_tagName == null) && typeExtension == null) {
       return _createElement_1(localName_OR_tagName);
     }
-    if ((localName_OR_tagName is String || localName_OR_tagName == null) && (typeExtension is String || typeExtension == null)) {
+    if ((typeExtension is String || typeExtension == null) && (localName_OR_tagName is String || localName_OR_tagName == null)) {
       return _createElement_2(localName_OR_tagName, typeExtension);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -6882,10 +6894,10 @@
   Element _createElement_2(localName_OR_tagName, typeExtension) native "Document__createElement_2_Callback";
 
   Element $dom_createElementNS(String namespaceURI, String qualifiedName, [String typeExtension]) {
-    if ((namespaceURI is String || namespaceURI == null) && (qualifiedName is String || qualifiedName == null) && !?typeExtension) {
+    if ((qualifiedName is String || qualifiedName == null) && (namespaceURI is String || namespaceURI == null) && typeExtension == null) {
       return _createElementNS_1(namespaceURI, qualifiedName);
     }
-    if ((namespaceURI is String || namespaceURI == null) && (qualifiedName is String || qualifiedName == null) && (typeExtension is String || typeExtension == null)) {
+    if ((typeExtension is String || typeExtension == null) && (qualifiedName is String || qualifiedName == null) && (namespaceURI is String || namespaceURI == null)) {
       return _createElementNS_2(namespaceURI, qualifiedName, typeExtension);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -7294,13 +7306,24 @@
 
 @DomName('DocumentFragment')
 class DocumentFragment extends Node {
-  factory DocumentFragment() => _DocumentFragmentFactoryProvider.createDocumentFragment();
+  factory DocumentFragment() => document.createDocumentFragment();
 
-  factory DocumentFragment.html(String html) =>
-      _DocumentFragmentFactoryProvider.createDocumentFragment_html(html);
+  factory DocumentFragment.html(String html) {
+    final fragment = new DocumentFragment();
+    fragment.innerHtml = html;
+    return fragment;
+  }
 
-  factory DocumentFragment.svg(String svgContent) =>
-      _DocumentFragmentFactoryProvider.createDocumentFragment_svg(svgContent);
+  factory DocumentFragment.svg(String svgContent) {
+    final fragment = new DocumentFragment();
+    final e = new svg.SvgSvgElement();
+    e.innerHtml = svgContent;
+
+    // Copy list first since we don't want liveness during iteration.
+    final List nodes = new List.from(e.nodes);
+    fragment.nodes.addAll(nodes);
+    return fragment;
+  }
 
   List<Element> _children;
 
@@ -7362,6 +7385,18 @@
 
   DocumentFragment.internal() : super.internal();
 
+  @DomName('DocumentFragment.childElementCount')
+  @DocsEditable
+  int get childElementCount native "DocumentFragment_childElementCount_Getter";
+
+  @DomName('DocumentFragment.firstElementChild')
+  @DocsEditable
+  Element get firstElementChild native "DocumentFragment_firstElementChild_Getter";
+
+  @DomName('DocumentFragment.lastElementChild')
+  @DocsEditable
+  Element get lastElementChild native "DocumentFragment_lastElementChild_Getter";
+
   @DomName('DocumentFragment.querySelector')
   @DocsEditable
   Element $dom_querySelector(String selectors) native "DocumentFragment_querySelector_Callback";
@@ -7529,6 +7564,9 @@
   @DocsEditable
   void set value(String value) native "DOMSettableTokenList_value_Setter";
 
+  @DomName('DOMSettableTokenList')
+  String item(int index) native "DOMSettableTokenList_None_Callback";
+
 }
 // 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
@@ -7612,6 +7650,9 @@
 class DomStringMap extends NativeFieldWrapperClass1 {
   DomStringMap.internal();
 
+  @DomName('DOMStringMap')
+  String item(String name) native "DOMStringMap_None_Callback";
+
 }
 // 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
@@ -7642,7 +7683,7 @@
   String toString() native "DOMTokenList_toString_Callback";
 
   bool toggle(String token, [bool force]) {
-    if (?force) {
+    if (force != null) {
       return _toggle_1(token, force);
     }
     return _toggle_2(token);
@@ -8629,8 +8670,6 @@
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   static const EventStreamProvider<Event> fullscreenErrorEvent = const EventStreamProvider<Event>('webkitfullscreenerror');
 
-  HtmlCollection get $dom_children;
-
   String contentEditable;
 
   String dir;
@@ -8661,6 +8700,8 @@
 
   void click();
 
+  InputMethodContext getInputContext();
+
   Element insertAdjacentElement(String where, Element element);
 
   void insertAdjacentHtml(String where, String html);
@@ -8681,6 +8722,10 @@
   @DocsEditable
   int get $dom_childElementCount native "Element_childElementCount_Getter";
 
+  @DomName('Element.children')
+  @DocsEditable
+  HtmlCollection get $dom_children native "Element_children_Getter";
+
   @DomName('Element.className')
   @DocsEditable
   String get $dom_className native "Element_className_Getter";
@@ -8899,7 +8944,7 @@
   void scrollByPages(int pages) native "Element_scrollByPages_Callback";
 
   void $dom_scrollIntoView([bool alignWithTop]) {
-    if (?alignWithTop) {
+    if (alignWithTop != null) {
       _scrollIntoView_1(alignWithTop);
       return;
     }
@@ -8912,7 +8957,7 @@
   void _scrollIntoView_2() native "Element__scrollIntoView_2_Callback";
 
   void $dom_scrollIntoViewIfNeeded([bool centerIfNeeded]) {
-    if (?centerIfNeeded) {
+    if (centerIfNeeded != null) {
       _scrollIntoViewIfNeeded_1(centerIfNeeded);
       return;
     }
@@ -9451,6 +9496,32 @@
 // WARNING: Do not edit - generated code.
 
 
+@DocsEditable
+@DomName('Entity')
+@Experimental // untriaged
+class Entity extends Node {
+  Entity.internal() : super.internal();
+
+  @DomName('Entity.notationName')
+  @DocsEditable
+  String get notationName native "Entity_notationName_Getter";
+
+  @DomName('Entity.publicId')
+  @DocsEditable
+  String get publicId native "Entity_publicId_Getter";
+
+  @DomName('Entity.systemId')
+  @DocsEditable
+  String get systemId native "Entity_systemId_Getter";
+
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
 @DomName('EntriesCallback')
 // http://www.w3.org/TR/file-system-api/#the-entriescallback-interface
 @Experimental
@@ -9490,7 +9561,7 @@
   String get name native "Entry_name_Getter";
 
   void _copyTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) {
-    if (?name) {
+    if (name != null) {
       _copyTo_1(parent, name, successCallback, errorCallback);
       return;
     }
@@ -9535,7 +9606,7 @@
   }
 
   void _moveTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) {
-    if (?name) {
+    if (name != null) {
       _moveTo_1(parent, name, successCallback, errorCallback);
       return;
     }
@@ -9828,6 +9899,12 @@
   @DocsEditable
   void $dom_initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg) native "Event_initEvent_Callback";
 
+  @DomName('Event.path')
+  @DocsEditable
+  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#extensions-to-event
+  @Experimental
+  List<Node> path() native "Event_path_Callback";
+
   @DomName('Event.preventDefault')
   @DocsEditable
   void preventDefault() native "Event_preventDefault_Callback";
@@ -10507,7 +10584,7 @@
   void readAsDataUrl(Blob blob) native "FileReader_readAsDataURL_Callback";
 
   void readAsText(Blob blob, [String encoding]) {
-    if (?encoding) {
+    if (encoding != null) {
       _readAsText_1(blob, encoding);
       return;
     }
@@ -10832,19 +10909,19 @@
 class FormData extends NativeFieldWrapperClass1 {
   FormData.internal();
 
-  @DomName('FormData.DOMFormData')
+  @DomName('FormData.FormData')
   @DocsEditable
   factory FormData([FormElement form]) => _create(form);
 
   @DocsEditable
-  static FormData _create(form) native "DOMFormData_constructorCallback";
+  static FormData _create(form) native "FormData_constructorCallback";
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
   @DomName('FormData.append')
   @DocsEditable
-  void append(String name, value, [String filename]) native "DOMFormData_append_Callback";
+  void append(String name, value, [String filename]) native "FormData_append_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10955,6 +11032,9 @@
   @DocsEditable
   void set target(String value) native "HTMLFormElement_target_Setter";
 
+  @DomName('HTMLFormElement')
+  Node item(int index) native "HTMLFormElement_None_Callback";
+
   @DomName('HTMLFormElement.checkValidity')
   @DocsEditable
   bool checkValidity() native "HTMLFormElement_checkValidity_Callback";
@@ -11650,6 +11730,9 @@
 class HtmlFormControlsCollection extends HtmlCollection {
   HtmlFormControlsCollection.internal() : super.internal();
 
+  @DomName('HTMLFormControlsCollection')
+  Node item(int index) native "HTMLFormControlsCollection_None_Callback";
+
   @DomName('HTMLFormControlsCollection.namedItem')
   @DocsEditable
   Node namedItem(String name) native "HTMLFormControlsCollection_namedItem_Callback";
@@ -11667,10 +11750,6 @@
 class HtmlOptionsCollection extends HtmlCollection {
   HtmlOptionsCollection.internal() : super.internal();
 
-  @DomName('HTMLOptionsCollection.numericIndexGetter')
-  @DocsEditable
-  Node operator[](int index) native "HTMLOptionsCollection_numericIndexGetter_Callback";
-
   @DomName('HTMLOptionsCollection.numericIndexSetter')
   @DocsEditable
   void operator[]=(int index, Node value) native "HTMLOptionsCollection_numericIndexSetter_Callback";
@@ -13065,11 +13144,11 @@
   void setCustomValidity(String error) native "HTMLInputElement_setCustomValidity_Callback";
 
   void setRangeText(String replacement, {int start, int end, String selectionMode}) {
-    if ((replacement is String || replacement == null) && !?start && !?end && !?selectionMode) {
+    if ((replacement is String || replacement == null) && start == null && end == null && selectionMode == null) {
       _setRangeText_1(replacement);
       return;
     }
-    if ((replacement is String || replacement == null) && (start is int || start == null) && (end is int || end == null) && (selectionMode is String || selectionMode == null)) {
+    if ((selectionMode is String || selectionMode == null) && (end is int || end == null) && (start is int || start == null) && (replacement is String || replacement == null)) {
       _setRangeText_2(replacement, start, end, selectionMode);
       return;
     }
@@ -13080,12 +13159,21 @@
 
   void _setRangeText_2(replacement, start, end, selectionMode) native "HTMLInputElement__setRangeText_2_Callback";
 
-  @DomName('HTMLInputElement.setSelectionRange')
-  @DocsEditable
-  void setSelectionRange(int start, int end, [String direction]) native "HTMLInputElement_setSelectionRange_Callback";
+  void setSelectionRange(int start, int end, [String direction]) {
+    if (direction != null) {
+      _setSelectionRange_1(start, end, direction);
+      return;
+    }
+    _setSelectionRange_2(start, end);
+    return;
+  }
+
+  void _setSelectionRange_1(start, end, direction) native "HTMLInputElement__setSelectionRange_1_Callback";
+
+  void _setSelectionRange_2(start, end) native "HTMLInputElement__setSelectionRange_2_Callback";
 
   void stepDown([int n]) {
-    if (?n) {
+    if (n != null) {
       _stepDown_1(n);
       return;
     }
@@ -13098,7 +13186,7 @@
   void _stepDown_2() native "HTMLInputElement__stepDown_2_Callback";
 
   void stepUp([int n]) {
-    if (?n) {
+    if (n != null) {
       _stepUp_1(n);
       return;
     }
@@ -13682,48 +13770,41 @@
 
 @DocsEditable
 @DomName('InputMethodContext')
-@Experimental // untriaged
+// http://www.w3.org/TR/ime-api/#idl-def-InputMethodContext
+@Experimental
 class InputMethodContext extends NativeFieldWrapperClass1 {
   InputMethodContext.internal();
 
   @DomName('InputMethodContext.composition')
   @DocsEditable
-  @Experimental // untriaged
   Composition get composition native "InputMethodContext_composition_Getter";
 
   @DomName('InputMethodContext.enabled')
   @DocsEditable
-  @Experimental // untriaged
   bool get enabled native "InputMethodContext_enabled_Getter";
 
   @DomName('InputMethodContext.enabled')
   @DocsEditable
-  @Experimental // untriaged
   void set enabled(bool value) native "InputMethodContext_enabled_Setter";
 
   @DomName('InputMethodContext.locale')
   @DocsEditable
-  @Experimental // untriaged
   String get locale native "InputMethodContext_locale_Getter";
 
   @DomName('InputMethodContext.confirmComposition')
   @DocsEditable
-  @Experimental // untriaged
   void confirmComposition() native "InputMethodContext_confirmComposition_Callback";
 
   @DomName('InputMethodContext.open')
   @DocsEditable
-  @Experimental // untriaged
   bool open() native "InputMethodContext_open_Callback";
 
   @DomName('InputMethodContext.setCaretRectangle')
   @DocsEditable
-  @Experimental // untriaged
   void setCaretRectangle(Node anchor, int x, int y, int w, int h) native "InputMethodContext_setCaretRectangle_Callback";
 
   @DomName('InputMethodContext.setExclusionRectangle')
   @DocsEditable
-  @Experimental // untriaged
   void setExclusionRectangle(Node anchor, int x, int y, int w, int h) native "InputMethodContext_setExclusionRectangle_Callback";
 
 }
@@ -14173,7 +14254,8 @@
 
 
 @DomName('MIDIErrorCallback')
-@Experimental // untriaged
+// http://webaudio.github.io/web-midi-api/#midierrorcallback
+@Experimental
 typedef void MidiErrorCallback(DomError error);
 // 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
@@ -14573,6 +14655,18 @@
   @DocsEditable
   void set mediaGroup(String value) native "HTMLMediaElement_mediaGroup_Setter";
 
+  @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";
+
+  @DomName('HTMLMediaElement.mediaKeys')
+  @DocsEditable
+  // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html
+  @Experimental
+  void set mediaKeys(MediaKeys value) native "HTMLMediaElement_mediaKeys_Setter";
+
   @DomName('HTMLMediaElement.muted')
   @DocsEditable
   bool get muted native "HTMLMediaElement_muted_Getter";
@@ -14705,10 +14799,10 @@
   int get videoDecodedByteCount native "HTMLMediaElement_webkitVideoDecodedByteCount_Getter";
 
   TextTrack addTextTrack(String kind, [String label, String language]) {
-    if (?language) {
+    if (language != null) {
       return _addTextTrack_1(kind, label, language);
     }
-    if (?label) {
+    if (label != null) {
       return _addTextTrack_2(kind, label);
     }
     return _addTextTrack_3(kind);
@@ -14737,7 +14831,7 @@
   void play() native "HTMLMediaElement_play_Callback";
 
   void addKey(String keySystem, Uint8List key, [Uint8List initData, String sessionId]) {
-    if (?initData) {
+    if (initData != null) {
       _webkitAddKey_1(keySystem, key, initData, sessionId);
       return;
     }
@@ -14758,7 +14852,7 @@
   void cancelKeyRequest(String keySystem, String sessionId) native "HTMLMediaElement_webkitCancelKeyRequest_Callback";
 
   void generateKeyRequest(String keySystem, [Uint8List initData]) {
-    if (?initData) {
+    if (initData != null) {
       _webkitGenerateKeyRequest_1(keySystem, initData);
       return;
     }
@@ -14963,6 +15057,11 @@
   @DocsEditable
   int get code native "MediaKeyError_code_Getter";
 
+  @DomName('MediaKeyError.systemCode')
+  @DocsEditable
+  @Experimental // non-standard
+  int get systemCode native "MediaKeyError_systemCode_Getter";
+
 }
 // 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
@@ -15015,6 +15114,127 @@
 
 
 @DocsEditable
+@DomName('MediaKeyMessageEvent')
+// https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-mediakeymessageevent
+@Experimental
+class MediaKeyMessageEvent extends Event {
+  MediaKeyMessageEvent.internal() : super.internal();
+
+  @DomName('MediaKeyMessageEvent.destinationURL')
+  @DocsEditable
+  String get destinationUrl native "MediaKeyMessageEvent_destinationURL_Getter";
+
+  @DomName('MediaKeyMessageEvent.message')
+  @DocsEditable
+  Uint8List get message native "MediaKeyMessageEvent_message_Getter";
+
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('MediaKeyNeededEvent')
+// https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-mediakeyneededevent
+@Experimental
+class MediaKeyNeededEvent extends Event {
+  MediaKeyNeededEvent.internal() : super.internal();
+
+  @DomName('MediaKeyNeededEvent.initData')
+  @DocsEditable
+  Uint8List get initData native "MediaKeyNeededEvent_initData_Getter";
+
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('MediaKeySession')
+// https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-mediakeysession
+@Experimental
+class MediaKeySession extends EventTarget {
+  MediaKeySession.internal() : super.internal();
+
+  @DomName('MediaKeySession.error')
+  @DocsEditable
+  MediaKeyError get error native "MediaKeySession_error_Getter";
+
+  @DomName('MediaKeySession.keySystem')
+  @DocsEditable
+  String get keySystem native "MediaKeySession_keySystem_Getter";
+
+  @DomName('MediaKeySession.sessionId')
+  @DocsEditable
+  String get sessionId native "MediaKeySession_sessionId_Getter";
+
+  @DomName('MediaKeySession.addEventListener')
+  @DocsEditable
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaKeySession_addEventListener_Callback";
+
+  @DomName('MediaKeySession.close')
+  @DocsEditable
+  void close() native "MediaKeySession_close_Callback";
+
+  @DomName('MediaKeySession.dispatchEvent')
+  @DocsEditable
+  bool dispatchEvent(Event evt) native "MediaKeySession_dispatchEvent_Callback";
+
+  @DomName('MediaKeySession.removeEventListener')
+  @DocsEditable
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaKeySession_removeEventListener_Callback";
+
+  @DomName('MediaKeySession.update')
+  @DocsEditable
+  void update(Uint8List key) native "MediaKeySession_update_Callback";
+
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('MediaKeys')
+// https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html
+@Experimental
+class MediaKeys extends NativeFieldWrapperClass1 {
+  MediaKeys.internal();
+
+  @DomName('MediaKeys.MediaKeys')
+  @DocsEditable
+  factory MediaKeys(String keySystem) {
+    return MediaKeys._create_1(keySystem);
+  }
+
+  @DocsEditable
+  static MediaKeys _create_1(keySystem) native "MediaKeys__create_1constructorCallback";
+
+  @DomName('MediaKeys.keySystem')
+  @DocsEditable
+  String get keySystem native "MediaKeys_keySystem_Getter";
+
+  @DomName('MediaKeys.createSession')
+  @DocsEditable
+  MediaKeySession createSession(String type, Uint8List initData) native "MediaKeys_createSession_Callback";
+
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
 @DomName('MediaList')
 @Unstable
 class MediaList extends NativeFieldWrapperClass1 {
@@ -15101,68 +15321,70 @@
 
 
 @DocsEditable
-@DomName('MediaSource')
-// https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#mediasource
+@DomName('WebKitMediaSource')
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#mediasource
 class MediaSource extends EventTarget {
   MediaSource.internal() : super.internal();
 
-  @DomName('MediaSource.MediaSource')
+  @DomName('WebKitMediaSource.WebKitMediaSource')
   @DocsEditable
   factory MediaSource() {
     return MediaSource._create_1();
   }
 
   @DocsEditable
-  static MediaSource _create_1() native "MediaSource__create_1constructorCallback";
+  static MediaSource _create_1() native "WebKitMediaSource__create_1constructorCallback";
 
-  @DomName('MediaSource.activeSourceBuffers')
+  @DomName('WebKitMediaSource.activeSourceBuffers')
   @DocsEditable
-  SourceBufferList get activeSourceBuffers native "MediaSource_activeSourceBuffers_Getter";
+  SourceBufferList get activeSourceBuffers native "WebKitMediaSource_activeSourceBuffers_Getter";
 
-  @DomName('MediaSource.duration')
+  @DomName('WebKitMediaSource.duration')
   @DocsEditable
-  num get duration native "MediaSource_duration_Getter";
+  num get duration native "WebKitMediaSource_duration_Getter";
 
-  @DomName('MediaSource.duration')
+  @DomName('WebKitMediaSource.duration')
   @DocsEditable
-  void set duration(num value) native "MediaSource_duration_Setter";
+  void set duration(num value) native "WebKitMediaSource_duration_Setter";
 
-  @DomName('MediaSource.readyState')
+  @DomName('WebKitMediaSource.readyState')
   @DocsEditable
-  String get readyState native "MediaSource_readyState_Getter";
+  String get readyState native "WebKitMediaSource_readyState_Getter";
 
-  @DomName('MediaSource.sourceBuffers')
+  @DomName('WebKitMediaSource.sourceBuffers')
   @DocsEditable
-  SourceBufferList get sourceBuffers native "MediaSource_sourceBuffers_Getter";
+  SourceBufferList get sourceBuffers native "WebKitMediaSource_sourceBuffers_Getter";
 
-  @DomName('MediaSource.addEventListener')
+  @DomName('WebKitMediaSource.addEventListener')
   @DocsEditable
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaSource_addEventListener_Callback";
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "WebKitMediaSource_addEventListener_Callback";
 
-  @DomName('MediaSource.addSourceBuffer')
+  @DomName('WebKitMediaSource.addSourceBuffer')
   @DocsEditable
-  SourceBuffer addSourceBuffer(String type) native "MediaSource_addSourceBuffer_Callback";
+  SourceBuffer addSourceBuffer(String type) native "WebKitMediaSource_addSourceBuffer_Callback";
 
-  @DomName('MediaSource.dispatchEvent')
+  @DomName('WebKitMediaSource.dispatchEvent')
   @DocsEditable
-  bool dispatchEvent(Event event) native "MediaSource_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) native "WebKitMediaSource_dispatchEvent_Callback";
 
-  @DomName('MediaSource.endOfStream')
+  @DomName('WebKitMediaSource.endOfStream')
   @DocsEditable
-  void endOfStream(String error) native "MediaSource_endOfStream_Callback";
+  void endOfStream(String error) native "WebKitMediaSource_endOfStream_Callback";
 
-  @DomName('MediaSource.isTypeSupported')
+  @DomName('WebKitMediaSource.isTypeSupported')
   @DocsEditable
-  static bool isTypeSupported(String type) native "MediaSource_isTypeSupported_Callback";
+  static bool isTypeSupported(String type) native "WebKitMediaSource_isTypeSupported_Callback";
 
-  @DomName('MediaSource.removeEventListener')
+  @DomName('WebKitMediaSource.removeEventListener')
   @DocsEditable
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaSource_removeEventListener_Callback";
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "WebKitMediaSource_removeEventListener_Callback";
 
-  @DomName('MediaSource.removeSourceBuffer')
+  @DomName('WebKitMediaSource.removeSourceBuffer')
   @DocsEditable
-  void removeSourceBuffer(SourceBuffer buffer) native "MediaSource_removeSourceBuffer_Callback";
+  void removeSourceBuffer(SourceBuffer buffer) native "WebKitMediaSource_removeSourceBuffer_Callback";
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -15192,7 +15414,7 @@
   @DomName('MediaStream.MediaStream')
   @DocsEditable
   factory MediaStream([stream_OR_tracks]) {
-    if (!?stream_OR_tracks) {
+    if (stream_OR_tracks == null) {
       return MediaStream._create_1();
     }
     if ((stream_OR_tracks is MediaStream || stream_OR_tracks == null)) {
@@ -15260,7 +15482,6 @@
 
   @DomName('MediaStream.stop')
   @DocsEditable
-  @Experimental // untriaged
   void stop() native "MediaStream_stop_Callback";
 
   @DomName('MediaStream.onaddtrack')
@@ -15528,7 +15749,7 @@
   @DomName('MessageEvent.ports')
   @DocsEditable
   @Unstable
-  List get ports native "MessageEvent_ports_Getter";
+  List<MessagePort> get ports native "MessageEvent_ports_Getter";
 
   @DomName('MessageEvent.source')
   @DocsEditable
@@ -15742,13 +15963,13 @@
 
 @DocsEditable
 @DomName('MIDIConnectionEvent')
-@Experimental // untriaged
+// http://webaudio.github.io/web-midi-api/#midiconnectionevent-interface
+@Experimental
 class MidiConnectionEvent extends Event {
   MidiConnectionEvent.internal() : super.internal();
 
   @DomName('MIDIConnectionEvent.port')
   @DocsEditable
-  @Experimental // untriaged
   MidiPort get port native "MIDIConnectionEvent_port_Getter";
 
 }
@@ -15761,7 +15982,8 @@
 
 @DocsEditable
 @DomName('MIDIInput')
-@Experimental // untriaged
+// http://webaudio.github.io/web-midi-api/#idl-def-MIDIInput
+@Experimental
 class MidiInput extends MidiPort implements EventTarget {
   MidiInput.internal() : super.internal();
 
@@ -15775,18 +15997,17 @@
 
 @DocsEditable
 @DomName('MIDIMessageEvent')
-@Experimental // untriaged
+// http://webaudio.github.io/web-midi-api/#midimessageevent-interface
+@Experimental
 class MidiMessageEvent extends Event {
   MidiMessageEvent.internal() : super.internal();
 
   @DomName('MIDIMessageEvent.data')
   @DocsEditable
-  @Experimental // untriaged
   Uint8List get data native "MIDIMessageEvent_data_Getter";
 
   @DomName('MIDIMessageEvent.receivedTime')
   @DocsEditable
-  @Experimental // untriaged
   num get receivedTime native "MIDIMessageEvent_receivedTime_Getter";
 
 }
@@ -15798,59 +16019,78 @@
 
 
 @DocsEditable
+@DomName('MIDIOutput')
+// http://webaudio.github.io/web-midi-api/#midioutput-interface
+@Experimental
+class MidiOutput extends MidiPort {
+  MidiOutput.internal() : super.internal();
+
+  void send(Uint8List data, [num timestamp]) {
+    if (timestamp != null) {
+      _send_1(data, timestamp);
+      return;
+    }
+    _send_2(data);
+    return;
+  }
+
+  void _send_1(data, timestamp) native "MIDIOutput__send_1_Callback";
+
+  void _send_2(data) native "MIDIOutput__send_2_Callback";
+
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
 @DomName('MIDIPort')
-@Experimental // untriaged
+// http://webaudio.github.io/web-midi-api/#idl-def-MIDIPort
+@Experimental
 class MidiPort extends EventTarget {
   MidiPort.internal() : super.internal();
 
   @DomName('MIDIPort.disconnectEvent')
   @DocsEditable
-  @Experimental // untriaged
   static const EventStreamProvider<MidiConnectionEvent> disconnectEvent = const EventStreamProvider<MidiConnectionEvent>('disconnect');
 
   @DomName('MIDIPort.id')
   @DocsEditable
-  @Experimental // untriaged
   String get id native "MIDIPort_id_Getter";
 
   @DomName('MIDIPort.manufacturer')
   @DocsEditable
-  @Experimental // untriaged
   String get manufacturer native "MIDIPort_manufacturer_Getter";
 
   @DomName('MIDIPort.name')
   @DocsEditable
-  @Experimental // untriaged
   String get name native "MIDIPort_name_Getter";
 
   @DomName('MIDIPort.type')
   @DocsEditable
-  @Experimental // untriaged
   String get type native "MIDIPort_type_Getter";
 
   @DomName('MIDIPort.version')
   @DocsEditable
-  @Experimental // untriaged
   String get version native "MIDIPort_version_Getter";
 
   @DomName('MIDIPort.addEventListener')
   @DocsEditable
-  @Experimental // untriaged
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MIDIPort_addEventListener_Callback";
 
   @DomName('MIDIPort.dispatchEvent')
   @DocsEditable
-  @Experimental // untriaged
   bool dispatchEvent(Event event) native "MIDIPort_dispatchEvent_Callback";
 
   @DomName('MIDIPort.removeEventListener')
   @DocsEditable
-  @Experimental // untriaged
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MIDIPort_removeEventListener_Callback";
 
   @DomName('MIDIPort.ondisconnect')
   @DocsEditable
-  @Experimental // untriaged
   Stream<MidiConnectionEvent> get onDisconnect => disconnectEvent.forTarget(this);
 
 }
@@ -15869,19 +16109,19 @@
 
   @DomName('MimeType.description')
   @DocsEditable
-  String get description native "DOMMimeType_description_Getter";
+  String get description native "MimeType_description_Getter";
 
   @DomName('MimeType.enabledPlugin')
   @DocsEditable
-  Plugin get enabledPlugin native "DOMMimeType_enabledPlugin_Getter";
+  Plugin get enabledPlugin native "MimeType_enabledPlugin_Getter";
 
   @DomName('MimeType.suffixes')
   @DocsEditable
-  String get suffixes native "DOMMimeType_suffixes_Getter";
+  String get suffixes native "MimeType_suffixes_Getter";
 
   @DomName('MimeType.type')
   @DocsEditable
-  String get type native "DOMMimeType_type_Getter";
+  String get type native "MimeType_type_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15899,14 +16139,14 @@
 
   @DomName('MimeTypeArray.length')
   @DocsEditable
-  int get length native "DOMMimeTypeArray_length_Getter";
+  int get length native "MimeTypeArray_length_Getter";
 
   MimeType operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
     return _nativeIndexedGetter(index);
   }
-  MimeType _nativeIndexedGetter(int index) native "DOMMimeTypeArray_item_Callback";
+  MimeType _nativeIndexedGetter(int index) native "MimeTypeArray_item_Callback";
 
   void operator[]=(int index, MimeType value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -15948,11 +16188,11 @@
 
   @DomName('MimeTypeArray.item')
   @DocsEditable
-  MimeType item(int index) native "DOMMimeTypeArray_item_Callback";
+  MimeType item(int index) native "MimeTypeArray_item_Callback";
 
   @DomName('MimeTypeArray.namedItem')
   @DocsEditable
-  MimeType namedItem(String name) native "DOMMimeTypeArray_namedItem_Callback";
+  MimeType namedItem(String name) native "MimeTypeArray_namedItem_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17956,10 +18196,10 @@
 class Path extends NativeFieldWrapperClass1 {
   Path.internal();
 
-  @DomName('Path.DOMPath')
+  @DomName('Path.Path')
   @DocsEditable
   factory Path([path_OR_text]) {
-    if (!?path_OR_text) {
+    if (path_OR_text == null) {
       return Path._create_1();
     }
     if ((path_OR_text is Path || path_OR_text == null)) {
@@ -17972,45 +18212,45 @@
   }
 
   @DocsEditable
-  static Path _create_1() native "DOMPath__create_1constructorCallback";
+  static Path _create_1() native "Path__create_1constructorCallback";
 
   @DocsEditable
-  static Path _create_2(path_OR_text) native "DOMPath__create_2constructorCallback";
+  static Path _create_2(path_OR_text) native "Path__create_2constructorCallback";
 
   @DocsEditable
-  static Path _create_3(path_OR_text) native "DOMPath__create_3constructorCallback";
+  static Path _create_3(path_OR_text) native "Path__create_3constructorCallback";
 
   @DomName('Path.arc')
   @DocsEditable
-  void arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) native "DOMPath_arc_Callback";
+  void arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) native "Path_arc_Callback";
 
   @DomName('Path.arcTo')
   @DocsEditable
-  void arcTo(num x1, num y1, num x2, num y2, num radius) native "DOMPath_arcTo_Callback";
+  void arcTo(num x1, num y1, num x2, num y2, num radius) native "Path_arcTo_Callback";
 
   @DomName('Path.bezierCurveTo')
   @DocsEditable
-  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) native "DOMPath_bezierCurveTo_Callback";
+  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) native "Path_bezierCurveTo_Callback";
 
   @DomName('Path.closePath')
   @DocsEditable
-  void closePath() native "DOMPath_closePath_Callback";
+  void closePath() native "Path_closePath_Callback";
 
   @DomName('Path.lineTo')
   @DocsEditable
-  void lineTo(num x, num y) native "DOMPath_lineTo_Callback";
+  void lineTo(num x, num y) native "Path_lineTo_Callback";
 
   @DomName('Path.moveTo')
   @DocsEditable
-  void moveTo(num x, num y) native "DOMPath_moveTo_Callback";
+  void moveTo(num x, num y) native "Path_moveTo_Callback";
 
   @DomName('Path.quadraticCurveTo')
   @DocsEditable
-  void quadraticCurveTo(num cpx, num cpy, num x, num y) native "DOMPath_quadraticCurveTo_Callback";
+  void quadraticCurveTo(num cpx, num cpy, num x, num y) native "Path_quadraticCurveTo_Callback";
 
   @DomName('Path.rect')
   @DocsEditable
-  void rect(num x, num y, num width, num height) native "DOMPath_rect_Callback";
+  void rect(num x, num y, num width, num height) native "Path_rect_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18054,37 +18294,44 @@
 
   @DomName('Performance.clearMarks')
   @DocsEditable
-  @Experimental // untriaged
+  // 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";
 
   @DomName('Performance.clearMeasures')
   @DocsEditable
-  @Experimental // untriaged
+  // 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";
 
   @DomName('Performance.getEntries')
   @DocsEditable
-  @Experimental // untriaged
+  // http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute
+  @Experimental
   List<PerformanceEntry> getEntries() native "Performance_getEntries_Callback";
 
   @DomName('Performance.getEntriesByName')
   @DocsEditable
-  @Experimental // untriaged
+  // http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute
+  @Experimental
   List<PerformanceEntry> getEntriesByName(String name, String entryType) native "Performance_getEntriesByName_Callback";
 
   @DomName('Performance.getEntriesByType')
   @DocsEditable
-  @Experimental // untriaged
+  // http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute
+  @Experimental
   List<PerformanceEntry> getEntriesByType(String entryType) native "Performance_getEntriesByType_Callback";
 
   @DomName('Performance.mark')
   @DocsEditable
-  @Experimental // untriaged
+  // 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";
 
   @DomName('Performance.measure')
   @DocsEditable
-  @Experimental // untriaged
+  // 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";
 
   @DomName('Performance.now')
@@ -18096,7 +18343,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
-  // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
+  // http://www.w3c-test.org/webperf/specs/ResourceTiming/#extensions-performance-interface
   void clearResourceTimings() native "Performance_webkitClearResourceTimings_Callback";
 
   @DomName('Performance.webkitSetResourceTimingBufferSize')
@@ -18392,27 +18639,27 @@
 
   @DomName('Plugin.description')
   @DocsEditable
-  String get description native "DOMPlugin_description_Getter";
+  String get description native "Plugin_description_Getter";
 
   @DomName('Plugin.filename')
   @DocsEditable
-  String get filename native "DOMPlugin_filename_Getter";
+  String get filename native "Plugin_filename_Getter";
 
   @DomName('Plugin.length')
   @DocsEditable
-  int get length native "DOMPlugin_length_Getter";
+  int get length native "Plugin_length_Getter";
 
   @DomName('Plugin.name')
   @DocsEditable
-  String get name native "DOMPlugin_name_Getter";
+  String get name native "Plugin_name_Getter";
 
   @DomName('Plugin.item')
   @DocsEditable
-  MimeType item(int index) native "DOMPlugin_item_Callback";
+  MimeType item(int index) native "Plugin_item_Callback";
 
   @DomName('Plugin.namedItem')
   @DocsEditable
-  MimeType namedItem(String name) native "DOMPlugin_namedItem_Callback";
+  MimeType namedItem(String name) native "Plugin_namedItem_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18430,14 +18677,14 @@
 
   @DomName('PluginArray.length')
   @DocsEditable
-  int get length native "DOMPluginArray_length_Getter";
+  int get length native "PluginArray_length_Getter";
 
   Plugin operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
     return _nativeIndexedGetter(index);
   }
-  Plugin _nativeIndexedGetter(int index) native "DOMPluginArray_item_Callback";
+  Plugin _nativeIndexedGetter(int index) native "PluginArray_item_Callback";
 
   void operator[]=(int index, Plugin value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -18479,15 +18726,15 @@
 
   @DomName('PluginArray.item')
   @DocsEditable
-  Plugin item(int index) native "DOMPluginArray_item_Callback";
+  Plugin item(int index) native "PluginArray_item_Callback";
 
   @DomName('PluginArray.namedItem')
   @DocsEditable
-  Plugin namedItem(String name) native "DOMPluginArray_namedItem_Callback";
+  Plugin namedItem(String name) native "PluginArray_namedItem_Callback";
 
   @DomName('PluginArray.refresh')
   @DocsEditable
-  void refresh(bool reload) native "DOMPluginArray_refresh_Callback";
+  void refresh(bool reload) native "PluginArray_refresh_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18764,7 +19011,6 @@
 @Unstable
 class Range extends NativeFieldWrapperClass1 {
   factory Range() => document.$dom_createRange();
-
   Range.internal();
 
   @DomName('Range.END_TO_END')
@@ -19130,11 +19376,11 @@
   bool dispatchEvent(Event event) native "RTCDTMFSender_dispatchEvent_Callback";
 
   void insertDtmf(String tones, [int duration, int interToneGap]) {
-    if (?interToneGap) {
+    if (interToneGap != null) {
       _insertDTMF_1(tones, duration, interToneGap);
       return;
     }
-    if (?duration) {
+    if (duration != null) {
       _insertDTMF_2(tones, duration);
       return;
     }
@@ -19710,86 +19956,6 @@
 
 
 @DocsEditable
-@DomName('ScriptProfile')
-@deprecated // nonstandard
-class ScriptProfile extends NativeFieldWrapperClass1 {
-  ScriptProfile.internal();
-
-  @DomName('ScriptProfile.head')
-  @DocsEditable
-  ScriptProfileNode get head native "ScriptProfile_head_Getter";
-
-  @DomName('ScriptProfile.idleTime')
-  @DocsEditable
-  num get idleTime native "ScriptProfile_idleTime_Getter";
-
-  @DomName('ScriptProfile.title')
-  @DocsEditable
-  String get title native "ScriptProfile_title_Getter";
-
-  @DomName('ScriptProfile.uid')
-  @DocsEditable
-  int get uid native "ScriptProfile_uid_Getter";
-
-}
-// 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.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
-@DomName('ScriptProfileNode')
-@deprecated // nonstandard
-class ScriptProfileNode extends NativeFieldWrapperClass1 {
-  ScriptProfileNode.internal();
-
-  @DomName('ScriptProfileNode.callUID')
-  @DocsEditable
-  int get callUid native "ScriptProfileNode_callUID_Getter";
-
-  @DomName('ScriptProfileNode.functionName')
-  @DocsEditable
-  String get functionName native "ScriptProfileNode_functionName_Getter";
-
-  @DomName('ScriptProfileNode.lineNumber')
-  @DocsEditable
-  int get lineNumber native "ScriptProfileNode_lineNumber_Getter";
-
-  @DomName('ScriptProfileNode.numberOfCalls')
-  @DocsEditable
-  int get numberOfCalls native "ScriptProfileNode_numberOfCalls_Getter";
-
-  @DomName('ScriptProfileNode.selfTime')
-  @DocsEditable
-  num get selfTime native "ScriptProfileNode_selfTime_Getter";
-
-  @DomName('ScriptProfileNode.totalTime')
-  @DocsEditable
-  num get totalTime native "ScriptProfileNode_totalTime_Getter";
-
-  @DomName('ScriptProfileNode.url')
-  @DocsEditable
-  String get url native "ScriptProfileNode_url_Getter";
-
-  @DomName('ScriptProfileNode.visible')
-  @DocsEditable
-  bool get visible native "ScriptProfileNode_visible_Getter";
-
-  @DomName('ScriptProfileNode.children')
-  @DocsEditable
-  List<ScriptProfileNode> children() native "ScriptProfileNode_children_Callback";
-
-}
-// 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.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
 @DomName('SecurityPolicy')
 // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#securitypolicy
 @Experimental
@@ -19798,63 +19964,63 @@
 
   @DomName('SecurityPolicy.allowsEval')
   @DocsEditable
-  bool get allowsEval native "DOMSecurityPolicy_allowsEval_Getter";
+  bool get allowsEval native "SecurityPolicy_allowsEval_Getter";
 
   @DomName('SecurityPolicy.allowsInlineScript')
   @DocsEditable
-  bool get allowsInlineScript native "DOMSecurityPolicy_allowsInlineScript_Getter";
+  bool get allowsInlineScript native "SecurityPolicy_allowsInlineScript_Getter";
 
   @DomName('SecurityPolicy.allowsInlineStyle')
   @DocsEditable
-  bool get allowsInlineStyle native "DOMSecurityPolicy_allowsInlineStyle_Getter";
+  bool get allowsInlineStyle native "SecurityPolicy_allowsInlineStyle_Getter";
 
   @DomName('SecurityPolicy.isActive')
   @DocsEditable
-  bool get isActive native "DOMSecurityPolicy_isActive_Getter";
+  bool get isActive native "SecurityPolicy_isActive_Getter";
 
   @DomName('SecurityPolicy.reportURIs')
   @DocsEditable
-  List<String> get reportURIs native "DOMSecurityPolicy_reportURIs_Getter";
+  List<String> get reportURIs native "SecurityPolicy_reportURIs_Getter";
 
   @DomName('SecurityPolicy.allowsConnectionTo')
   @DocsEditable
-  bool allowsConnectionTo(String url) native "DOMSecurityPolicy_allowsConnectionTo_Callback";
+  bool allowsConnectionTo(String url) native "SecurityPolicy_allowsConnectionTo_Callback";
 
   @DomName('SecurityPolicy.allowsFontFrom')
   @DocsEditable
-  bool allowsFontFrom(String url) native "DOMSecurityPolicy_allowsFontFrom_Callback";
+  bool allowsFontFrom(String url) native "SecurityPolicy_allowsFontFrom_Callback";
 
   @DomName('SecurityPolicy.allowsFormAction')
   @DocsEditable
-  bool allowsFormAction(String url) native "DOMSecurityPolicy_allowsFormAction_Callback";
+  bool allowsFormAction(String url) native "SecurityPolicy_allowsFormAction_Callback";
 
   @DomName('SecurityPolicy.allowsFrameFrom')
   @DocsEditable
-  bool allowsFrameFrom(String url) native "DOMSecurityPolicy_allowsFrameFrom_Callback";
+  bool allowsFrameFrom(String url) native "SecurityPolicy_allowsFrameFrom_Callback";
 
   @DomName('SecurityPolicy.allowsImageFrom')
   @DocsEditable
-  bool allowsImageFrom(String url) native "DOMSecurityPolicy_allowsImageFrom_Callback";
+  bool allowsImageFrom(String url) native "SecurityPolicy_allowsImageFrom_Callback";
 
   @DomName('SecurityPolicy.allowsMediaFrom')
   @DocsEditable
-  bool allowsMediaFrom(String url) native "DOMSecurityPolicy_allowsMediaFrom_Callback";
+  bool allowsMediaFrom(String url) native "SecurityPolicy_allowsMediaFrom_Callback";
 
   @DomName('SecurityPolicy.allowsObjectFrom')
   @DocsEditable
-  bool allowsObjectFrom(String url) native "DOMSecurityPolicy_allowsObjectFrom_Callback";
+  bool allowsObjectFrom(String url) native "SecurityPolicy_allowsObjectFrom_Callback";
 
   @DomName('SecurityPolicy.allowsPluginType')
   @DocsEditable
-  bool allowsPluginType(String type) native "DOMSecurityPolicy_allowsPluginType_Callback";
+  bool allowsPluginType(String type) native "SecurityPolicy_allowsPluginType_Callback";
 
   @DomName('SecurityPolicy.allowsScriptFrom')
   @DocsEditable
-  bool allowsScriptFrom(String url) native "DOMSecurityPolicy_allowsScriptFrom_Callback";
+  bool allowsScriptFrom(String url) native "SecurityPolicy_allowsScriptFrom_Callback";
 
   @DomName('SecurityPolicy.allowsStyleFrom')
   @DocsEditable
-  bool allowsStyleFrom(String url) native "DOMSecurityPolicy_allowsStyleFrom_Callback";
+  bool allowsStyleFrom(String url) native "SecurityPolicy_allowsStyleFrom_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19877,7 +20043,6 @@
 
   @DomName('SecurityPolicyViolationEvent.columnNumber')
   @DocsEditable
-  @Experimental // untriaged
   int get columnNumber native "SecurityPolicyViolationEvent_columnNumber_Getter";
 
   @DomName('SecurityPolicyViolationEvent.documentURI')
@@ -20067,117 +20232,117 @@
 
   @DomName('Selection.anchorNode')
   @DocsEditable
-  Node get anchorNode native "DOMSelection_anchorNode_Getter";
+  Node get anchorNode native "Selection_anchorNode_Getter";
 
   @DomName('Selection.anchorOffset')
   @DocsEditable
-  int get anchorOffset native "DOMSelection_anchorOffset_Getter";
+  int get anchorOffset native "Selection_anchorOffset_Getter";
 
   @DomName('Selection.baseNode')
   @DocsEditable
   @Experimental // non-standard
-  Node get baseNode native "DOMSelection_baseNode_Getter";
+  Node get baseNode native "Selection_baseNode_Getter";
 
   @DomName('Selection.baseOffset')
   @DocsEditable
   @Experimental // non-standard
-  int get baseOffset native "DOMSelection_baseOffset_Getter";
+  int get baseOffset native "Selection_baseOffset_Getter";
 
   @DomName('Selection.extentNode')
   @DocsEditable
   @Experimental // non-standard
-  Node get extentNode native "DOMSelection_extentNode_Getter";
+  Node get extentNode native "Selection_extentNode_Getter";
 
   @DomName('Selection.extentOffset')
   @DocsEditable
   @Experimental // non-standard
-  int get extentOffset native "DOMSelection_extentOffset_Getter";
+  int get extentOffset native "Selection_extentOffset_Getter";
 
   @DomName('Selection.focusNode')
   @DocsEditable
-  Node get focusNode native "DOMSelection_focusNode_Getter";
+  Node get focusNode native "Selection_focusNode_Getter";
 
   @DomName('Selection.focusOffset')
   @DocsEditable
-  int get focusOffset native "DOMSelection_focusOffset_Getter";
+  int get focusOffset native "Selection_focusOffset_Getter";
 
   @DomName('Selection.isCollapsed')
   @DocsEditable
-  bool get isCollapsed native "DOMSelection_isCollapsed_Getter";
+  bool get isCollapsed native "Selection_isCollapsed_Getter";
 
   @DomName('Selection.rangeCount')
   @DocsEditable
-  int get rangeCount native "DOMSelection_rangeCount_Getter";
+  int get rangeCount native "Selection_rangeCount_Getter";
 
   @DomName('Selection.type')
   @DocsEditable
   @Experimental // non-standard
-  String get type native "DOMSelection_type_Getter";
+  String get type native "Selection_type_Getter";
 
   @DomName('Selection.addRange')
   @DocsEditable
-  void addRange(Range range) native "DOMSelection_addRange_Callback";
+  void addRange(Range range) native "Selection_addRange_Callback";
 
   @DomName('Selection.collapse')
   @DocsEditable
-  void collapse(Node node, int index) native "DOMSelection_collapse_Callback";
+  void collapse(Node node, int index) native "Selection_collapse_Callback";
 
   @DomName('Selection.collapseToEnd')
   @DocsEditable
-  void collapseToEnd() native "DOMSelection_collapseToEnd_Callback";
+  void collapseToEnd() native "Selection_collapseToEnd_Callback";
 
   @DomName('Selection.collapseToStart')
   @DocsEditable
-  void collapseToStart() native "DOMSelection_collapseToStart_Callback";
+  void collapseToStart() native "Selection_collapseToStart_Callback";
 
   @DomName('Selection.containsNode')
   @DocsEditable
   @Experimental // non-standard
-  bool containsNode(Node node, bool allowPartial) native "DOMSelection_containsNode_Callback";
+  bool containsNode(Node node, bool allowPartial) native "Selection_containsNode_Callback";
 
   @DomName('Selection.deleteFromDocument')
   @DocsEditable
-  void deleteFromDocument() native "DOMSelection_deleteFromDocument_Callback";
+  void deleteFromDocument() native "Selection_deleteFromDocument_Callback";
 
   @DomName('Selection.empty')
   @DocsEditable
   @Experimental // non-standard
-  void empty() native "DOMSelection_empty_Callback";
+  void empty() native "Selection_empty_Callback";
 
   @DomName('Selection.extend')
   @DocsEditable
-  void extend(Node node, int offset) native "DOMSelection_extend_Callback";
+  void extend(Node node, int offset) native "Selection_extend_Callback";
 
   @DomName('Selection.getRangeAt')
   @DocsEditable
-  Range getRangeAt(int index) native "DOMSelection_getRangeAt_Callback";
+  Range getRangeAt(int index) native "Selection_getRangeAt_Callback";
 
   @DomName('Selection.modify')
   @DocsEditable
   @Experimental // non-standard
-  void modify(String alter, String direction, String granularity) native "DOMSelection_modify_Callback";
+  void modify(String alter, String direction, String granularity) native "Selection_modify_Callback";
 
   @DomName('Selection.removeAllRanges')
   @DocsEditable
-  void removeAllRanges() native "DOMSelection_removeAllRanges_Callback";
+  void removeAllRanges() native "Selection_removeAllRanges_Callback";
 
   @DomName('Selection.selectAllChildren')
   @DocsEditable
-  void selectAllChildren(Node node) native "DOMSelection_selectAllChildren_Callback";
+  void selectAllChildren(Node node) native "Selection_selectAllChildren_Callback";
 
   @DomName('Selection.setBaseAndExtent')
   @DocsEditable
   @Experimental // non-standard
-  void setBaseAndExtent(Node baseNode, int baseOffset, Node extentNode, int extentOffset) native "DOMSelection_setBaseAndExtent_Callback";
+  void setBaseAndExtent(Node baseNode, int baseOffset, Node extentNode, int extentOffset) native "Selection_setBaseAndExtent_Callback";
 
   @DomName('Selection.setPosition')
   @DocsEditable
   @Experimental // non-standard
-  void setPosition(Node node, int offset) native "DOMSelection_setPosition_Callback";
+  void setPosition(Node node, int offset) native "Selection_setPosition_Callback";
 
   @DomName('Selection.toString')
   @DocsEditable
-  String toString() native "DOMSelection_toString_Callback";
+  String toString() native "Selection_toString_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20277,7 +20442,7 @@
   @DocsEditable
   Selection getSelection() native "ShadowRoot_getSelection_Callback";
 
-  static bool get supported => _Utils.shadowRootSupported(window.document);
+  static final bool supported = true;
 }
 // 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
@@ -20287,32 +20452,34 @@
 
 
 @DocsEditable
-@DomName('SourceBuffer')
-// https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#sourcebuffer
+@DomName('WebKitSourceBuffer')
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#sourcebuffer
 class SourceBuffer extends NativeFieldWrapperClass1 {
   SourceBuffer.internal();
 
-  @DomName('SourceBuffer.buffered')
+  @DomName('WebKitSourceBuffer.buffered')
   @DocsEditable
-  TimeRanges get buffered native "SourceBuffer_buffered_Getter";
+  TimeRanges get buffered native "WebKitSourceBuffer_buffered_Getter";
 
-  @DomName('SourceBuffer.timestampOffset')
+  @DomName('WebKitSourceBuffer.timestampOffset')
   @DocsEditable
-  num get timestampOffset native "SourceBuffer_timestampOffset_Getter";
+  num get timestampOffset native "WebKitSourceBuffer_timestampOffset_Getter";
 
-  @DomName('SourceBuffer.timestampOffset')
+  @DomName('WebKitSourceBuffer.timestampOffset')
   @DocsEditable
-  void set timestampOffset(num value) native "SourceBuffer_timestampOffset_Setter";
+  void set timestampOffset(num value) native "WebKitSourceBuffer_timestampOffset_Setter";
 
-  @DomName('SourceBuffer.abort')
+  @DomName('WebKitSourceBuffer.abort')
   @DocsEditable
-  void abort() native "SourceBuffer_abort_Callback";
+  void abort() native "WebKitSourceBuffer_abort_Callback";
 
-  @DomName('SourceBuffer.append')
+  @DomName('WebKitSourceBuffer.append')
   @DocsEditable
   @Experimental // non-standard
-  void append(Uint8List data) native "SourceBuffer_append_Callback";
+  void append(Uint8List data) native "WebKitSourceBuffer_append_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20323,22 +20490,24 @@
 
 
 @DocsEditable
-@DomName('SourceBufferList')
-// https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#sourcebufferlist
+@DomName('WebKitSourceBufferList')
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
+// https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#sourcebufferlist
 class SourceBufferList extends EventTarget with ListMixin<SourceBuffer>, ImmutableListMixin<SourceBuffer> implements List<SourceBuffer> {
   SourceBufferList.internal() : super.internal();
 
-  @DomName('SourceBufferList.length')
+  @DomName('WebKitSourceBufferList.length')
   @DocsEditable
-  int get length native "SourceBufferList_length_Getter";
+  int get length native "WebKitSourceBufferList_length_Getter";
 
   SourceBuffer operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
     return _nativeIndexedGetter(index);
   }
-  SourceBuffer _nativeIndexedGetter(int index) native "SourceBufferList_item_Callback";
+  SourceBuffer _nativeIndexedGetter(int index) native "WebKitSourceBufferList_item_Callback";
 
   void operator[]=(int index, SourceBuffer value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -20378,21 +20547,21 @@
   SourceBuffer elementAt(int index) => this[index];
   // -- end List<SourceBuffer> mixins.
 
-  @DomName('SourceBufferList.addEventListener')
+  @DomName('WebKitSourceBufferList.addEventListener')
   @DocsEditable
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "SourceBufferList_addEventListener_Callback";
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "WebKitSourceBufferList_addEventListener_Callback";
 
-  @DomName('SourceBufferList.dispatchEvent')
+  @DomName('WebKitSourceBufferList.dispatchEvent')
   @DocsEditable
-  bool dispatchEvent(Event event) native "SourceBufferList_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) native "WebKitSourceBufferList_dispatchEvent_Callback";
 
-  @DomName('SourceBufferList.item')
+  @DomName('WebKitSourceBufferList.item')
   @DocsEditable
-  SourceBuffer item(int index) native "SourceBufferList_item_Callback";
+  SourceBuffer item(int index) native "WebKitSourceBufferList_item_Callback";
 
-  @DomName('SourceBufferList.removeEventListener')
+  @DomName('WebKitSourceBufferList.removeEventListener')
   @DocsEditable
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "SourceBufferList_removeEventListener_Callback";
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "WebKitSourceBufferList_removeEventListener_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20566,7 +20735,7 @@
   // -- end List<SpeechGrammar> mixins.
 
   void addFromString(String string, [num weight]) {
-    if (?weight) {
+    if (weight != null) {
       _addFromString_1(string, weight);
       return;
     }
@@ -20579,7 +20748,7 @@
   void _addFromString_2(string) native "SpeechGrammarList__addFromString_2_Callback";
 
   void addFromUri(String src, [num weight]) {
-    if (?weight) {
+    if (weight != null) {
       _addFromUri_1(src, weight);
       return;
     }
@@ -20935,48 +21104,41 @@
 
 @DocsEditable
 @DomName('SpeechSynthesis')
-@Experimental // untriaged
+// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section
+@Experimental
 class SpeechSynthesis extends NativeFieldWrapperClass1 {
   SpeechSynthesis.internal();
 
   @DomName('SpeechSynthesis.paused')
   @DocsEditable
-  @Experimental // untriaged
   bool get paused native "SpeechSynthesis_paused_Getter";
 
   @DomName('SpeechSynthesis.pending')
   @DocsEditable
-  @Experimental // untriaged
   bool get pending native "SpeechSynthesis_pending_Getter";
 
   @DomName('SpeechSynthesis.speaking')
   @DocsEditable
-  @Experimental // untriaged
   bool get speaking native "SpeechSynthesis_speaking_Getter";
 
   @DomName('SpeechSynthesis.cancel')
   @DocsEditable
-  @Experimental // untriaged
   void cancel() native "SpeechSynthesis_cancel_Callback";
 
   @DomName('SpeechSynthesis.getVoices')
   @DocsEditable
-  @Experimental // untriaged
   List<SpeechSynthesisVoice> getVoices() native "SpeechSynthesis_getVoices_Callback";
 
   @DomName('SpeechSynthesis.pause')
   @DocsEditable
-  @Experimental // untriaged
   void pause() native "SpeechSynthesis_pause_Callback";
 
   @DomName('SpeechSynthesis.resume')
   @DocsEditable
-  @Experimental // untriaged
   void resume() native "SpeechSynthesis_resume_Callback";
 
   @DomName('SpeechSynthesis.speak')
   @DocsEditable
-  @Experimental // untriaged
   void speak(SpeechSynthesisUtterance utterance) native "SpeechSynthesis_speak_Callback";
 
 }
@@ -20989,23 +21151,21 @@
 
 @DocsEditable
 @DomName('SpeechSynthesisEvent')
-@Experimental // untriaged
+// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section
+@Experimental
 class SpeechSynthesisEvent extends Event {
   SpeechSynthesisEvent.internal() : super.internal();
 
   @DomName('SpeechSynthesisEvent.charIndex')
   @DocsEditable
-  @Experimental // untriaged
   int get charIndex native "SpeechSynthesisEvent_charIndex_Getter";
 
   @DomName('SpeechSynthesisEvent.elapsedTime')
   @DocsEditable
-  @Experimental // untriaged
   num get elapsedTime native "SpeechSynthesisEvent_elapsedTime_Getter";
 
   @DomName('SpeechSynthesisEvent.name')
   @DocsEditable
-  @Experimental // untriaged
   String get name native "SpeechSynthesisEvent_name_Getter";
 
 }
@@ -21018,43 +21178,37 @@
 
 @DocsEditable
 @DomName('SpeechSynthesisUtterance')
-@Experimental // untriaged
+// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section
+@Experimental
 class SpeechSynthesisUtterance extends EventTarget {
   SpeechSynthesisUtterance.internal() : super.internal();
 
   @DomName('SpeechSynthesisUtterance.boundaryEvent')
   @DocsEditable
-  @Experimental // untriaged
   static const EventStreamProvider<SpeechSynthesisEvent> boundaryEvent = const EventStreamProvider<SpeechSynthesisEvent>('boundary');
 
   @DomName('SpeechSynthesisUtterance.endEvent')
   @DocsEditable
-  @Experimental // untriaged
   static const EventStreamProvider<SpeechSynthesisEvent> endEvent = const EventStreamProvider<SpeechSynthesisEvent>('end');
 
   @DomName('SpeechSynthesisUtterance.errorEvent')
   @DocsEditable
-  @Experimental // untriaged
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
   @DomName('SpeechSynthesisUtterance.markEvent')
   @DocsEditable
-  @Experimental // untriaged
   static const EventStreamProvider<SpeechSynthesisEvent> markEvent = const EventStreamProvider<SpeechSynthesisEvent>('mark');
 
   @DomName('SpeechSynthesisUtterance.pauseEvent')
   @DocsEditable
-  @Experimental // untriaged
   static const EventStreamProvider<Event> pauseEvent = const EventStreamProvider<Event>('pause');
 
   @DomName('SpeechSynthesisUtterance.resumeEvent')
   @DocsEditable
-  @Experimental // untriaged
   static const EventStreamProvider<SpeechSynthesisEvent> resumeEvent = const EventStreamProvider<SpeechSynthesisEvent>('resume');
 
   @DomName('SpeechSynthesisUtterance.startEvent')
   @DocsEditable
-  @Experimental // untriaged
   static const EventStreamProvider<SpeechSynthesisEvent> startEvent = const EventStreamProvider<SpeechSynthesisEvent>('start');
 
   @DomName('SpeechSynthesisUtterance.SpeechSynthesisUtterance')
@@ -21068,97 +21222,78 @@
 
   @DomName('SpeechSynthesisUtterance.lang')
   @DocsEditable
-  @Experimental // untriaged
   String get lang native "SpeechSynthesisUtterance_lang_Getter";
 
   @DomName('SpeechSynthesisUtterance.lang')
   @DocsEditable
-  @Experimental // untriaged
   void set lang(String value) native "SpeechSynthesisUtterance_lang_Setter";
 
   @DomName('SpeechSynthesisUtterance.pitch')
   @DocsEditable
-  @Experimental // untriaged
   num get pitch native "SpeechSynthesisUtterance_pitch_Getter";
 
   @DomName('SpeechSynthesisUtterance.pitch')
   @DocsEditable
-  @Experimental // untriaged
   void set pitch(num value) native "SpeechSynthesisUtterance_pitch_Setter";
 
   @DomName('SpeechSynthesisUtterance.rate')
   @DocsEditable
-  @Experimental // untriaged
   num get rate native "SpeechSynthesisUtterance_rate_Getter";
 
   @DomName('SpeechSynthesisUtterance.rate')
   @DocsEditable
-  @Experimental // untriaged
   void set rate(num value) native "SpeechSynthesisUtterance_rate_Setter";
 
   @DomName('SpeechSynthesisUtterance.text')
   @DocsEditable
-  @Experimental // untriaged
   String get text native "SpeechSynthesisUtterance_text_Getter";
 
   @DomName('SpeechSynthesisUtterance.text')
   @DocsEditable
-  @Experimental // untriaged
   void set text(String value) native "SpeechSynthesisUtterance_text_Setter";
 
   @DomName('SpeechSynthesisUtterance.voice')
   @DocsEditable
-  @Experimental // untriaged
   SpeechSynthesisVoice get voice native "SpeechSynthesisUtterance_voice_Getter";
 
   @DomName('SpeechSynthesisUtterance.voice')
   @DocsEditable
-  @Experimental // untriaged
   void set voice(SpeechSynthesisVoice value) native "SpeechSynthesisUtterance_voice_Setter";
 
   @DomName('SpeechSynthesisUtterance.volume')
   @DocsEditable
-  @Experimental // untriaged
   num get volume native "SpeechSynthesisUtterance_volume_Getter";
 
   @DomName('SpeechSynthesisUtterance.volume')
   @DocsEditable
-  @Experimental // untriaged
   void set volume(num value) native "SpeechSynthesisUtterance_volume_Setter";
 
   @DomName('SpeechSynthesisUtterance.onboundary')
   @DocsEditable
-  @Experimental // untriaged
   Stream<SpeechSynthesisEvent> get onBoundary => boundaryEvent.forTarget(this);
 
   @DomName('SpeechSynthesisUtterance.onend')
   @DocsEditable
-  @Experimental // untriaged
   Stream<SpeechSynthesisEvent> get onEnd => endEvent.forTarget(this);
 
   @DomName('SpeechSynthesisUtterance.onerror')
   @DocsEditable
-  @Experimental // untriaged
   Stream<Event> get onError => errorEvent.forTarget(this);
 
   @DomName('SpeechSynthesisUtterance.onmark')
   @DocsEditable
-  @Experimental // untriaged
   Stream<SpeechSynthesisEvent> get onMark => markEvent.forTarget(this);
 
   @DomName('SpeechSynthesisUtterance.onpause')
   @DocsEditable
-  @Experimental // untriaged
   Stream<Event> get onPause => pauseEvent.forTarget(this);
 
   @DomName('SpeechSynthesisUtterance.onresume')
   @DocsEditable
-  @Experimental // untriaged
   Stream<SpeechSynthesisEvent> get onResume => resumeEvent.forTarget(this);
 
   @DomName('SpeechSynthesisUtterance.onstart')
   @DocsEditable
-  @Experimental // untriaged
   Stream<SpeechSynthesisEvent> get onStart => startEvent.forTarget(this);
 
 }
@@ -21171,33 +21306,29 @@
 
 @DocsEditable
 @DomName('SpeechSynthesisVoice')
-@Experimental // untriaged
+// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section
+@Experimental
 class SpeechSynthesisVoice extends NativeFieldWrapperClass1 {
   SpeechSynthesisVoice.internal();
 
   @DomName('SpeechSynthesisVoice.default')
   @DocsEditable
-  @Experimental // untriaged
   bool get defaultValue native "SpeechSynthesisVoice_default_Getter";
 
   @DomName('SpeechSynthesisVoice.lang')
   @DocsEditable
-  @Experimental // untriaged
   String get lang native "SpeechSynthesisVoice_lang_Getter";
 
   @DomName('SpeechSynthesisVoice.localService')
   @DocsEditable
-  @Experimental // untriaged
   bool get localService native "SpeechSynthesisVoice_localService_Getter";
 
   @DomName('SpeechSynthesisVoice.name')
   @DocsEditable
-  @Experimental // untriaged
   String get name native "SpeechSynthesisVoice_name_Getter";
 
   @DomName('SpeechSynthesisVoice.voiceURI')
   @DocsEditable
-  @Experimental // untriaged
   String get voiceUri native "SpeechSynthesisVoice_voiceURI_Getter";
 
 }
@@ -21290,6 +21421,20 @@
   @DocsEditable
   int get $dom_length native "Storage_length_Getter";
 
+  String anonymousIndexedGetter(index_OR_name) {
+    if ((index_OR_name is int || index_OR_name == null)) {
+      return _None_1(index_OR_name);
+    }
+    if ((index_OR_name is String || index_OR_name == null)) {
+      return _None_2(index_OR_name);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  String _None_1(index_OR_name) native "Storage__None_1_Callback";
+
+  String _None_2(index_OR_name) native "Storage__None_2_Callback";
+
   @DomName('Storage.clear')
   @DocsEditable
   void $dom_clear() native "Storage_clear_Callback";
@@ -22039,7 +22184,7 @@
 
 @DomName('Text')
 class Text extends CharacterData {
-  factory Text(String data) => _TextFactoryProvider.createText(data);
+  factory Text(String data) => document.$dom_createTextNode(data);
   Text.internal() : super.internal();
 
   @DomName('Text.webkitInsertionParent')
@@ -22290,11 +22435,11 @@
   void setCustomValidity(String error) native "HTMLTextAreaElement_setCustomValidity_Callback";
 
   void setRangeText(String replacement, [int start, int end, String selectionMode]) {
-    if ((replacement is String || replacement == null) && !?start && !?end && !?selectionMode) {
+    if ((replacement is String || replacement == null) && start == null && end == null && selectionMode == null) {
       _setRangeText_1(replacement);
       return;
     }
-    if ((replacement is String || replacement == null) && (start is int || start == null) && (end is int || end == null) && (selectionMode is String || selectionMode == null)) {
+    if ((selectionMode is String || selectionMode == null) && (end is int || end == null) && (start is int || start == null) && (replacement is String || replacement == null)) {
       _setRangeText_2(replacement, start, end, selectionMode);
       return;
     }
@@ -22306,7 +22451,7 @@
   void _setRangeText_2(replacement, start, end, selectionMode) native "HTMLTextAreaElement__setRangeText_2_Callback";
 
   void setSelectionRange(int start, int end, [String direction]) {
-    if (?direction) {
+    if (direction != null) {
       _setSelectionRange_1(start, end, direction);
       return;
     }
@@ -23395,15 +23540,15 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  static String _createObjectURL_1(blob_OR_source_OR_stream) native "DOMURL__createObjectURL_1_Callback";
+  static String _createObjectURL_1(blob_OR_source_OR_stream) native "URL__createObjectURL_1_Callback";
 
-  static String _createObjectURL_2(blob_OR_source_OR_stream) native "DOMURL__createObjectURL_2_Callback";
+  static String _createObjectURL_2(blob_OR_source_OR_stream) native "URL__createObjectURL_2_Callback";
 
-  static String _createObjectURL_3(blob_OR_source_OR_stream) native "DOMURL__createObjectURL_3_Callback";
+  static String _createObjectURL_3(blob_OR_source_OR_stream) native "URL__createObjectURL_3_Callback";
 
   @DomName('URL.revokeObjectURL')
   @DocsEditable
-  static void revokeObjectUrl(String url) native "DOMURL_revokeObjectURL_Callback";
+  static void revokeObjectUrl(String url) native "URL_revokeObjectURL_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23652,13 +23797,13 @@
   @DomName('WebSocket.WebSocket')
   @DocsEditable
   factory WebSocket(String url, [protocol_OR_protocols]) {
-    if ((url is String || url == null) && !?protocol_OR_protocols) {
+    if ((url is String || url == null) && protocol_OR_protocols == null) {
       return WebSocket._create_1(url);
     }
-    if ((url is String || url == null) && (protocol_OR_protocols is List<String> || protocol_OR_protocols == null)) {
+    if ((protocol_OR_protocols is List<String> || protocol_OR_protocols == null) && (url is String || url == null)) {
       return WebSocket._create_2(url, protocol_OR_protocols);
     }
-    if ((url is String || url == null) && (protocol_OR_protocols is String || protocol_OR_protocols == null)) {
+    if ((protocol_OR_protocols is String || protocol_OR_protocols == null) && (url is String || url == null)) {
       return WebSocket._create_3(url, protocol_OR_protocols);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -23730,11 +23875,11 @@
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "WebSocket_addEventListener_Callback";
 
   void close([int code, String reason]) {
-    if (?reason) {
+    if (reason != null) {
       _close_1(code, reason);
       return;
     }
-    if (?code) {
+    if (code != null) {
       _close_2(code);
       return;
     }
@@ -23991,7 +24136,6 @@
 
   @DomName('Window.DOMContentLoadedEvent')
   @DocsEditable
-  @Experimental // untriaged
   static const EventStreamProvider<Event> contentLoadedEvent = const EventStreamProvider<Event>('DOMContentLoaded');
 
   @DomName('Window.devicemotionEvent')
@@ -24051,7 +24195,6 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
-  @Experimental // untriaged
   static const EventStreamProvider<AnimationEvent> animationEndEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationEnd');
 
   @DomName('Window.webkitAnimationIterationEvent')
@@ -24059,7 +24202,6 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
-  @Experimental // untriaged
   static const EventStreamProvider<AnimationEvent> animationIterationEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationIteration');
 
   @DomName('Window.webkitAnimationStartEvent')
@@ -24067,7 +24209,6 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
-  @Experimental // untriaged
   static const EventStreamProvider<AnimationEvent> animationStartEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationStart');
 
   @DomName('Window.PERSISTENT')
@@ -24084,7 +24225,6 @@
 
   @DomName('Window.CSS')
   @DocsEditable
-  @Experimental // untriaged
   Css get css native "DOMWindow_CSS_Getter";
 
   @DomName('Window.applicationCache')
@@ -24166,17 +24306,13 @@
   @DocsEditable
   Location get location native "DOMWindow_location_Getter";
 
-  @DomName('Window.location')
-  @DocsEditable
-  void set location(Location value) native "DOMWindow_location_Setter";
-
   @DomName('Window.locationbar')
   @DocsEditable
-  BarInfo get locationbar native "DOMWindow_locationbar_Getter";
+  BarProp get locationbar native "DOMWindow_locationbar_Getter";
 
   @DomName('Window.menubar')
   @DocsEditable
-  BarInfo get menubar native "DOMWindow_menubar_Getter";
+  BarProp get menubar native "DOMWindow_menubar_Getter";
 
   @DomName('Window.name')
   @DocsEditable
@@ -24230,7 +24366,7 @@
   @DocsEditable
   // https://developer.mozilla.org/en-US/docs/DOM/window.personalbar
   @deprecated // deprecated
-  BarInfo get personalbar native "DOMWindow_personalbar_Getter";
+  BarProp get personalbar native "DOMWindow_personalbar_Getter";
 
   @DomName('Window.screen')
   @DocsEditable
@@ -24262,7 +24398,7 @@
 
   @DomName('Window.scrollbars')
   @DocsEditable
-  BarInfo get scrollbars native "DOMWindow_scrollbars_Getter";
+  BarProp get scrollbars native "DOMWindow_scrollbars_Getter";
 
   @DomName('Window.self')
   @DocsEditable
@@ -24274,7 +24410,8 @@
 
   @DomName('Window.speechSynthesis')
   @DocsEditable
-  @Experimental // untriaged
+  // https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section
+  @Experimental
   SpeechSynthesis get speechSynthesis native "DOMWindow_speechSynthesis_Getter";
 
   @DomName('Window.status')
@@ -24287,7 +24424,7 @@
 
   @DomName('Window.statusbar')
   @DocsEditable
-  BarInfo get statusbar native "DOMWindow_statusbar_Getter";
+  BarProp get statusbar native "DOMWindow_statusbar_Getter";
 
   @DomName('Window.styleMedia')
   @DocsEditable
@@ -24297,7 +24434,7 @@
 
   @DomName('Window.toolbar')
   @DocsEditable
-  BarInfo get toolbar native "DOMWindow_toolbar_Getter";
+  BarProp get toolbar native "DOMWindow_toolbar_Getter";
 
   @DomName('Window.top')
   @DocsEditable
@@ -24325,6 +24462,9 @@
   @DocsEditable
   WindowBase get window native "DOMWindow_window_Getter";
 
+  @DomName('Window')
+  WindowBase anonymousIndexedGetter(int index) native "DOMWindow_None_Callback";
+
   @DomName('Window.addEventListener')
   @DocsEditable
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "DOMWindow_addEventListener_Callback";
@@ -24345,12 +24485,6 @@
   @DocsEditable
   void cancelAnimationFrame(int id) native "DOMWindow_cancelAnimationFrame_Callback";
 
-  @DomName('Window.captureEvents')
-  @DocsEditable
-  // http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-flow-capture
-  @deprecated // deprecated
-  void captureEvents() native "DOMWindow_captureEvents_Callback";
-
   @DomName('Window.clearInterval')
   @DocsEditable
   void _clearInterval(int handle) native "DOMWindow_clearInterval_Callback";
@@ -24422,12 +24556,6 @@
   @DocsEditable
   void print() native "DOMWindow_print_Callback";
 
-  @DomName('Window.releaseEvents')
-  @DocsEditable
-  // http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-flow-capture
-  @deprecated // deprecated
-  void releaseEvents() native "DOMWindow_releaseEvents_Callback";
-
   @DomName('Window.removeEventListener')
   @DocsEditable
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "DOMWindow_removeEventListener_Callback";
@@ -24524,7 +24652,6 @@
 
   @DomName('Window.onDOMContentLoaded')
   @DocsEditable
-  @Experimental // untriaged
   Stream<Event> get onContentLoaded => contentLoadedEvent.forTarget(this);
 
   @DomName('Window.onabort')
@@ -24739,17 +24866,17 @@
 
   @DomName('Window.onwebkitAnimationEnd')
   @DocsEditable
-  @Experimental // untriaged
+  @Experimental
   Stream<AnimationEvent> get onAnimationEnd => animationEndEvent.forTarget(this);
 
   @DomName('Window.onwebkitAnimationIteration')
   @DocsEditable
-  @Experimental // untriaged
+  @Experimental
   Stream<AnimationEvent> get onAnimationIteration => animationIterationEvent.forTarget(this);
 
   @DomName('Window.onwebkitAnimationStart')
   @DocsEditable
-  @Experimental // untriaged
+  @Experimental
   Stream<AnimationEvent> get onAnimationStart => animationStartEvent.forTarget(this);
 
 
@@ -25699,10 +25826,6 @@
 class _Element_Merged extends Element {
   _Element_Merged.internal() : super.internal();
 
-  @DomName('HTMLElement.children')
-  @DocsEditable
-  HtmlCollection get $dom_children native "HTMLElement_children_Getter";
-
   @DomName('HTMLElement.contentEditable')
   @DocsEditable
   String get contentEditable native "HTMLElement_contentEditable_Getter";
@@ -25823,6 +25946,12 @@
   @DocsEditable
   void click() native "HTMLElement_click_Callback";
 
+  @DomName('HTMLElement.getInputContext')
+  @DocsEditable
+  // http://www.w3.org/TR/ime-api/#the-getinputcontext-method
+  @Experimental
+  InputMethodContext getInputContext() native "HTMLElement_getInputContext_Callback";
+
   @DomName('HTMLElement.insertAdjacentElement')
   @DocsEditable
   @Experimental // non-standard
@@ -25846,20 +25975,6 @@
 
 
 @DocsEditable
-@DomName('EntityReference')
-@deprecated // deprecated
-abstract class _EntityReference extends Node {
-  _EntityReference.internal() : super.internal();
-
-}
-// 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.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
 @DomName('EntryArray')
 // http://www.w3.org/TR/file-system-api/#the-entry-interface
 @Experimental
@@ -30150,57 +30265,6 @@
     return request;
   }
 }
-// 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.
-
-
-class _CssStyleDeclarationFactoryProvider {
-  static CssStyleDeclaration createCssStyleDeclaration_css(String css) {
-    final style = new Element.tag('div').style;
-    style.cssText = css;
-    return style;
-  }
-
-  static CssStyleDeclaration createCssStyleDeclaration() {
-    return new CssStyleDeclaration.css('');
-  }
-}
-
-class _DocumentFragmentFactoryProvider {
-  @DomName('Document.createDocumentFragment')
-  static DocumentFragment createDocumentFragment() =>
-      document.createDocumentFragment();
-
-  static DocumentFragment createDocumentFragment_html(String html) {
-    final fragment = new DocumentFragment();
-    fragment.innerHtml = html;
-    return fragment;
-  }
-
-  // TODO(nweiz): enable this when XML is ported.
-  // factory DocumentFragment.xml(String xml) {
-  //   final fragment = new DocumentFragment();
-  //   final e = new XMLElement.tag("xml");
-  //   e.innerHtml = xml;
-  //
-  //   // Copy list first since we don't want liveness during iteration.
-  //   final List nodes = new List.from(e.nodes);
-  //   fragment.nodes.addAll(nodes);
-  //   return fragment;
-  // }
-
-  static DocumentFragment createDocumentFragment_svg(String svgContent) {
-    final fragment = new DocumentFragment();
-    final e = new svg.SvgSvgElement();
-    e.innerHtml = svgContent;
-
-    // Copy list first since we don't want liveness during iteration.
-    final List nodes = new List.from(e.nodes);
-    fragment.nodes.addAll(nodes);
-    return fragment;
-  }
-}
 /**
  * A custom KeyboardEvent that attempts to eliminate cross-browser
  * inconsistencies, and also provide both keyCode and charCode information
@@ -30305,14 +30369,6 @@
         "Cannot initialize a KeyboardEvent from a KeyEvent.");
   }
 }
-// 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.
-
-
-class _TextFactoryProvider {
-  static Text createText(String data) => document.$dom_createTextNode(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
 // BSD-style license that can be found in the LICENSE file.
@@ -31062,7 +31118,6 @@
   static void spawnDomFunction(Function f, int replyTo) native "Utils_spawnDomFunction";
   static void spawnDomUri(String uri, int replyTo) native "Utils_spawnDomUri";
   static int _getNewIsolateId() native "Utils_getNewIsolateId";
-  static bool shadowRootSupported(Document document) native "Utils_shadowRootSupported";
 }
 
 class _NPObject extends NativeFieldWrapperClass1 {
diff --git a/sdk/lib/html/html_common/conversions.dart b/sdk/lib/html/html_common/conversions.dart
index 2892b7d..063c7e9 100644
--- a/sdk/lib/html/html_common/conversions.dart
+++ b/sdk/lib/html/html_common/conversions.dart
@@ -314,6 +314,49 @@
   return copy;
 }
 
+// Conversions for ImageData
+//
+// On Firefox, the returned ImageData is a plain object.
+
+class _TypedImageData implements ImageData {
+  final Uint8ClampedList data;
+  final int height;
+  final int width;
+
+  _TypedImageData(this.data, this.height, this.width);
+}
+
+ImageData convertNativeToDart_ImageData(nativeImageData) {
+
+  // None of the native getters that return ImageData have the type ImageData
+  // since that is incorrect for FireFox (which returns a plain Object).  So we
+  // need something that tells the compiler that the ImageData class has been
+  // instantiated.
+  // TODO(sra): Remove this when all the ImageData returning APIs have been
+  // annotated as returning the union ImageData + Object.
+  JS('ImageData', '0');
+
+  if (nativeImageData is ImageData) return nativeImageData;
+
+  // On Firefox the above test fails because imagedata is a plain object.
+  // So we create a _TypedImageData.
+
+  return new _TypedImageData(
+      JS('var', '#.data', nativeImageData),
+      JS('var', '#.height', nativeImageData),
+      JS('var', '#.width', nativeImageData));
+}
+
+// We can get rid of this conversion if _TypedImageData implements the fields
+// with native names.
+convertDartToNative_ImageData(ImageData imageData) {
+  if (imageData is _TypedImageData) {
+    return JS('', '{data: #, height: #, width: #}',
+        imageData.data, imageData.height, imageData.width);
+  }
+  return imageData;
+}
+
 
 bool isJavaScriptDate(value) => JS('bool', '# instanceof Date', value);
 bool isJavaScriptRegExp(value) => JS('bool', '# instanceof RegExp', value);
diff --git a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
index 22634d5..ee98234 100644
--- a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
+++ b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
@@ -305,7 +305,7 @@
   @DomName('IDBDatabase.createObjectStore')
   @DocsEditable
   ObjectStore $dom_createObjectStore(String name, [Map options]) {
-    if (?options) {
+    if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
       return _$dom_createObjectStore_1(name, options_1);
     }
@@ -878,7 +878,7 @@
   @Creates('Request')
   @_annotation_Creates_IDBKey
   Request $dom_add(/*any*/ value, [/*any*/ key]) {
-    if (?key) {
+    if (key != null) {
       var value_1 = convertDartToNative_SerializedScriptValue(value);
       var key_2 = convertDartToNative_SerializedScriptValue(key);
       return _$dom_add_1(value_1, key_2);
@@ -914,19 +914,19 @@
   @DomName('IDBObjectStore.createIndex')
   @DocsEditable
   Index $dom_createIndex(String name, keyPath, [Map options]) {
-    if ((keyPath is List<String> || keyPath == null) && !?options) {
+    if ((keyPath is List<String> || keyPath == null) && options == null) {
       List keyPath_1 = convertDartToNative_StringArray(keyPath);
       return _$dom_createIndex_1(name, keyPath_1);
     }
-    if ((keyPath is List<String> || keyPath == null) && ?options) {
+    if (options != null && (keyPath is List<String> || keyPath == null)) {
       List keyPath_2 = convertDartToNative_StringArray(keyPath);
       var options_3 = convertDartToNative_Dictionary(options);
       return _$dom_createIndex_2(name, keyPath_2, options_3);
     }
-    if ((keyPath is String || keyPath == null) && !?options) {
+    if ((keyPath is String || keyPath == null) && options == null) {
       return _$dom_createIndex_3(name, keyPath);
     }
-    if ((keyPath is String || keyPath == null) && ?options) {
+    if (options != null && (keyPath is String || keyPath == null)) {
       var options_4 = convertDartToNative_Dictionary(options);
       return _$dom_createIndex_4(name, keyPath, options_4);
     }
@@ -984,7 +984,7 @@
   @Creates('Request')
   @_annotation_Creates_IDBKey
   Request $dom_put(/*any*/ value, [/*any*/ key]) {
-    if (?key) {
+    if (key != null) {
       var value_1 = convertDartToNative_SerializedScriptValue(value);
       var key_2 = convertDartToNative_SerializedScriptValue(key);
       return _$dom_put_1(value_1, key_2);
diff --git a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
index 745303e..d33a30e 100644
--- a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
+++ b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
@@ -193,13 +193,13 @@
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "IDBDatabase_removeEventListener_Callback";
 
   Transaction transaction(storeName_OR_storeNames, String mode) {
-    if ((storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null) && (mode is String || mode == null)) {
+    if ((mode is String || mode == null) && (storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null)) {
       return _transaction_1(storeName_OR_storeNames, mode);
     }
-    if ((storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null) && (mode is String || mode == null)) {
+    if ((mode is String || mode == null) && (storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null)) {
       return _transaction_2(storeName_OR_storeNames, mode);
     }
-    if ((storeName_OR_storeNames is String || storeName_OR_storeNames == null) && (mode is String || mode == null)) {
+    if ((mode is String || mode == null) && (storeName_OR_storeNames is String || storeName_OR_storeNames == null)) {
       return _transaction_3(storeName_OR_storeNames, mode);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -323,7 +323,7 @@
   OpenDBRequest $dom_deleteDatabase(String name) native "IDBFactory_deleteDatabase_Callback";
 
   OpenDBRequest $dom_open(String name, [int version]) {
-    if (?version) {
+    if (version != null) {
       return _open_1(name, version);
     }
     return _open_2(name);
@@ -484,7 +484,7 @@
     if ((key_OR_range is KeyRange || key_OR_range == null)) {
       return _count_1(key_OR_range);
     }
-    if (?key_OR_range) {
+    if (key_OR_range != null) {
       return _count_2(key_OR_range);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -498,7 +498,7 @@
     if ((key is KeyRange || key == null)) {
       return _get_1(key);
     }
-    if (?key) {
+    if (key != null) {
       return _get_2(key);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -512,7 +512,7 @@
     if ((key is KeyRange || key == null)) {
       return _getKey_1(key);
     }
-    if (?key) {
+    if (key != null) {
       return _getKey_2(key);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -523,10 +523,10 @@
   Request _getKey_2(key) native "IDBIndex__getKey_2_Callback";
 
   Request $dom_openCursor([key_OR_range, String direction]) {
-    if ((key_OR_range is KeyRange || key_OR_range == null) && (direction is String || direction == null)) {
+    if ((direction is String || direction == null) && (key_OR_range is KeyRange || key_OR_range == null)) {
       return _openCursor_1(key_OR_range, direction);
     }
-    if (?key_OR_range && (direction is String || direction == null)) {
+    if ((direction is String || direction == null) && key_OR_range != null) {
       return _openCursor_2(key_OR_range, direction);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -537,10 +537,10 @@
   Request _openCursor_2(key_OR_range, direction) native "IDBIndex__openCursor_2_Callback";
 
   Request $dom_openKeyCursor([key_OR_range, String direction]) {
-    if ((key_OR_range is KeyRange || key_OR_range == null) && (direction is String || direction == null)) {
+    if ((direction is String || direction == null) && (key_OR_range is KeyRange || key_OR_range == null)) {
       return _openKeyCursor_1(key_OR_range, direction);
     }
-    if (?key_OR_range && (direction is String || direction == null)) {
+    if ((direction is String || direction == null) && key_OR_range != null) {
       return _openKeyCursor_2(key_OR_range, direction);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -790,7 +790,7 @@
     if ((key_OR_range is KeyRange || key_OR_range == null)) {
       return _count_1(key_OR_range);
     }
-    if (?key_OR_range) {
+    if (key_OR_range != null) {
       return _count_2(key_OR_range);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -801,10 +801,10 @@
   Request _count_2(key_OR_range) native "IDBObjectStore__count_2_Callback";
 
   Index $dom_createIndex(String name, keyPath, [Map options]) {
-    if ((name is String || name == null) && (keyPath is List<String> || keyPath == null) && (options is Map || options == null)) {
+    if ((options is Map || options == null) && (keyPath is List<String> || keyPath == null) && (name is String || name == null)) {
       return _createIndex_1(name, keyPath, options);
     }
-    if ((name is String || name == null) && (keyPath is String || keyPath == null) && (options is Map || options == null)) {
+    if ((options is Map || options == null) && (keyPath is String || keyPath == null) && (name is String || name == null)) {
       return _createIndex_2(name, keyPath, options);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -818,7 +818,7 @@
     if ((key_OR_keyRange is KeyRange || key_OR_keyRange == null)) {
       return _delete_1(key_OR_keyRange);
     }
-    if (?key_OR_keyRange) {
+    if (key_OR_keyRange != null) {
       return _delete_2(key_OR_keyRange);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -836,7 +836,7 @@
     if ((key is KeyRange || key == null)) {
       return _get_1(key);
     }
-    if (?key) {
+    if (key != null) {
       return _get_2(key);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -851,10 +851,10 @@
   Index index(String name) native "IDBObjectStore_index_Callback";
 
   Request $dom_openCursor([key_OR_range, String direction]) {
-    if ((key_OR_range is KeyRange || key_OR_range == null) && (direction is String || direction == null)) {
+    if ((direction is String || direction == null) && (key_OR_range is KeyRange || key_OR_range == null)) {
       return _openCursor_1(key_OR_range, direction);
     }
-    if (?key_OR_range && (direction is String || direction == null)) {
+    if ((direction is String || direction == null) && key_OR_range != null) {
       return _openCursor_2(key_OR_range, direction);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
diff --git a/sdk/lib/io/directory.dart b/sdk/lib/io/directory.dart
index cd77600..dfe5637 100644
--- a/sdk/lib/io/directory.dart
+++ b/sdk/lib/io/directory.dart
@@ -7,7 +7,7 @@
 /**
  * [Directory] objects are used for working with directories.
  */
-abstract class Directory extends FileSystemEntity {
+abstract class Directory implements FileSystemEntity {
   /**
    * Creates a directory object. The path is either an absolute path,
    * or it is a relative path which is interpreted relative to the directory
diff --git a/sdk/lib/io/directory_impl.dart b/sdk/lib/io/directory_impl.dart
index b9935ca..4d51796 100644
--- a/sdk/lib/io/directory_impl.dart
+++ b/sdk/lib/io/directory_impl.dart
@@ -61,6 +61,10 @@
     return (result == 1);
   }
 
+  Future<FileStat> stat() => FileStat.stat(path);
+
+  FileStat statSync() => FileStat.statSync(path);
+
   // Compute the index of the first directory in the list that exists. If
   // none of the directories exist dirsToCreate.length is returned.
   Future<int> _computeExistingIndex(List dirsToCreate) {
diff --git a/sdk/lib/io/file.dart b/sdk/lib/io/file.dart
index 2eea723..455aa48 100644
--- a/sdk/lib/io/file.dart
+++ b/sdk/lib/io/file.dart
@@ -34,7 +34,7 @@
  *    this.[openWrite]().
  *  * Open the file for random access operations using [open].
  */
-abstract class File extends FileSystemEntity {
+abstract class File implements FileSystemEntity {
   /**
    * Create a File object.
    */
diff --git a/sdk/lib/io/file_impl.dart b/sdk/lib/io/file_impl.dart
index 53a0f50..b855fef 100644
--- a/sdk/lib/io/file_impl.dart
+++ b/sdk/lib/io/file_impl.dart
@@ -266,6 +266,10 @@
     return result;
   }
 
+  Future<FileStat> stat() => FileStat.stat(path);
+
+  FileStat statSync() => FileStat.statSync(path);
+
   Future<File> create() {
     _ensureFileService();
     List request = new List(2);
diff --git a/sdk/lib/io/file_system_entity.dart b/sdk/lib/io/file_system_entity.dart
index ce84e35..0a1ee9e 100644
--- a/sdk/lib/io/file_system_entity.dart
+++ b/sdk/lib/io/file_system_entity.dart
@@ -46,7 +46,7 @@
 
 
   /**
-   * Call the operating system's stat() function on [path].
+   * Calls the operating system's stat() function on [path].
    * Returns a [FileStat] object containing the data returned by stat().
    * If the call fails, returns a [FileStat] object with .type set to
    * FileSystemEntityType.NOT_FOUND and the other fields invalid.
@@ -64,7 +64,7 @@
   }
 
   /**
-   * Asynchronously call the operating system's stat() function on [path].
+   * Asynchronously calls the operating system's stat() function on [path].
    * Returns a Future which completes with a [FileStat] object containing
    * the data returned by stat().
    * If the call fails, completes the future with a [FileStat] object with
@@ -193,14 +193,16 @@
   }
 
   /**
-   * Do two paths refer to the same object in the file system?
-   * Links are not identical to their targets, and two links
-   * are not identical just because they point to identical targets.
-   * Links in intermediate directories in the paths are followed, though.
+   * Synchronously checks whether two paths refer to the same object in the
+   * file system. Returns a [:Future<bool>:] that completes with the result.
    *
-   * Throws an error if one of the paths points to an object that does not
-   * exist.
-   * The target of a link can be compared by first getting it with Link.target.
+   * Comparing a link to its target returns false, as does comparing two links
+   * that point to the same target.  To check the target of a link, use
+   * Link.target explicitly to fetch it.  Directory links appearing
+   * inside a path are followed, though, to find the file system object.
+   *
+   * Completes the returned Future with an error if one of the paths points
+   * to an object that does not exist.
    */
   static Future<bool> identical(String path1, String path2) {
     // Get a new file service port for each request.  We could also cache one.
@@ -220,14 +222,16 @@
 
 
   /**
-   * Do two paths refer to the same object in the file system?
-   * Links are not identical to their targets, and two links
-   * are not identical just because they point to identical targets.
-   * Links in intermediate directories in the paths are followed, though.
+   * Synchronously checks whether two paths refer to the same object in the
+   * file system.
+   *
+   * Comparing a link to its target returns false, as does comparing two links
+   * that point to the same target.  To check the target of a link, use
+   * Link.target explicitly to fetch it.  Directory links appearing
+   * inside a path are followed, though, to find the file system object.
    *
    * Throws an error if one of the paths points to an object that does not
    * exist.
-   * The target of a link can be compared by first getting it with Link.target.
    */
   static bool identicalSync(String path1, String path2) {
     var result = _identical(path1, path2);
@@ -236,7 +240,7 @@
   }
 
   /**
-   * Check whether the file system entity with this path exists. Returns
+   * Checks whether the file system entity with this path exists. Returns
    * a [:Future<bool>:] that completes with the result.
    *
    * Since FileSystemEntity is abstract, every FileSystemEntity object
@@ -252,7 +256,7 @@
   Future<bool> exists();
 
   /**
-   * Synchronously check whether the file system entity with this path
+   * Synchronously checks whether the file system entity with this path
    * exists.
    *
    * Since FileSystemEntity is abstract, every FileSystemEntity object
@@ -266,31 +270,105 @@
    */
   bool existsSync();
 
+  /**
+   * Calls the operating system's stat() function on the [path] of this
+   * [FileSystemEntity].  Identical to [:FileStat.stat(this.path):].
+   *
+   * Returns a [:Future<FileStat>:] object containing the data returned by
+   * stat().
+   *
+   * If the call fails, completes the future with a [FileStat] object
+   * with .type set to
+   * FileSystemEntityType.NOT_FOUND and the other fields invalid.
+   */
+  Future<FileStat> stat();
+
+  /**
+   * Synchronously calls the operating system's stat() function on the
+   * [path] of this [FileSystemEntity].
+   * Identical to [:FileStat.statSync(this.path):].
+   *
+   * Returns a [FileStat] object containing the data returned by stat().
+   *
+   * If the call fails, returns a [FileStat] object with .type set to
+   * FileSystemEntityType.NOT_FOUND and the other fields invalid.
+   */
+  FileStat statSync();
+
+
+  /**
+   * Finds the type of file system object that a path points to. Returns
+   * a [:Future<FileSystemEntityType>:] that completes with the result.
+   *
+   * [FileSystemEntityType] has the constant instances FILE, DIRECTORY,
+   * LINK, and NOT_FOUND.  [type] will return LINK only if the optional
+   * named argument [followLinks] is false, and [path] points to a link.
+   * If the path does not point to a file system object, or any other error
+   * occurs in looking up the path, NOT_FOUND is returned.  The only
+   * error or exception that may be put on the returned future is ArgumentError,
+   * caused by passing the wrong type of arguments to the function.
+   */
   static Future<FileSystemEntityType> type(String path,
                                            {bool followLinks: true})
       => _getTypeAsync(path, followLinks).then(FileSystemEntityType._lookup);
 
+  /**
+   * Synchronously finds the type of file system object that a path points to.
+   * Returns a [FileSystemEntityType].
+   *
+   * [FileSystemEntityType] has the constant instances FILE, DIRECTORY,
+   * LINK, and NOT_FOUND.  [type] will return LINK only if the optional
+   * named argument [followLinks] is false, and [path] points to a link.
+   * If the path does not point to a file system object, or any other error
+   * occurs in looking up the path, NOT_FOUND is returned.  The only
+   * error or exception that may be thrown is ArgumentError,
+   * caused by passing the wrong type of arguments to the function.
+   */
   static FileSystemEntityType typeSync(String path, {bool followLinks: true})
       => FileSystemEntityType._lookup(_getTypeSync(path, followLinks));
 
+
+  /**
+   * Checks if type(path, followLinks: false) returns
+   * FileSystemEntityType.LINK.
+   */
   static Future<bool> isLink(String path) => _getTypeAsync(path, false)
       .then((type) => (type == FileSystemEntityType.LINK._type));
 
+  /**
+   * Checks if type(path) returns FileSystemEntityType.FILE.
+   */
   static Future<bool> isFile(String path) => _getTypeAsync(path, true)
       .then((type) => (type == FileSystemEntityType.FILE._type));
 
+  /**
+   * Checks if type(path) returns FileSystemEntityType.DIRECTORY.
+   */
   static Future<bool> isDirectory(String path) => _getTypeAsync(path, true)
       .then((type) => (type == FileSystemEntityType.DIRECTORY._type));
 
+  /**
+   * Synchronously checks if typeSync(path, followLinks: false) returns
+   * FileSystemEntityType.LINK.
+   */
   static bool isLinkSync(String path) =>
       (_getTypeSync(path, false) == FileSystemEntityType.LINK._type);
 
+  /**
+   * Synchronously checks if typeSync(path) returns
+   * FileSystemEntityType.FILE.
+   */
   static bool isFileSync(String path) =>
       (_getTypeSync(path, true) == FileSystemEntityType.FILE._type);
 
+  /**
+   * Synchronously checks if typeSync(path) returns
+   * FileSystemEntityType.DIRECTORY.
+   */
   static bool isDirectorySync(String path) =>
       (_getTypeSync(path, true) == FileSystemEntityType.DIRECTORY._type);
 
+
   static _throwIfError(Object result, String msg) {
     if (result is OSError) {
       throw new FileIOException(msg, result);
diff --git a/sdk/lib/io/http_headers.dart b/sdk/lib/io/http_headers.dart
index cabdfb0..223b246 100644
--- a/sdk/lib/io/http_headers.dart
+++ b/sdk/lib/io/http_headers.dart
@@ -415,7 +415,7 @@
           if (s[index] == " " || s[index] == "\t" || s[index] == "=") break;
           index++;
         }
-        return s.substring(start, index).toLowerCase();
+        return s.substring(start, index);
       }
 
       String parseValue() {
@@ -424,7 +424,7 @@
           if (s[index] == " " || s[index] == "\t" || s[index] == ";") break;
           index++;
         }
-        return s.substring(start, index).toLowerCase();
+        return s.substring(start, index);
       }
 
       void expect(String expected) {
@@ -669,7 +669,7 @@
         if (s[index] == "=") break;
         index++;
       }
-      return s.substring(start, index).trim().toLowerCase();
+      return s.substring(start, index).trim();
     }
 
     String parseValue() {
@@ -678,7 +678,7 @@
         if (s[index] == ";") break;
         index++;
       }
-      return s.substring(start, index).trim().toLowerCase();
+      return s.substring(start, index).trim();
     }
 
     void expect(String expected) {
diff --git a/sdk/lib/io/link.dart b/sdk/lib/io/link.dart
index a179f66..ddca031 100644
--- a/sdk/lib/io/link.dart
+++ b/sdk/lib/io/link.dart
@@ -8,7 +8,7 @@
  * [Link] objects are references to filesystem links.
  *
  */
-abstract class Link extends FileSystemEntity {
+abstract class Link implements FileSystemEntity {
   /**
    * Creates a Link object.
    */
@@ -119,6 +119,10 @@
 
   bool existsSync() => FileSystemEntity.isLinkSync(path);
 
+  Future<FileStat> stat() => FileStat.stat(path);
+
+  FileStat statSync() => FileStat.statSync(path);
+
   Future<Link> create(String target) {
     _ensureFileService();
     if (Platform.operatingSystem == 'windows') {
diff --git a/sdk/lib/mirrors/mirrors.dart b/sdk/lib/mirrors/mirrors.dart
index 722be26..6b36f30 100644
--- a/sdk/lib/mirrors/mirrors.dart
+++ b/sdk/lib/mirrors/mirrors.dart
@@ -12,6 +12,40 @@
 // 'myField='.  This allows us to assign unique names to getters and
 // setters for the purposes of member lookup.
 
+/**
+ * The mirrors library provides basic reflection support for Dart.
+ * Reflection here is limited to introspection and dynamic
+ * evaluation.
+ *
+ * Introspection is that subset of reflection by which a running
+ * program can examine its own structure. For example, a function
+ * that prints out the names of all the members of an arbitrary object.
+ *
+ * Dynamic evaluation refers the ability to evaluate code that
+ * has not been literally specified at compile time, such as calling a method
+ * whose name is provided as an argument (because it is looked up
+ * in a database, or provided interactively by the user).
+ *
+ * How to Interpret the Dartdoc specifications below
+ *
+ * As a rule, the names of Dart declarations are represented using
+ * instances of class [Symbol]. Whenever we speak of an object *s*
+ * of class [Symbol] denoting a name, we mean the string that
+ * was used to construct *s*.
+ *
+ * We will also frequently abuse notation and write
+ * Dart pseudo-code such as [:o.x(a):], where we have defined
+ * o and a to be objects; what is actually meant in these
+ * cases is [:o'.x(a'):] where *o'* and *a'* are Dart variables
+ * bound to *o* and *a* respectively. Furthermore, *o'* and *a'*
+ * are assumed to be fresh variables (meaning that they are
+ * distinct from any other variables in the program).
+ *
+ * An object is serializable across isolates if and only if it is an instance of
+ * either num, bool, String, a list of objects that are serializable
+ * across isolates or a map whose keys and values are all serializable across
+ * isolates.
+ */
 library dart.mirrors;
 
 import 'dart:async';
@@ -143,9 +177,14 @@
    * the qualified name of a method 'method' in class 'Class' in
    * library 'library' is 'library.Class.method'.
    *
-   * TODO(turnidge): Specify whether this name is unique.  Currently
-   * this is a gray area due to lack of clarity over whether library
-   * names are unique.
+   * Returns a [Symbol] constructed from a string representing the
+   * fully qualified name of the reflectee.
+   * Let *o* be the [owner] of this mirror, let *r* be the reflectee of
+   * this mirror, let *p* be the fully qualified
+   * name of the reflectee of *o*, and let *s* be the simple name of *r*
+   * computed by [simpleName].
+   * The fully qualified name of *r* is the
+   * concatenation of *p*, '.', and *s*.
    */
   Symbol get qualifiedName;
 
@@ -153,13 +192,20 @@
    * A mirror on the owner of this function.  This is the declaration
    * immediately surrounding the reflectee.
    *
-   * Note that for libraries, the owner will be [:null:].
+   * For a library, the owner is [:null:].
+   * For a class, typedef or top level function or variable, the owner is
+   * the enclosing library. For a method, instance variable or
+   * a static variable, the owner is the immediately enclosing class.
+   * For a parameter, local variable or local function the owner is the
+   * immediately enclosing function.
    */
   DeclarationMirror get owner;
 
   /**
    * Is this declaration private?
    *
+   * A declaration is private if and only if it is considered private
+   * according to the Dart language specification.
    * Note that for libraries, this will be [:false:].
    */
   bool get isPrivate;
@@ -199,9 +245,24 @@
 
   /**
    * Invokes the named function and returns a mirror on the result.
-   * The arguments are objects local to the current isolate.
+   *
+   * Let *o* be the object reflected by this mirror, let
+   * *f* be the simple name of the member denoted by [memberName],
+   * let *a1, ..., an* be the elements of [positionalArguments]
+   * let *k1, ..., km* be the identifiers denoted by the elements of
+   * [namedArguments.keys]
+   * and let *v1, ..., vm* be the elements of [namedArguments.values].
+   * Then this method will perform the method invocation
+   *  *o.f(a1, ..., an, k1: v1, ..., km: vm)*
+   * in a scope that has access to the private members
+   * of *o* (if *o* is a class or library) or the private members of the
+   * class of *o* (otherwise).
+   * If the invocation returns a result *r*, this method returns
+   * the result of calling [reflect](*r*).
+   * If the invocation throws an exception *e* (that it does not catch)
+   * the the result is a [MirrorError] wrapping *e*.
    */
-  /* TODO(turnidge): Properly document.
+  /*
    * TODO(turnidge): Handle ambiguous names.
    * TODO(turnidge): Handle optional & named arguments.
    */
@@ -213,6 +274,18 @@
    * Invokes a getter and returns a mirror on the result. The getter
    * can be the implicit getter for a field or a user-defined getter
    * method.
+   *
+   * Let *o* be the object reflected by this mirror, let
+   * *f* be the simple name of the getter denoted by [fieldName],
+   * Then this method will perform the getter invocation
+   *  *o.f*
+   * in a scope that has access to the private members
+   * of *o* (if *o* is a class or library) or the private members of the
+   * class of *o* (otherwise).
+   * If the invocation returns a result *r*, this method returns
+   * the result of calling [reflect](*r*).
+   * If the invocation throws an exception *e* (that it does not catch)
+   * the the result is a [MirrorError] wrapping *e*.
    */
   /* TODO(turnidge): Handle ambiguous names.*/
   InstanceMirror getField(Symbol fieldName);
@@ -221,17 +294,53 @@
    * Invokes a setter and returns a mirror on the result. The setter
    * may be either the implicit setter for a non-final field or a
    * user-defined setter method.
-   * The argument is an object local to the current isolate.
+   *
+   * Let *o* be the object reflected by this mirror, let
+   * *f* be the simple name of the getter denoted by [fieldName],
+   * and let *a* be the object bound to [value].
+   * Then this method will perform the setter invocation
+   * *o.f = a*
+   * in a scope that has access to the private members
+   * of *o* (if *o* is a class or library) or the private members of the
+   * class of *o* (otherwise).
+   * If the invocation returns a result *r*, this method returns
+   * the result of calling [reflect]([value]).
+   * If the invocation throws an exception *e* (that it does not catch)
+   * the the result is a [MirrorError] wrapping *e*.
    */
   /* TODO(turnidge): Handle ambiguous names.*/
   InstanceMirror setField(Symbol fieldName, Object arg);
 
   /**
    * Invokes the named function and returns a mirror on the result.
-   * The arguments must be instances of [InstanceMirror], [num],
-   * [String], or [bool].
+   * The arguments must be instances of [InstanceMirror], or of
+   * a type that is serializable across isolates (currently [num],
+   * [String], or [bool]).
+   *
+   * Let *o* be the object reflected by this mirror, let
+   * *f* be the simple name of the member denoted by [memberName],
+   * let *a1, ..., an* be the elements of [positionalArguments]
+   * let *k1, ..., km* be the identifiers denoted by the elements of
+   * [namedArguments.keys]
+   * and let *v1, ..., vm* be the elements of [namedArguments.values].
+   * For each *ai*, if *ai* is an instance of [InstanceMirror], let *pi*
+   * be the object reflected by *ai*; otherwise let *pi = ai,  i in 1 ...n*.
+   * Likewise, for each *vj*, if *vj* is an instance of [InstanceMirror], let *qj*
+   * be the object reflected by *vj*; otherwise let *qj = vj,  j in 1 ...m*.
+   * If any of the *pi, qj* is not an instance of [InstanceMirror] and
+   * is not serializable across isolates, an exception is thrown.
+   * Then this method will perform the method invocation
+   *  *o.f(p1, ..., pn, k1: q1, ..., km: qm)*
+   * in a scope that has access to the private members
+   * of *o* (if *o* is a class or library) or the private members of the
+   * class of *o*(otherwise).
+   * The method returns a future *k*.
+   * If the invocation returns a result *r*, *k* will be completed
+   * with the result of calling [reflect](*r*).
+   * If the invocation throws an exception *e* (that it does not catch)
+   * then *k* is completed with a [MirrorError] wrapping *e*.
    */
-  /* TODO(turnidge): Properly document.
+  /*
    * TODO(turnidge): Handle ambiguous names.
    * TODO(turnidge): Handle optional & named arguments.
    */
@@ -243,6 +352,19 @@
    * Invokes a getter and returns a mirror on the result. The getter
    * can be the implicit getter for a field or a user-defined getter
    * method.
+   *
+   * Let *o* be the object reflected by this mirror, let
+   * *f* be the simple name of the getter denoted by [fieldName],
+   * Then this method will perform the getter invocation
+   *  *o.f*
+   * in a scope that has access to the private members
+   * of *o* (if *o* is a class or library) or the private members of the
+   * class of *o*(otherwise).
+   * The method returns a future *k*.
+   * If the invocation returns a result *r*, *k* will be completed
+   * with the result of calling [reflect](*r*).
+   * If the invocation throws an exception *e* (that it does not catch)
+   * then *k* is completed with a [MirrorError] wrapping *e*.
    */
   /* TODO(turnidge): Handle ambiguous names.*/
   Future<InstanceMirror> getFieldAsync(Symbol fieldName);
@@ -251,8 +373,27 @@
    * Invokes a setter and returns a mirror on the result. The setter
    * may be either the implicit setter for a non-final field or a
    * user-defined setter method.
-   * The argument must be an instance of either [InstanceMirror], [num],
-   * [String], or [bool].
+   * The argument must be an instance of [InstanceMirror], or of
+   * a type that is serializable across isolates (currently [num],
+   * [String], or [bool]).
+   *
+   * Let *o* be the object reflected by this mirror, let
+   * *f* be the simple name of the getter denoted by [fieldName],
+   * and let a be the object bound to [value]. If *a* is an instance of
+   * [InstanceMirror]  let *p* be the object
+   * reflected by *a*, otherwise let *p =a*.
+   * If *p* is not an instance of [InstanceMirror], *p* must be
+   * serializable across isolates or an exception is thrown.
+   * Then this method will perform the setter invocation
+   *  *o.f = a*
+   * in a scope that has access to the private members
+   * of *o* (if *o* is a class or library) or the private members of the
+   * class of *o*(otherwise).
+   * The method returns a future *k*.
+   * If the invocation returns a result *r*, *k* will be completed
+   * with the result of calling [reflect](*r*).
+   * If the invocation throws an exception *e* (that it does not catch)
+   * then *k* is completed with a [MirrorError} wrapping *e*.
    */
   /* TODO(turnidge): Handle ambiguous names.*/
   Future<InstanceMirror> setFieldAsync(Symbol fieldName, Object value);
@@ -264,6 +405,11 @@
 abstract class InstanceMirror implements ObjectMirror {
   /**
    * A mirror on the type of the reflectee.
+   *
+   * Returns a mirror on the actual class of the reflectee.
+   * The class of the reflectee may differ from
+   * the object returned by invoking [runtimeType] on
+   * the reflectee.
    */
   ClassMirror get type;
 
@@ -293,10 +439,11 @@
 
   /**
    * Perform [invocation] on [reflectee].
+   * Equivalent to
    *
-   * If [reflectee] doesn't support the invocation, its [noSuchMethod]
-   * method will be called with either [invocation] or another
-   * equivalent instance of [Invocation].
+   * this.invoke(invocation.memberName,
+   *             invocation.positionalArguments,
+   *             invocation.namedArguments);
    */
   delegate(Invocation invocation);
 }
@@ -321,16 +468,48 @@
   String get source;
 
   /**
-   * Executes the closure.
-   * The arguments are objects local to the current isolate. 
+   * Executes the closure and returns a mirror on the result.
+   * Let *f* be the closure reflected by this mirror,
+   * let *a1, ..., an* be the elements of [positionalArguments]
+   * let *k1, ..., km* be the identifiers denoted by the elements of
+   * [namedArguments.keys]
+   * and let *v1, ..., vm* be the elements of [namedArguments.values].
+   * Then this method will perform the method invocation
+   *  *f(a1, ..., an, k1: v1, ..., km: vm)*
+   * If the invocation returns a result *r*, this method returns
+   * the result of calling [reflect](*r*).
+   * If the invocation throws an exception *e* (that it does not catch)
+   * the the result is a [MirrorError] wrapping *e*.
    */
   InstanceMirror apply(List<Object> positionalArguments,
                        [Map<Symbol,Object> namedArguments]);
 
   /**
-   * Executes the closure.
-   * The arguments must be instances of [InstanceMirror], [num],
-   * [String], or [bool].
+   * Executes the closure and returns a mirror on the result.
+   *
+   * Let *f* be the closure reflected by this mirror,
+   * let *a1, ..., an* be the elements of [positionalArguments]
+   * let *k1, ..., km* be the identifiers denoted by the elements of
+   * [namedArguments.keys]
+   * and let *v1, ..., vm* be the elements of [namedArguments.values].
+   * For each *ai*, if *ai* is an instance of [InstanceMirror], let *pi*
+   * be the object reflected by *ai*; otherwise let *pi = ai,  i in 1 ...n*.
+   * Likewise, for each *vj*, if *vj* is an instance of [InstanceMirror], let
+   * *qj*
+   * be the object reflected by *vj*; otherwise let *qj = vj,  j in 1 ...m*.
+   * If any of the *pi, qj* is not an instance of [InstanceMirror] and
+   * is not serializable across isolates, an exception is thrown.
+   * Then this method will perform the function invocation
+   *  *f(p1, ..., pn, k1: q1, ..., km: qm)*
+   * The method returns a future *k*.
+   * If the invocation returns a result *r*, *k* will be completed
+   * with the result of calling [reflect](*r*).
+   * If the invocation throws an exception *e* (that it does not catch)
+   * then *k* is completed with a [MirrorError] wrapping *e*.
+   *
+   * The arguments must be instances of [InstanceMirror], or of
+   * a type that is serializable across isolates (currently [num],
+   * [String], or [bool]).
    */
   Future<InstanceMirror> applyAsync(List<Object> positionalArguments,
                                     [Map<Symbol, Object> namedArguments]);
@@ -338,6 +517,18 @@
   /**
    * Looks up the value of a name in the scope of the closure. The
    * result is a mirror on that value.
+   *
+   * Let *s* be the contents of the string used to construct the symbol [name].
+   *
+   * If the expression *s* occurs within the source code of the reflectee,
+   * and that any such occurrence refers to a declaration outside the reflectee,
+   * then let *v* be the result of evaluating the expression *s* at such
+   * an occurrence.
+   * If *s = this*, and the reflectee was defined within the instance scope of
+   * an object *o*, then let *v* be *o*.
+   *
+   * The returned value is the result of invoking the method [reflect] on
+   * *v*.
    */
   Future<InstanceMirror> findInContext(Symbol name);
 }
@@ -498,21 +689,70 @@
    */
   ClassMirror get originalDeclaration;
 
-  /**
+   /**
    * Invokes the named constructor and returns a mirror on the result.
-   * The arguments are objects local to the current isolate 
+   *
+   * Let *c* be the class reflected by this mirror
+   * let *a1, ..., an* be the elements of [positionalArguments]
+   * let *k1, ..., km* be the identifiers denoted by the elements of
+   * [namedArguments.keys]
+   * and let *v1, ..., vm* be the elements of [namedArguments.values].
+   * If [constructorName] was created from the empty string
+   * Then this method will execute the instance creation expression
+   * *new c(a1, ..., an, k1: v1, ..., km: vm)*
+   * in a scope that has access to the private members
+   * of *c*. Otherwise, let
+   * *f* be the simple name of the constructor denoted by [constructorName]
+   * Then this method will execute the instance creation expression
+   *  *new c.f(a1, ..., an, k1: v1, ..., km: vm)*
+   * in a scope that has access to the private members
+   * of *c*.
+   * In either case:
+   * If the expression evaluates to a result *r*, this method returns
+   * the result of calling [reflect](*r*).
+   * If evaluating the expression throws an exception *e* (that it does not
+   * catch)
+   * the the result is a [MirrorError] wrapping *e*.
    */
-  /* TODO(turnidge): Properly document.*/
   InstanceMirror newInstance(Symbol constructorName,
                              List positionalArguments,
                              [Map<Symbol,dynamic> namedArguments]);
 
-  /**
-   * Invokes the named constructor and returns a mirror on the result.
-   * The arguments must be instances of [InstanceMirror], [num],
-   * [String] or [bool].
-   */
-  /* TODO(turnidge): Properly document.*/
+ /**
+   * Invokes the named function and returns a mirror on the result.
+   * The arguments must be instances of [InstanceMirror], or of
+   * a type that is serializable across isolates (currently [num],
+   * [String], or [bool]).
+   *
+   * Let *c* be the class reflected by this mirror,
+   * let *a1, ..., an* be the elements of [positionalArguments]
+   * let *k1, ..., km* be the identifiers denoted by the elements of
+   * [namedArguments.keys]
+   * and let *v1, ..., vm* be the elements of [namedArguments.values].
+   * For each *ai*, if *ai* is an instance of [InstanceMirror], let *pi*
+   * be the object reflected by *ai*; otherwise let *pi = ai,  i in 1 ...n*.
+   * Likewise, for each *vj*, if *vj* is an instance of [InstanceMirror], let
+   * *qj*
+   * be the object reflected by *vj*; otherwise let *qj = vj,  j in 1 ...m*.
+   * If any of the *pi, qj* is not an instance of [InstanceMirror] and
+   * is not serializable across isolates, an exception is thrown.
+   * If [constructorName] was created from the empty string
+   * Then this method will execute the instance creation expression
+   * *new c(a1, ..., an, k1: v1, ..., km: vm)*
+   * in a scope that has access to the private members
+   * of *c*. Otherwise, let
+   * *f* be the simple name of the constructor denoted by [constructorName]
+   * Then this method will execute the instance creation expression
+   *  *new c.f(a1, ..., an, k1: v1, ..., km: vm)*
+   * in a scope that has access to the private members
+   * of *c*.
+   * In either case:
+   * The method returns a future *k*.
+   * If the invocation returns a result *r*, *k* will be completed
+   * with the result of calling [reflect](*r*).
+   * If the invocation throws an exception *e* (that it does not catch)
+   * then *k* is completed with a [MirrorError] wrapping *e*.
+*/
   Future<InstanceMirror> newInstanceAsync(Symbol constructorName,
                                           List<Object> positionalArguments,
                                           [Map<Symbol, Object> namedArguments]);
diff --git a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
index 30413ba..87ff63b 100644
--- a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
+++ b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
@@ -6,7 +6,7 @@
 import 'dart:html';
 import 'dart:html_common';
 import 'dart:typed_data';
-import 'dart:_js_helper' show Creates, Returns, convertDartClosureToJS;
+import 'dart:_js_helper' show Creates, JSName, Returns, convertDartClosureToJS;
 import 'dart:_foreign_helper' show JS;
 import 'dart:_interceptors' show Interceptor;
 // DO NOT EDIT - unless you are editing documentation as per:
@@ -191,17 +191,14 @@
 
   @DomName('AudioBufferSourceNode.noteGrainOn')
   @DocsEditable
-  @Experimental // untriaged
   void noteGrainOn(num when, num grainOffset, num grainDuration) native;
 
   @DomName('AudioBufferSourceNode.noteOff')
   @DocsEditable
-  @Experimental // untriaged
   void noteOff(num when) native;
 
   @DomName('AudioBufferSourceNode.noteOn')
   @DocsEditable
-  @Experimental // untriaged
   void noteOn(num when) native;
 
 }
@@ -276,7 +273,6 @@
 
   @DomName('AudioContext.createDelayNode')
   @DocsEditable
-  @Experimental // untriaged
   DelayNode createDelayNode([num maxDelayTime]) native;
 
   @DomName('AudioContext.createDynamicsCompressor')
@@ -285,12 +281,10 @@
 
   @DomName('AudioContext.createGainNode')
   @DocsEditable
-  @Experimental // untriaged
   GainNode createGainNode() native;
 
   @DomName('AudioContext.createJavaScriptNode')
   @DocsEditable
-  @Experimental // untriaged
   ScriptProcessorNode createJavaScriptNode(int bufferSize, [int numberOfInputChannels, int numberOfOutputChannels]) native;
 
   @DomName('AudioContext.createMediaElementSource')
@@ -415,7 +409,7 @@
 @DomName('AudioNode')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioNode-section
 @Experimental
-class AudioNode native "AudioNode" {
+class AudioNode extends EventTarget native "AudioNode" {
 
   @DomName('AudioNode.channelCount')
   @DocsEditable
@@ -441,6 +435,11 @@
   @DocsEditable
   final int numberOfOutputs;
 
+  @JSName('addEventListener')
+  @DomName('AudioNode.addEventListener')
+  @DocsEditable
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
+
   @DomName('AudioNode.connect')
   @DocsEditable
   void connect(destination, int output, [int input]) native;
@@ -448,6 +447,15 @@
   @DomName('AudioNode.disconnect')
   @DocsEditable
   void disconnect(int output) native;
+
+  @DomName('AudioNode.dispatchEvent')
+  @DocsEditable
+  bool dispatchEvent(Event event) native;
+
+  @JSName('removeEventListener')
+  @DomName('AudioNode.removeEventListener')
+  @DocsEditable
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 }
 // 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
@@ -502,7 +510,6 @@
 
   @DomName('AudioParam.setTargetValueAtTime')
   @DocsEditable
-  @Experimental // untriaged
   void setTargetValueAtTime(num targetValue, num time, num timeConstant) native;
 
   @DomName('AudioParam.setValueAtTime')
@@ -870,12 +877,10 @@
 
   @DomName('OscillatorNode.noteOff')
   @DocsEditable
-  @Experimental // untriaged
   void noteOff(num when) native;
 
   @DomName('OscillatorNode.noteOn')
   @DocsEditable
-  @Experimental // untriaged
   void noteOn(num when) native;
 
   @DomName('OscillatorNode.setWaveTable')
diff --git a/sdk/lib/web_audio/dartium/web_audio_dartium.dart b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
index 2eefb8c..d2cddf3 100644
--- a/sdk/lib/web_audio/dartium/web_audio_dartium.dart
+++ b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
@@ -206,29 +206,26 @@
 
   @DomName('AudioBufferSourceNode.noteGrainOn')
   @DocsEditable
-  @Experimental // untriaged
   void noteGrainOn(num when, num grainOffset, num grainDuration) native "AudioBufferSourceNode_noteGrainOn_Callback";
 
   @DomName('AudioBufferSourceNode.noteOff')
   @DocsEditable
-  @Experimental // untriaged
   void noteOff(num when) native "AudioBufferSourceNode_noteOff_Callback";
 
   @DomName('AudioBufferSourceNode.noteOn')
   @DocsEditable
-  @Experimental // untriaged
   void noteOn(num when) native "AudioBufferSourceNode_noteOn_Callback";
 
   void start(num when, [num grainOffset, num grainDuration]) {
-    if ((when is num || when == null) && !?grainOffset && !?grainDuration) {
+    if ((when is num || when == null) && grainOffset == null && grainDuration == null) {
       _start_1(when);
       return;
     }
-    if ((when is num || when == null) && (grainOffset is num || grainOffset == null) && !?grainDuration) {
+    if ((grainOffset is num || grainOffset == null) && (when is num || when == null) && grainDuration == null) {
       _start_2(when, grainOffset);
       return;
     }
-    if ((when is num || when == null) && (grainOffset is num || grainOffset == null) && (grainDuration is num || grainDuration == null)) {
+    if ((grainDuration is num || grainDuration == null) && (grainOffset is num || grainOffset == null) && (when is num || when == null)) {
       _start_3(when, grainOffset, grainDuration);
       return;
     }
@@ -300,10 +297,10 @@
   BiquadFilterNode createBiquadFilter() native "AudioContext_createBiquadFilter_Callback";
 
   AudioBuffer createBuffer(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames, [num sampleRate]) {
-    if ((buffer_OR_numberOfChannels is int || buffer_OR_numberOfChannels == null) && (mixToMono_OR_numberOfFrames is int || mixToMono_OR_numberOfFrames == null) && (sampleRate is num || sampleRate == null)) {
+    if ((sampleRate is num || sampleRate == null) && (mixToMono_OR_numberOfFrames is int || mixToMono_OR_numberOfFrames == null) && (buffer_OR_numberOfChannels is int || buffer_OR_numberOfChannels == null)) {
       return _createBuffer_1(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames, sampleRate);
     }
-    if ((buffer_OR_numberOfChannels is ByteBuffer || buffer_OR_numberOfChannels == null) && (mixToMono_OR_numberOfFrames is bool || mixToMono_OR_numberOfFrames == null) && !?sampleRate) {
+    if ((mixToMono_OR_numberOfFrames is bool || mixToMono_OR_numberOfFrames == null) && (buffer_OR_numberOfChannels is ByteBuffer || buffer_OR_numberOfChannels == null) && sampleRate == null) {
       return _createBuffer_2(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -318,7 +315,7 @@
   AudioBufferSourceNode createBufferSource() native "AudioContext_createBufferSource_Callback";
 
   ChannelMergerNode createChannelMerger([int numberOfInputs]) {
-    if (?numberOfInputs) {
+    if (numberOfInputs != null) {
       return _createChannelMerger_1(numberOfInputs);
     }
     return _createChannelMerger_2();
@@ -329,7 +326,7 @@
   ChannelMergerNode _createChannelMerger_2() native "AudioContext__createChannelMerger_2_Callback";
 
   ChannelSplitterNode createChannelSplitter([int numberOfOutputs]) {
-    if (?numberOfOutputs) {
+    if (numberOfOutputs != null) {
       return _createChannelSplitter_1(numberOfOutputs);
     }
     return _createChannelSplitter_2();
@@ -344,7 +341,7 @@
   ConvolverNode createConvolver() native "AudioContext_createConvolver_Callback";
 
   DelayNode createDelay([num maxDelayTime]) {
-    if (?maxDelayTime) {
+    if (maxDelayTime != null) {
       return _createDelay_1(maxDelayTime);
     }
     return _createDelay_2();
@@ -355,7 +352,7 @@
   DelayNode _createDelay_2() native "AudioContext__createDelay_2_Callback";
 
   DelayNode createDelayNode([num maxDelayTime]) {
-    if (?maxDelayTime) {
+    if (maxDelayTime != null) {
       return _createDelayNode_1(maxDelayTime);
     }
     return _createDelayNode_2();
@@ -375,14 +372,13 @@
 
   @DomName('AudioContext.createGainNode')
   @DocsEditable
-  @Experimental // untriaged
   GainNode createGainNode() native "AudioContext_createGainNode_Callback";
 
   ScriptProcessorNode createJavaScriptNode(int bufferSize, [int numberOfInputChannels, int numberOfOutputChannels]) {
-    if (?numberOfOutputChannels) {
+    if (numberOfOutputChannels != null) {
       return _createJavaScriptNode_1(bufferSize, numberOfInputChannels, numberOfOutputChannels);
     }
-    if (?numberOfInputChannels) {
+    if (numberOfInputChannels != null) {
       return _createJavaScriptNode_2(bufferSize, numberOfInputChannels);
     }
     return _createJavaScriptNode_3(bufferSize);
@@ -415,10 +411,10 @@
   PannerNode createPanner() native "AudioContext_createPanner_Callback";
 
   ScriptProcessorNode createScriptProcessor(int bufferSize, [int numberOfInputChannels, int numberOfOutputChannels]) {
-    if (?numberOfOutputChannels) {
+    if (numberOfOutputChannels != null) {
       return _createScriptProcessor_1(bufferSize, numberOfInputChannels, numberOfOutputChannels);
     }
-    if (?numberOfInputChannels) {
+    if (numberOfInputChannels != null) {
       return _createScriptProcessor_2(bufferSize, numberOfInputChannels);
     }
     return _createScriptProcessor_3(bufferSize);
@@ -524,8 +520,8 @@
 @DomName('AudioNode')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioNode-section
 @Experimental
-class AudioNode extends NativeFieldWrapperClass1 {
-  AudioNode.internal();
+class AudioNode extends EventTarget {
+  AudioNode.internal() : super.internal();
 
   @DomName('AudioNode.channelCount')
   @DocsEditable
@@ -563,12 +559,16 @@
   @DocsEditable
   int get numberOfOutputs native "AudioNode_numberOfOutputs_Getter";
 
+  @DomName('AudioNode.addEventListener')
+  @DocsEditable
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "AudioNode_addEventListener_Callback";
+
   void connect(destination, int output, [int input]) {
-    if ((destination is AudioNode || destination == null) && (output is int || output == null) && (input is int || input == null)) {
+    if ((input is int || input == null) && (output is int || output == null) && (destination is AudioNode || destination == null)) {
       _connect_1(destination, output, input);
       return;
     }
-    if ((destination is AudioParam || destination == null) && (output is int || output == null) && !?input) {
+    if ((output is int || output == null) && (destination is AudioParam || destination == null) && input == null) {
       _connect_2(destination, output);
       return;
     }
@@ -583,6 +583,14 @@
   @DocsEditable
   void disconnect(int output) native "AudioNode_disconnect_Callback";
 
+  @DomName('AudioNode.dispatchEvent')
+  @DocsEditable
+  bool dispatchEvent(Event event) native "AudioNode_dispatchEvent_Callback";
+
+  @DomName('AudioNode.removeEventListener')
+  @DocsEditable
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "AudioNode_removeEventListener_Callback";
+
 }
 // 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
@@ -644,7 +652,6 @@
 
   @DomName('AudioParam.setTargetValueAtTime')
   @DocsEditable
-  @Experimental // untriaged
   void setTargetValueAtTime(num targetValue, num time, num timeConstant) native "AudioParam_setTargetValueAtTime_Callback";
 
   @DomName('AudioParam.setValueAtTime')
@@ -1090,12 +1097,10 @@
 
   @DomName('OscillatorNode.noteOff')
   @DocsEditable
-  @Experimental // untriaged
   void noteOff(num when) native "OscillatorNode_noteOff_Callback";
 
   @DomName('OscillatorNode.noteOn')
   @DocsEditable
-  @Experimental // untriaged
   void noteOn(num when) native "OscillatorNode_noteOn_Callback";
 
   @DomName('OscillatorNode.setWaveTable')
diff --git a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
index ae64061..91c3949 100644
--- a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
+++ b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
@@ -761,6 +761,17 @@
 
 
 @DocsEditable
+@DomName('OESTextureFloatLinear')
+// http://www.khronos.org/registry/webgl/extensions/OES_texture_float_linear/
+@Experimental
+class OesTextureFloatLinear native "OESTextureFloatLinear" {
+}
+// 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.
+
+
+@DocsEditable
 @DomName('OESTextureHalfFloat')
 // http://www.khronos.org/registry/webgl/extensions/OES_texture_half_float/
 @Experimental // experimental
@@ -768,7 +779,6 @@
 
   @DomName('OESTextureHalfFloat.HALF_FLOAT_OES')
   @DocsEditable
-  @Experimental // untriaged
   static const int HALF_FLOAT_OES = 0x8D61;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -777,6 +787,17 @@
 
 
 @DocsEditable
+@DomName('OESTextureHalfFloatLinear')
+// http://www.khronos.org/registry/webgl/extensions/OES_texture_half_float_linear/
+@Experimental
+class OesTextureHalfFloatLinear native "OESTextureHalfFloatLinear" {
+}
+// 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.
+
+
+@DocsEditable
 @DomName('OESVertexArrayObject')
 // http://www.khronos.org/registry/webgl/extensions/OES_vertex_array_object/
 @Experimental // experimental
@@ -2439,24 +2460,24 @@
   @DomName('WebGLRenderingContext.texImage2D')
   @DocsEditable
   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 ((border_OR_canvas_OR_image_OR_pixels_OR_video is int || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && ?format && ?type && ?pixels) {
+    if (pixels != null && type != null && format != null && (border_OR_canvas_OR_image_OR_pixels_OR_video is int || border_OR_canvas_OR_image_OR_pixels_OR_video == null)) {
       _texImage2D_1(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
       return;
     }
-    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageData || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && !?format && !?type && !?pixels) {
-      var pixels_1 = _convertDartToNative_ImageData(border_OR_canvas_OR_image_OR_pixels_OR_video);
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageData || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && format == null && type == null && pixels == null) {
+      var pixels_1 = convertDartToNative_ImageData(border_OR_canvas_OR_image_OR_pixels_OR_video);
       _texImage2D_2(target, level, internalformat, format_OR_width, height_OR_type, pixels_1);
       return;
     }
-    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && !?format && !?type && !?pixels) {
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && format == null && type == null && pixels == null) {
       _texImage2D_3(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
-    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is CanvasElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && !?format && !?type && !?pixels) {
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is CanvasElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && format == null && type == null && pixels == null) {
       _texImage2D_4(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
-    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is VideoElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && !?format && !?type && !?pixels) {
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is VideoElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && format == null && type == null && pixels == null) {
       _texImage2D_5(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
@@ -2494,24 +2515,24 @@
   @DomName('WebGLRenderingContext.texSubImage2D')
   @DocsEditable
   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 ((canvas_OR_format_OR_image_OR_pixels_OR_video is int || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && ?type && ?pixels) {
+    if (pixels != null && type != null && (canvas_OR_format_OR_image_OR_pixels_OR_video is int || canvas_OR_format_OR_image_OR_pixels_OR_video == null)) {
       _texSubImage2D_1(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
       return;
     }
-    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageData || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && !?type && !?pixels) {
-      var pixels_1 = _convertDartToNative_ImageData(canvas_OR_format_OR_image_OR_pixels_OR_video);
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageData || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && type == null && pixels == null) {
+      var pixels_1 = convertDartToNative_ImageData(canvas_OR_format_OR_image_OR_pixels_OR_video);
       _texSubImage2D_2(target, level, xoffset, yoffset, format_OR_width, height_OR_type, pixels_1);
       return;
     }
-    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && !?type && !?pixels) {
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && type == null && pixels == null) {
       _texSubImage2D_3(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
-    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is CanvasElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && !?type && !?pixels) {
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is CanvasElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && type == null && pixels == null) {
       _texSubImage2D_4(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
-    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is VideoElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && !?type && !?pixels) {
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is VideoElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && type == null && pixels == null) {
       _texSubImage2D_5(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
diff --git a/sdk/lib/web_gl/dartium/web_gl_dartium.dart b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
index 586ee44..c010831 100644
--- a/sdk/lib/web_gl/dartium/web_gl_dartium.dart
+++ b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
@@ -853,6 +853,21 @@
 
 
 @DocsEditable
+@DomName('OESTextureFloatLinear')
+// http://www.khronos.org/registry/webgl/extensions/OES_texture_float_linear/
+@Experimental
+class OesTextureFloatLinear extends NativeFieldWrapperClass1 {
+  OesTextureFloatLinear.internal();
+
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
 @DomName('OESTextureHalfFloat')
 // http://www.khronos.org/registry/webgl/extensions/OES_texture_half_float/
 @Experimental // experimental
@@ -861,7 +876,6 @@
 
   @DomName('OESTextureHalfFloat.HALF_FLOAT_OES')
   @DocsEditable
-  @Experimental // untriaged
   static const int HALF_FLOAT_OES = 0x8D61;
 
 }
@@ -873,6 +887,21 @@
 
 
 @DocsEditable
+@DomName('OESTextureHalfFloatLinear')
+// http://www.khronos.org/registry/webgl/extensions/OES_texture_half_float_linear/
+@Experimental
+class OesTextureHalfFloatLinear extends NativeFieldWrapperClass1 {
+  OesTextureHalfFloatLinear.internal();
+
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
 @DomName('OESVertexArrayObject')
 // http://www.khronos.org/registry/webgl/extensions/OES_vertex_array_object/
 @Experimental // experimental
@@ -2184,15 +2213,15 @@
   void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) native "WebGLRenderingContext_blendFuncSeparate_Callback";
 
   void bufferData(int target, data_OR_size, int usage) {
-    if ((target is int || target == null) && (data_OR_size is TypedData || data_OR_size == null) && (usage is int || usage == null)) {
+    if ((usage is int || usage == null) && (data_OR_size is TypedData || data_OR_size == null) && (target is int || target == null)) {
       _bufferData_1(target, data_OR_size, usage);
       return;
     }
-    if ((target is int || target == null) && (data_OR_size is ByteBuffer || data_OR_size == null) && (usage is int || usage == null)) {
+    if ((usage is int || usage == null) && (data_OR_size is ByteBuffer || data_OR_size == null) && (target is int || target == null)) {
       _bufferData_2(target, data_OR_size, usage);
       return;
     }
-    if ((target is int || target == null) && (data_OR_size is int || data_OR_size == null) && (usage is int || usage == null)) {
+    if ((usage is int || usage == null) && (data_OR_size is int || data_OR_size == null) && (target is int || target == null)) {
       _bufferData_3(target, data_OR_size, usage);
       return;
     }
@@ -2206,11 +2235,11 @@
   void _bufferData_3(target, data_OR_size, usage) native "WebGLRenderingContext__bufferData_3_Callback";
 
   void bufferSubData(int target, int offset, data) {
-    if ((target is int || target == null) && (offset is int || offset == null) && (data is TypedData || data == null)) {
+    if ((data is TypedData || data == null) && (offset is int || offset == null) && (target is int || target == null)) {
       _bufferSubData_1(target, offset, data);
       return;
     }
-    if ((target is int || target == null) && (offset is int || offset == null) && (data is ByteBuffer || data == null)) {
+    if ((data is ByteBuffer || data == null) && (offset is int || offset == null) && (target is int || target == null)) {
       _bufferSubData_2(target, offset, data);
       return;
     }
@@ -2570,23 +2599,23 @@
   void stencilOpSeparate(int face, int fail, int zfail, int zpass) native "WebGLRenderingContext_stencilOpSeparate_Callback";
 
   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 ((target is int || target == null) && (level is int || level == null) && (internalformat is int || internalformat == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (border_OR_canvas_OR_image_OR_pixels_OR_video is int || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (format is int || format == null) && (type is int || type == null) && (pixels is TypedData || pixels == null)) {
+    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)) {
       _texImage2D_1(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
       return;
     }
-    if ((target is int || target == null) && (level is int || level == null) && (internalformat is int || internalformat == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (border_OR_canvas_OR_image_OR_pixels_OR_video is ImageData || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && !?format && !?type && !?pixels) {
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageData || 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) && format == null && type == null && pixels == null) {
       _texImage2D_2(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
-    if ((target is int || target == null) && (level is int || level == null) && (internalformat is int || internalformat == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (border_OR_canvas_OR_image_OR_pixels_OR_video is ImageElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && !?format && !?type && !?pixels) {
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageElement || 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) && format == null && type == null && pixels == null) {
       _texImage2D_3(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
-    if ((target is int || target == null) && (level is int || level == null) && (internalformat is int || internalformat == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (border_OR_canvas_OR_image_OR_pixels_OR_video is CanvasElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && !?format && !?type && !?pixels) {
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is CanvasElement || 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) && format == null && type == null && pixels == null) {
       _texImage2D_4(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
-    if ((target is int || target == null) && (level is int || level == null) && (internalformat is int || internalformat == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (border_OR_canvas_OR_image_OR_pixels_OR_video is VideoElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && !?format && !?type && !?pixels) {
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is VideoElement || 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) && format == null && type == null && pixels == null) {
       _texImage2D_5(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
@@ -2612,23 +2641,23 @@
   void texParameteri(int target, int pname, int param) native "WebGLRenderingContext_texParameteri_Callback";
 
   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 ((target is int || target == null) && (level is int || level == null) && (xoffset is int || xoffset == null) && (yoffset is int || yoffset == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (canvas_OR_format_OR_image_OR_pixels_OR_video is int || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (type is int || type == null) && (pixels is TypedData || pixels == null)) {
+    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)) {
       _texSubImage2D_1(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
       return;
     }
-    if ((target is int || target == null) && (level is int || level == null) && (xoffset is int || xoffset == null) && (yoffset is int || yoffset == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (canvas_OR_format_OR_image_OR_pixels_OR_video is ImageData || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && !?type && !?pixels) {
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageData || 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) && type == null && pixels == null) {
       _texSubImage2D_2(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
-    if ((target is int || target == null) && (level is int || level == null) && (xoffset is int || xoffset == null) && (yoffset is int || yoffset == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (canvas_OR_format_OR_image_OR_pixels_OR_video is ImageElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && !?type && !?pixels) {
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageElement || 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) && type == null && pixels == null) {
       _texSubImage2D_3(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
-    if ((target is int || target == null) && (level is int || level == null) && (xoffset is int || xoffset == null) && (yoffset is int || yoffset == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (canvas_OR_format_OR_image_OR_pixels_OR_video is CanvasElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && !?type && !?pixels) {
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is CanvasElement || 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) && type == null && pixels == null) {
       _texSubImage2D_4(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
-    if ((target is int || target == null) && (level is int || level == null) && (xoffset is int || xoffset == null) && (yoffset is int || yoffset == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (canvas_OR_format_OR_image_OR_pixels_OR_video is VideoElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && !?type && !?pixels) {
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is VideoElement || 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) && type == null && pixels == null) {
       _texSubImage2D_5(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
diff --git a/tests/co19/co19-analyzer.status b/tests/co19/co19-analyzer.status
index ba2d15e..c24c867 100644
--- a/tests/co19/co19-analyzer.status
+++ b/tests/co19/co19-analyzer.status
@@ -33,15 +33,12 @@
 Language/07_Classes/6_Constructors/2_Factories_A06_t01: fail
 Language/07_Classes/6_Constructors/2_Factories_A06_t02: fail
 Language/07_Classes/6_Constructors/2_Factories_A06_t04: fail
-Language/07_Classes/6_Constructors/3_Constant_Constructors_A04_t01: fail
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t01: fail
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t02: fail
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t03: fail
 Language/07_Classes/7_Static_Methods_A01_t01: fail
 Language/09_Generics/09_Generics_A04_t07: fail
 Language/11_Expressions/01_Constants_A01_t01: fail
-Language/11_Expressions/01_Constants_A08_t02: fail
-Language/11_Expressions/01_Constants_A09_t02: fail
 Language/11_Expressions/01_Constants_A11_t03: fail
 Language/11_Expressions/01_Constants_A15_t07: fail
 Language/11_Expressions/01_Constants_A15_t08: fail
@@ -62,7 +59,6 @@
 Language/11_Expressions/05_Strings_A02_t48: fail
 Language/11_Expressions/06_Lists_A03_t01: fail
 Language/11_Expressions/06_Lists_A06_t01: fail
-Language/11_Expressions/07_Maps_A02_t02: fail
 Language/11_Expressions/11_Instance_Creation/1_New_A13_t02: fail
 Language/11_Expressions/11_Instance_Creation/2_Const_A06_t01: fail
 Language/11_Expressions/11_Instance_Creation/2_Const_A10_t01: fail
@@ -191,6 +187,6 @@
 Language/11_Expressions/08_Throw_A05_t02: fail, OK
 Language/11_Expressions/08_Throw_A05_t03: fail, OK
 
-
-[ $runtime == drt && $compiler == none ]
-*: Skip
+# infinite loop
+Language/14_Types/4_Interface_Types_A11_t01: skip
+Language/14_Types/4_Interface_Types_A11_t02: skip
diff --git a/tests/co19/co19-analyzer2.status b/tests/co19/co19-analyzer2.status
new file mode 100644
index 0000000..ccd5242
--- /dev/null
+++ b/tests/co19/co19-analyzer2.status
@@ -0,0 +1,188 @@
+# 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.
+
+[ $compiler == dart2analyzer ]
+Language/05_Variables/05_Variables_A05_t04: fail
+Language/06_Functions/06_Functions_A01_t31: fail
+Language/06_Functions/2_Formal_Parameters/1_Required_Formals_A02_t06: fail
+Language/06_Functions/2_Formal_Parameters/1_Required_Formals_A02_t07: fail
+Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t03: fail
+Language/06_Functions/2_Formal_Parameters_A01_t02: fail
+Language/06_Functions/2_Formal_Parameters_A01_t09: fail
+Language/06_Functions/2_Formal_Parameters_A02_t02: fail
+Language/07_Classes/07_Classes_A01_t20: fail
+Language/07_Classes/07_Classes_A09_t01: fail
+Language/07_Classes/07_Classes_A09_t02: fail
+Language/07_Classes/07_Classes_A09_t03: fail
+Language/07_Classes/07_Classes_A09_t04: fail
+Language/07_Classes/2_Getters_A04_t03: fail
+Language/07_Classes/2_Getters_A04_t04: fail
+Language/07_Classes/2_Getters_A04_t05: fail
+Language/07_Classes/2_Getters_A04_t07: fail
+Language/07_Classes/3_Setters_A03_t02: fail
+Language/07_Classes/3_Setters_A03_t04: fail
+Language/07_Classes/3_Setters_A03_t06: fail
+Language/07_Classes/3_Setters_A03_t08: fail
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A04_t15: fail
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A09_t01: fail
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A11_t09: fail
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A14_t01: fail
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A14_t04: fail
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A15_t07: fail
+Language/07_Classes/6_Constructors/2_Factories_A06_t01: fail
+Language/07_Classes/6_Constructors/2_Factories_A06_t02: fail
+Language/07_Classes/6_Constructors/2_Factories_A06_t04: fail
+Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t01: fail
+Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t02: fail
+Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t03: fail
+Language/07_Classes/7_Static_Methods_A01_t01: fail
+Language/09_Generics/09_Generics_A04_t07: fail
+Language/11_Expressions/01_Constants_A01_t01: fail
+Language/11_Expressions/01_Constants_A11_t03: fail
+Language/11_Expressions/01_Constants_A15_t07: fail
+Language/11_Expressions/01_Constants_A15_t08: fail
+Language/11_Expressions/01_Constants_A16_t01: fail
+Language/11_Expressions/01_Constants_A16_t02: fail
+Language/11_Expressions/01_Constants_A16_t03: fail
+Language/11_Expressions/01_Constants_A17_t03: fail
+Language/11_Expressions/01_Constants_A19_t04: fail
+Language/11_Expressions/03_Numbers_A01_t01: fail
+Language/11_Expressions/03_Numbers_A01_t02: fail
+Language/11_Expressions/03_Numbers_A01_t03: fail
+Language/11_Expressions/03_Numbers_A01_t04: fail
+Language/11_Expressions/03_Numbers_A01_t08: fail
+Language/11_Expressions/03_Numbers_A01_t10: fail
+Language/11_Expressions/05_Strings/1_String_Interpolation_A03_t01: fail
+Language/11_Expressions/05_Strings/1_String_Interpolation_A04_t01: fail
+Language/11_Expressions/05_Strings_A02_t46: fail
+Language/11_Expressions/05_Strings_A02_t48: fail
+Language/11_Expressions/06_Lists_A03_t01: fail
+Language/11_Expressions/06_Lists_A06_t01: fail
+Language/11_Expressions/11_Instance_Creation/1_New_A13_t02: fail
+Language/11_Expressions/11_Instance_Creation/2_Const_A06_t01: fail
+Language/11_Expressions/11_Instance_Creation/2_Const_A10_t01: fail
+Language/11_Expressions/11_Instance_Creation_A05_t02: fail
+Language/11_Expressions/14_Function_Invocation/1_Actual_Argument_List_Evaluation_A02_t01: fail
+Language/11_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t05: fail
+Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A02_t01: fail
+Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t01: fail
+Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A04_t01: fail
+Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A08_t01: fail
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t01: fail
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t07: fail
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t05: fail
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A06_t02: fail
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: fail
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t01: fail
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t02: fail
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t03: fail
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t04: fail
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A08_t02: fail
+Language/11_Expressions/22_Equality_A01_t15: fail
+Language/11_Expressions/22_Equality_A01_t16: fail
+Language/11_Expressions/28_Postfix_Expressions_A01_t06: fail
+Language/11_Expressions/33_Argument_Definition_Test_A01_t14: fail
+Language/11_Expressions/33_Argument_Definition_Test_A01_t18: fail
+Language/12_Statements/02_Expression_Statements_A01_t06: fail
+Language/12_Statements/09_Switch_A04_t01: fail
+Language/13_Libraries_and_Scripts/1_Imports_A04_t03: fail
+Language/13_Libraries_and_Scripts/1_Imports_A05_t01: fail
+Language/13_Libraries_and_Scripts/2_Exports_A05_t01: fail
+Language/13_Libraries_and_Scripts/5_URIs_A01_t24: fail
+Language/13_Libraries_and_Scripts/5_URIs_A01_t25: fail
+Language/14_Types/3_Type_Declarations/1_Typedef_A07_t01: fail
+Language/14_Types/3_Type_Declarations/1_Typedef_A07_t02: fail
+Language/14_Types/3_Type_Declarations/1_Typedef_A07_t03: fail
+Language/14_Types/3_Type_Declarations/1_Typedef_A07_t04: fail
+Language/14_Types/4_Interface_Types_A10_t03: fail
+Language/14_Types/4_Interface_Types_A10_t04: fail
+Language/14_Types/4_Interface_Types_A10_t09: fail
+Language/15_Reference/1_Lexical_Rules/1_Reserved_Words_A40_t04: fail
+Language/15_Reference/1_Lexical_Rules_A01_t10: fail
+Language/15_Reference/1_Lexical_Rules_A02_t06: fail
+LibTest/core/AssertionError/column_A01_t02: fail
+LibTest/core/AssertionError/failedAssertion_A01_t01: fail
+LibTest/core/AssertionError/line_A01_t02: fail
+LibTest/core/AssertionError/url_A01_t01: fail
+LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A03_t02: fail
+LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A04_t01: fail
+LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: fail
+LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A04_t01: fail
+LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: fail
+LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A07_t01: fail
+LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A08_t01: fail
+LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A08_t02: fail
+LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A09_t01: fail
+LibTest/core/Set/isSubsetOf_A01_t01: fail
+LibTest/core/Set/isSubsetOf_A01_t02: fail
+LibTest/core/String/String_class_A01_t01: fail
+LibTest/core/String/charCodeAt_A01_t01: fail
+LibTest/core/String/charCodeAt_A02_t01: fail
+LibTest/core/String/charCodeAt_A03_t01: fail
+LibTest/core/String/charCodes_A01_t01: fail
+LibTest/core/String/concat_A01_t01: fail
+LibTest/core/String/concat_A02_t01: fail
+LibTest/core/String/hashCode_A01_t01: fail
+LibTest/core/String/splitChars_A01_t01: fail
+LibTest/core/StringBuffer/addAll_A01_t01: fail
+LibTest/core/StringBuffer/addAll_A01_t02: fail
+LibTest/core/StringBuffer/addAll_A03_t01: fail
+LibTest/core/StringBuffer/add_A01_t01: fail
+LibTest/core/StringBuffer/add_A01_t02: fail
+LibTest/core/StringBuffer/isEmpty_A01_t01: fail
+LibTest/core/StringBuffer/toString_A01_t01: fail
+LibTest/core/double/ceil_A01_t05: fail
+LibTest/core/double/floor_A01_t05: fail
+LibTest/core/int/operator_division_A01_t01: fail
+
+# fails locally, passes on bot
+Language/13_Libraries_and_Scripts/3_Parts_A02_t03: skip
+
+# co19 issue #397, List.addLast removed
+LibTest/core/Iterable/where_A01_t07: fail, OK
+LibTest/core/List/addLast_A01_t01: fail, OK
+LibTest/core/List/addLast_A01_t03: fail, OK
+LibTest/core/List/addLast_A02_t01: fail, OK
+
+# co19 issue #400, collection library reorg
+LibTest/core/List/List.fixedLength_A01_t01: fail, OK
+LibTest/core/List/operator_subscript_A01_t02: fail, OK
+
+# co19 issue #403
+LibTest/core/List/List_A01_t02: fail, OK
+LibTest/core/List/every_A01_t01: fail, OK
+LibTest/core/List/insertRange_A01_t01: fail, OK
+LibTest/core/List/insertRange_A02_t01: fail, OK
+LibTest/core/List/insertRange_A03_t01: fail, OK
+LibTest/core/List/insertRange_A04_t01: fail, OK
+LibTest/core/List/insertRange_A05_t01: fail, OK
+LibTest/core/List/insertRange_A06_t01: fail, OK
+LibTest/core/List/insertRange_A07_t01: fail, OK
+LibTest/core/List/insertRange_A08_t01: fail, OK
+
+# co19 issue #412, using 'null' as operand
+Language/11_Expressions/01_Constants_A11_t01: fail, OK
+Language/11_Expressions/01_Constants_A12_t01: fail, OK
+Language/11_Expressions/01_Constants_A13_t06: fail, OK
+
+# co19 issue #414, extra @compile-error
+Language/03_Overview/1_Scoping_A02_t28: fail, OK
+
+# co19 issue #416, function name is declared the parameter scope
+Language/03_Overview/1_Scoping_A02_t07: fail, OK
+Language/12_Statements/04_Local_Function_Declaration_A01_t01: fail, OK
+
+# co19 issue #417, 'if', 'while' and 'do-while' don't create scope
+Language/03_Overview/1_Scoping_A02_t11: fail, OK
+Language/03_Overview/1_Scoping_A02_t12: fail, OK
+Language/03_Overview/1_Scoping_A02_t16: fail, OK
+
+# co19 issue #420, 'throw' without exception; deprecated; rethrow should be used
+Language/11_Expressions/08_Throw_A05_t01: fail, OK
+Language/11_Expressions/08_Throw_A05_t02: fail, OK
+Language/11_Expressions/08_Throw_A05_t03: fail, OK
+
+# infinite loop
+Language/14_Types/4_Interface_Types_A11_t01: skip
+Language/14_Types/4_Interface_Types_A11_t02: skip
diff --git a/tests/co19/co19-compiler.status b/tests/co19/co19-compiler.status
index 6884411..8ddc5de 100644
--- a/tests/co19/co19-compiler.status
+++ b/tests/co19/co19-compiler.status
@@ -65,7 +65,6 @@
 Language/11_Expressions/01_Constants_A16_t03: Fail # Issue 1473
 Language/11_Expressions/01_Constants_A17_t03: Fail # Issue 1473
 
-Language/05_Variables/1_Evaluation_of_Implicit_Variable_Getters_A01_t05: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
 Language/07_Classes/07_Classes_A01_t20: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
 Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t01: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
 Language/11_Expressions/15_Method_Invocation/2_Cascaded_Invocation_A01_t19: Fail, OK # TODO(ahe): This test is failing after correctly implementing static warning checks in co19 test suite. The co19 authors have informed me that some of these failures are due to bugs in the test suite.
diff --git a/tests/co19/co19-dart2dart.status b/tests/co19/co19-dart2dart.status
index 69035a4..b7f598d 100644
--- a/tests/co19/co19-dart2dart.status
+++ b/tests/co19/co19-dart2dart.status
@@ -421,6 +421,9 @@
 LibTest/math/atan_A01_t01: Fail, OK # co19 issue 44
 
 [ $compiler == dart2dart ]
+Language/14_Types/4_Interface_Types_A11_t01: Pass, Crash # Issue 8857
+Language/14_Types/4_Interface_Types_A11_t02: Pass, Crash # Issue 8857
+
 LibTest/core/Date/operator_equality_A01_t01: Fail # DateTime.== now looks at timezone, co19 issue 379
 
 Language/14_Types/6_Type_dynamic_A03_t01: Fail # Renamed Date to DateTime (issue 373, 374)
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 48de78a..b2f3f82 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -25,7 +25,6 @@
 Language/05_Variables/05_Variables_A07_t07: Fail # TODO(ahe): Please triage this failure.
 Language/05_Variables/05_Variables_A07_t08: Fail # TODO(ahe): Please triage this failure.
 Language/05_Variables/05_Variables_A08_t01: Fail # TODO(ahe): Please triage this failure.
-Language/05_Variables/1_Evaluation_of_Implicit_Variable_Getters_A01_t05: Fail # TODO(ahe): Please triage this failure.
 Language/07_Classes/07_Classes_A03_t07: Fail # TODO(ahe): Please triage this failure.
 Language/07_Classes/1_Instance_Methods_A06_t01: Fail # TODO(ahe): Please triage this failure.
 Language/07_Classes/1_Instance_Methods_A06_t02: Fail # TODO(ahe): Please triage this failure.
@@ -159,6 +158,9 @@
 
 
 [ $compiler == dart2js ]
+Language/14_Types/4_Interface_Types_A11_t01: Pass, Crash # Issue 8857
+Language/14_Types/4_Interface_Types_A11_t02: Pass, Crash # Issue 8857
+
 LibTest/isolate/ReceivePort/receive_A01_t02: Fail # Issue 6750
 
 LibTest/core/StringBuffer/isEmpty_A01_t01:  Fail, OK # co19 issue 355
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 544150d..51a0e35 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -511,24 +511,40 @@
 LibTest/core/List/setRange_A05_t01: Fail # setRange now takes end-argument. Issue 402
 
 [ $compiler == none && $runtime == vm && $arch == arm ]
-*: Skip
-
-[ $compiler == none && $runtime == vm && $arch == simarm]
 LibTest/math/tan_A01_t01: Fail
-LibTest/math/Random/nextDouble_A01_t01.dart: Pass, Fail
+LibTest/math/Random/nextDouble_A01_t01: Pass, Crash
 LibTest/core/int/operator_left_shift_A01_t02: Fail
-LibTest/core/int/operator_unary_minus_A01_t01: Fail
+LibTest/core/int/operator_unary_minus_A01_t01: Fail, Pass
+LibTest/math/cos_A01_t01: Pass, Fail
 
-[ $compiler == none && $runtime == vm && $arch == simarm && $mode == debug]
+[ $compiler == none && $runtime == vm && $arch == arm && $mode == debug ]
 LibTest/core/Expect/throws_A01_t04: Crash
 LibTest/core/List/sort_A01_t04: Crash
 LibTest/core/List/sort_A01_t05: Crash
 LibTest/core/List/sort_A01_t06: Crash
-LibTest/core/double/ceil_A01_t02: Fail
-LibTest/core/double/floor_A01_t02: Fail
-LibTest/core/double/truncate_A01_t01: Fail
+LibTest/core/double/ceil_A01_t02: Fail, Pass
+LibTest/core/double/floor_A01_t02: Fail, Pass
+LibTest/core/double/truncate_A01_t01: Fail, Pass
 LibTest/core/int/operator_left_shift_A01_t02: Fail
-LibTest/core/int/operator_unary_minus_A01_t01: Fail
+LibTest/core/int/operator_unary_minus_A01_t01: Fail, Pass
+
+[ $compiler == none && $runtime == vm && $arch == simarm ]
+LibTest/math/tan_A01_t01: Fail
+LibTest/math/Random/nextDouble_A01_t01: Pass, Crash
+LibTest/core/int/operator_left_shift_A01_t02: Fail
+LibTest/core/int/operator_unary_minus_A01_t01: Fail, Pass
+LibTest/math/cos_A01_t01: Pass, Fail
+
+[ $compiler == none && $runtime == vm && $arch == simarm && $mode == debug ]
+LibTest/core/Expect/throws_A01_t04: Crash
+LibTest/core/List/sort_A01_t04: Crash
+LibTest/core/List/sort_A01_t05: Crash
+LibTest/core/List/sort_A01_t06: Crash
+LibTest/core/double/ceil_A01_t02: Fail, Pass
+LibTest/core/double/floor_A01_t02: Fail, Pass
+LibTest/core/double/truncate_A01_t01: Fail, Pass
+LibTest/core/int/operator_left_shift_A01_t02: Fail
+LibTest/core/int/operator_unary_minus_A01_t01: Fail, Pass
 
 [ $compiler == none && $runtime == vm && $arch == mips ]
 *: Skip
diff --git a/tests/co19/test_config.dart b/tests/co19/test_config.dart
index 0392975..2a5f127 100644
--- a/tests/co19/test_config.dart
+++ b/tests/co19/test_config.dart
@@ -15,6 +15,7 @@
               "co19",
               new Path("tests/co19/src"),
               ["tests/co19/co19-analyzer.status",
+               "tests/co19/co19-analyzer2.status",
                "tests/co19/co19-compiler.status",
                "tests/co19/co19-runtime.status",
                "tests/co19/co19-dart2dart.status",
diff --git a/tests/compiler/dart2js/compiler_helper.dart b/tests/compiler/dart2js/compiler_helper.dart
index 8c72e42..880a85e 100644
--- a/tests/compiler/dart2js/compiler_helper.dart
+++ b/tests/compiler/dart2js/compiler_helper.dart
@@ -53,6 +53,9 @@
   MockCompiler compiler =
       new MockCompiler(enableTypeAssertions: enableTypeAssertions,
                        coreSource: coreSource,
+                       // Type inference does not run when manually
+                       // compiling a method.
+                       disableTypeInference: true,
                        interceptorsSource: interceptorsSource,
                        enableMinification: minify);
   compiler.parseScript(code);
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index a9fa9de..14fa226 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -194,6 +194,7 @@
                 bool enableMinification: false,
                 bool enableConcreteTypeInference: false,
                 int maxConcreteTypeSize: 5,
+                bool disableTypeInference: false,
                 bool analyzeAll: false,
                 bool analyzeOnly: false,
                 bool preserveComments: false})
@@ -203,6 +204,7 @@
               enableMinification: enableMinification,
               enableConcreteTypeInference: enableConcreteTypeInference,
               maxConcreteTypeSize: maxConcreteTypeSize,
+              disableTypeInference: disableTypeInference,
               analyzeAll: analyzeAll,
               analyzeOnly: analyzeOnly,
               preserveComments: preserveComments) {
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index a9d9828..037000c 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -33,7 +33,6 @@
 to_string_test: Fail # Issue 7179.
 runtime_type_test: Fail, OK # Tests extected output of Type.toString().
 
-mirror_test: Fail  # http://dartbug.com/6490
 mirrors_test: Fail # http://dartbug.com/6490
 
 [ $jscl ]
diff --git a/tests/compiler/dart2js_extra/hash_code_test.dart b/tests/compiler/dart2js_extra/hash_code_test.dart
index 6e25fed..0c5c4b3 100644
--- a/tests/compiler/dart2js_extra/hash_code_test.dart
+++ b/tests/compiler/dart2js_extra/hash_code_test.dart
@@ -17,25 +17,28 @@
 // local x.hashCode calls might be optimized.
 var hash = new Hasher().hash;
 
-check(value1, value2) {
+check(value1, value2, {identityHashCode}) {
   var h1 = hash(value1);
   var h2 = hash(value2);
-
   Expect.isTrue(h1 is int);
   Expect.isTrue(h2 is int);
-  Expect.isFalse(h1 == h2);
-
-  // We expect that the hash function is reasonable quality - there are some
-  // difference in the low bits.
-  Expect.isFalse((h1 & 0xf) == (h2 & 0xf));
 
   // Quality check - the values should be SMIs for efficient arithmetic.
-  Expect.equals((h1 & 0x1fffffff), h1);
-  Expect.equals((h2 & 0x1fffffff), h2);
+  Expect.equals((h1 & 0x3fffffff), h1);
+  Expect.equals((h2 & 0x3fffffff), h2);
+
+  // If we're checking the (randomized) identity hash code function,
+  // we cannot guarantee anything about the actual hash code values.
+  if (identityHashCode) return;
+
+  // We expect that the hash function is reasonable quality - there
+  // are some difference in the low bits.
+  Expect.isFalse(h1 == h2);
+  Expect.isFalse((h1 & 0xf) == (h2 & 0xf));
 }
 
 bools() {
-  check(true, false);
+  check(true, false, identityHashCode: false);
 
   Expect.equals(true.hashCode, hash(true));   // First can be optimized.
   Expect.equals(false.hashCode, hash(false));
@@ -44,7 +47,7 @@
 ints() {
   var i1 = 100;
   var i2 = 101;
-  check(i1, i2);
+  check(i1, i2, identityHashCode: false);
   Expect.equals(i1.hashCode, hash(i1));
   Expect.equals(i2.hashCode, hash(i2));
 }
@@ -52,7 +55,7 @@
 lists() {
   var list1 = [];
   var list2 = [];
-  check(list1, list2);
+  check(list1, list2, identityHashCode: true);
 
   Expect.equals(list1.hashCode, hash(list1));
   Expect.equals(list2.hashCode, hash(list2));
@@ -62,9 +65,9 @@
   var str1 = 'a';
   var str2 = 'b';
   var str3 = 'c';
-  check(str1, str2);
-  check(str1, str3);
-  check(str2, str3);
+  check(str1, str2, identityHashCode: false);
+  check(str1, str3, identityHashCode: false);
+  check(str2, str3, identityHashCode: false);
 
   Expect.equals(str1.hashCode, hash(str1));
   Expect.equals(str2.hashCode, hash(str2));
diff --git a/tests/compiler/dart2js_extra/minified_mirrors_test.dart b/tests/compiler/dart2js_extra/minified_mirrors_test.dart
new file mode 100644
index 0000000..71533b4
--- /dev/null
+++ b/tests/compiler/dart2js_extra/minified_mirrors_test.dart
@@ -0,0 +1,12 @@
+// 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.
+
+// This test should be removed when dart2js can pass all mirror tests.
+// TODO(ahe): Remove this test.
+
+import '../../lib/mirrors/mirrors_test.dart';
+
+main() {
+  mainWithArgument(isDart2js: true, isMinified: true);
+}
diff --git a/tests/compiler/dart2js_native/super_property_test.dart b/tests/compiler/dart2js_native/super_property_test.dart
new file mode 100644
index 0000000..003a4de
--- /dev/null
+++ b/tests/compiler/dart2js_native/super_property_test.dart
@@ -0,0 +1,65 @@
+// 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.
+
+import "package:expect/expect.dart";
+
+// Tests super setter where the HInvokeSuper is using interceptor aka
+// explicit-receiver calling convention.
+
+class A native "A" {
+  var foo;
+  get_foo() => foo;
+  set bar(value) => foo = value;
+}
+
+class B extends A native "B" {
+  set foo(value) {
+    super.foo = value;
+  }
+  get foo => super.foo;
+}
+
+class C {
+  var foo;
+  get_foo() => foo;
+  set bar(value) => foo = value;
+}
+
+class D extends C {
+  set foo(value) {
+    super.foo = value;
+  }
+  get foo => super.foo;
+}
+
+makeA() native;
+makeB() native;
+
+void setup() native """
+// This code is all inside 'setup' and so not accesible from the global scope.
+function A(){}
+function B(){}
+makeA = function(){return new A};
+makeB = function(){return new B};
+""";
+
+testThing(a) {
+  a.foo = 123;
+  Expect.equals(123,  a.foo);
+  Expect.equals(123,  a.get_foo());
+
+  a.bar = 234;
+  Expect.equals(234,  a.foo);
+  Expect.equals(234,  a.get_foo());
+}
+
+main() {
+  setup();
+  var things = [makeA(), makeB(), new C(), new D()];
+  var test = testThing;
+  test(things[0]);
+  test(things[1]);
+  test(things[2]);
+  test(things[3]);
+}
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 3008f2e..b728712 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -13,7 +13,6 @@
 symbol_test/02: Fail
 symbol_test/03: Fail
 
-
 [ $runtime == ff || $runtime == ie9 || $runtime == jsshell ]
 unicode_test: Fail
 
diff --git a/tests/corelib/uri_path_test.dart b/tests/corelib/uri_path_test.dart
index bc62d3e..e997ce3 100644
--- a/tests/corelib/uri_path_test.dart
+++ b/tests/corelib/uri_path_test.dart
@@ -70,14 +70,53 @@
   }
   encoded = encoded.toString();
   unencoded = unencoded.toString();
-  print(encoded);
-  print(unencoded);
   test(encoded, [unencoded]);
   test(encoded + "/" + encoded, [unencoded, unencoded]);
 }
 
+testPathSegmentsUnmodifiableList() {
+
+  test(list) {
+    bool isUnsupported(e) => e is UnsupportedError;
+
+    Expect.equals("a", list[0]);
+    Expect.throws(() => list[0] = "c", isUnsupported);
+    Expect.equals(2, list.length);
+    Expect.throws(() => list.length = 1, isUnsupported);
+    Expect.throws(() => list.add("c"), isUnsupported);
+    Expect.throws(() => list.addAll(["c", "d"]), isUnsupported);
+    Expect.listEquals(["b", "a"], list.reversed.toList());
+    Expect.throws(() => list.sort(), isUnsupported);
+    Expect.equals(0, list.indexOf("a"));
+    Expect.equals(0, list.lastIndexOf("a"));
+    Expect.throws(() => list.clear(), isUnsupported);
+    Expect.throws(() => list.insert(1, "c"), isUnsupported);
+    Expect.throws(() => list.insertAll(1, ["c", "d"]), isUnsupported);
+    Expect.throws(() => list.setAll(1, ["c", "d"]), isUnsupported);
+    Expect.throws(() => list.remove("a"), isUnsupported);
+    Expect.throws(() => list.removeAt(0), isUnsupported);
+    Expect.throws(() => list.removeLast(), isUnsupported);
+    Expect.throws(() => list.removeWhere((e) => true), isUnsupported);
+    Expect.throws(() => list.retainWhere((e) => false), isUnsupported);
+    Expect.listEquals(["a"], list.sublist(0, 1));
+    Expect.listEquals(["a"], list.getRange(0, 1).toList());
+    Expect.throws(() => list.setRange(0, 1, ["c"]), isUnsupported);
+    Expect.throws(() => list.removeRange(0, 1), isUnsupported);
+    Expect.throws(() => list.fillRange(0, 1, "c"), isUnsupported);
+    Expect.throws(() => list.replaceRange(0, 1, ["c"]), isUnsupported);
+    Map map = new Map();
+    map[0] = "a";
+    map[1] = "b";
+    Expect.mapEquals(list.asMap(), map);
+  }
+
+  test(Uri.parse("a/b").pathSegments);
+  test(new Uri(pathSegments: ["a", "b"]).pathSegments);
+}
+
 main() {
   testInvalidArguments();
   testPath();
   testPathSegments();
+  testPathSegmentsUnmodifiableList();
 }
diff --git a/tests/corelib/uri_query_test.dart b/tests/corelib/uri_query_test.dart
index acbe9d8..03c9aba 100644
--- a/tests/corelib/uri_query_test.dart
+++ b/tests/corelib/uri_query_test.dart
@@ -19,13 +19,14 @@
 }
 
 void testQueryParameters() {
-  test(String query, Map<String, String> parameters) {
+  test(String query, Map<String, String> parameters, [String normalizedQuery]) {
+    if (normalizedQuery == null) normalizedQuery = query;
     check(uri) {
-      Expect.equals(query, uri.query);
+      Expect.equals(normalizedQuery, uri.query);
       if (query.isEmpty) {
-        Expect.equals(query, uri.toString());
+        Expect.equals(normalizedQuery, uri.toString());
       } else {
-        Expect.equals("?$query", uri.toString());
+        Expect.equals("?$normalizedQuery", uri.toString());
       }
       if (parameters.containsValue(null)) {
       } else {
@@ -45,18 +46,28 @@
 
   test("", {});
   test("A", {"A": null});
+  test("%25", {"%": null});
+  test("%41", {"A": null}, "A");
+  test("%41A", {"AA": null}, "AA");
   test("A", {"A": ""});
+  test("%25", {"%": ""});
+  test("%41", {"A": ""}, "A");
+  test("%41A", {"AA": ""}, "AA");
   test("A=a", {"A": "a"});
+  test("%25=a", {"%": "a"});
+  test("%41=%61", {"A": "a"}, "A=a");
   test("A=+", {"A": " "});
   test("A=%2B", {"A": "+"});
   test("A=a&B", {"A": "a", "B": null});
   test("A=a&B", {"A": "a", "B": ""});
   test("A=a&B=b", {"A": "a", "B": "b"});
+  test("%41=%61&%42=%62", {"A": "a", "B": "b"}, "A=a&B=b");
 
   var unreserved = "-._~0123456789"
                    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                    "abcdefghijklmnopqrstuvwxyz";
   var encoded = new StringBuffer();
+  var allEncoded = new StringBuffer();
   var unencoded = new StringBuffer();
   for (int i = 32; i < 128; i++) {
     if (i == 32) {
@@ -67,18 +78,29 @@
       encoded.write("%");
       encoded.write(i.toRadixString(16).toUpperCase());
     }
+    if (i == 32) {
+      allEncoded.write("+");
+    } else {
+      allEncoded.write("%");
+      allEncoded.write(i.toRadixString(16).toUpperCase());
+    }
     unencoded.writeCharCode(i);
   }
   encoded = encoded.toString();
   unencoded = unencoded.toString();
-  print(encoded);
-  print(unencoded);
   test("a=$encoded", {"a": unencoded});
   test("a=$encoded&b=$encoded", {"a": unencoded, "b": unencoded});
 
   var map = new Map();
   map[unencoded] = unencoded;
   test("$encoded=$encoded", map);
+  test("$encoded=$allEncoded", map, "$encoded=$encoded");
+  test("$allEncoded=$encoded", map, "$encoded=$encoded");
+  test("$allEncoded=$allEncoded", map, "$encoded=$encoded");
+  map[unencoded] = null;
+  test("$encoded", map);
+  map[unencoded] = "";
+  test("$encoded", map);
 }
 
 testInvalidQueryParameters() {
@@ -113,9 +135,35 @@
   test("&=xxx&=xxx&", {});
 }
 
+testQueryParametersImmutableMap() {
+  test(map) {
+    bool isUnsupported(e) => e is UnsupportedError;
+
+    Expect.isTrue(map.containsValue("b"));
+    Expect.isTrue(map.containsKey("a"));
+    Expect.equals("b", map["a"]);
+    Expect.throws(() => map["a"] = "c", isUnsupported);
+    Expect.throws(() => map.putIfAbsent("b", () => "e"), isUnsupported);
+    Expect.throws(() => map.remove("a"), isUnsupported);
+    Expect.throws(() => map.clear(), isUnsupported);
+    var count = 0;
+    map.forEach((key, value) => count++);
+    Expect.equals(2, count);
+    Expect.equals(2, map.keys.length);
+    Expect.equals(2, map.values.length);
+    Expect.equals(2, map.length);
+    Expect.isFalse(map.isEmpty);
+    Expect.isTrue(map.isNotEmpty);
+  }
+
+  test(Uri.parse("?a=b&c=d").queryParameters);
+  test(new Uri(queryParameters: {"a": "b", "c": "d"}).queryParameters);
+}
+
 main() {
   testInvalidArguments();
   testEncodeQueryComponent();
   testQueryParameters();
   testInvalidQueryParameters();
+  testQueryParametersImmutableMap();
 }
diff --git a/tests/html/html.status b/tests/html/html.status
index 5e34364..581755c 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -362,9 +362,8 @@
 [ $compiler == dart2js && ($runtime == drt || $runtime == chrome || $runtime == ff || $runtime == safari) ]
 isolates_test: Skip   # Timeout because leg does not support web workers.
 
-
-[ $compiler == dart2js && $runtime == drt && $unchecked ]
-#indexeddb_5_test/functional: Fail, Pass # http://dartbug.com/8851
+[ $compiler == dart2js && $runtime == drt ]
+speechrecognition_test/types: Fail # Issue 11035
 
 [ $compiler == dart2js && $csp && ($runtime == drt || $runtime == safari || $runtime == ff || $runtime == chrome || $runtime == chromeOnAndroid) ]
 js_interop_1_test: Skip            # Test cannot run under CSP restrictions (times out).
diff --git a/tests/isolate/global_error_handler2_test.dart b/tests/isolate/global_error_handler2_test.dart
index 72f0d6d..c0b1241 100644
--- a/tests/isolate/global_error_handler2_test.dart
+++ b/tests/isolate/global_error_handler2_test.dart
@@ -15,7 +15,7 @@
     if (isFirst) {
       mainIsolate = msg;
       isFirst = false;
-      throw new RuntimeError("ignore exception");
+      throw new UnsupportedError("ignore exception");
     }
     Expect.equals("message 2", msg);
     mainIsolate.send("received");
@@ -23,7 +23,7 @@
 }
 
 bool globalErrorHandler(IsolateUnhandledException e) {
-  return e.source is RuntimeError && e.source.message == "ignore exception";
+  return e.source is UnsupportedError && e.source.message == "ignore exception";
 }
 
 main() {
diff --git a/tests/isolate/global_error_handler_stream2_test.dart b/tests/isolate/global_error_handler_stream2_test.dart
index f349589..b1093f5 100644
--- a/tests/isolate/global_error_handler_stream2_test.dart
+++ b/tests/isolate/global_error_handler_stream2_test.dart
@@ -12,7 +12,7 @@
   IsolateSink mainIsolate;
   stream.listen((msg) {
     mainIsolate = msg;
-    throw new RuntimeError("ignore exception");
+    throw new UnsupportedError("ignore exception");
   }, onDone: () {
     mainIsolate.add("received done");
     mainIsolate.close();
@@ -21,7 +21,7 @@
 
 bool globalErrorHandler(IsolateUnhandledException e) {
   var source = e.source;
-  return source is RuntimeError && source.message == "ignore exception";
+  return source is UnsupportedError && source.message == "ignore exception";
 }
 
 main() {
diff --git a/tests/isolate/global_error_handler_stream_test.dart b/tests/isolate/global_error_handler_stream_test.dart
index 4fcd8bf..c792fc5 100644
--- a/tests/isolate/global_error_handler_stream_test.dart
+++ b/tests/isolate/global_error_handler_stream_test.dart
@@ -20,7 +20,7 @@
 }
 
 void startTest(EventSink finishSink) {
-  firstFunction = () { throw new RuntimeError("ignore exception"); };
+  firstFunction = () { throw new UnsupportedError("ignore exception"); };
   finishFunction = () { finishSink.add("done"); finishSink.close(); };
   new Timer(Duration.ZERO, runFunctions);
 }
@@ -30,7 +30,7 @@
 }
 
 bool globalErrorHandler(IsolateUnhandledException e) {
-  return e.source is RuntimeError && e.source.message == "ignore exception";
+  return e.source is UnsupportedError && e.source.message == "ignore exception";
 }
 
 main() {
diff --git a/tests/isolate/global_error_handler_test.dart b/tests/isolate/global_error_handler_test.dart
index a4acbac..e3b5de0 100644
--- a/tests/isolate/global_error_handler_test.dart
+++ b/tests/isolate/global_error_handler_test.dart
@@ -20,7 +20,7 @@
 }
 
 void startTest(SendPort finishPort, replyPort) {
-  firstFunction = () { throw new RuntimeError("ignore exception"); };
+  firstFunction = () { throw new UnsupportedError("ignore exception"); };
   finishFunction = () { finishPort.send("done"); };
   new Timer(Duration.ZERO, runFunctions);
 }
@@ -30,7 +30,7 @@
 }
 
 bool globalErrorHandler(IsolateUnhandledException e) {
-  return e.source is RuntimeError && e.source.message == "ignore exception";
+  return e.source is UnsupportedError && e.source.message == "ignore exception";
 }
 
 main() {
diff --git a/tests/language/closure_internals_test.dart b/tests/language/closure_internals_test.dart
new file mode 100644
index 0000000..587be33
--- /dev/null
+++ b/tests/language/closure_internals_test.dart
@@ -0,0 +1,16 @@
+// 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.
+
+import "package:expect/expect.dart";
+
+class C {
+  foo() => 123;
+}
+
+main() {
+  var f = new C().foo;
+  Expect.throws(() => f.target, (e) => e is NoSuchMethodError);
+  Expect.throws(() => f.self, (e) => e is NoSuchMethodError);
+  Expect.throws(() => f.receiver, (e) => e is NoSuchMethodError);
+}
diff --git a/tests/language/language.status b/tests/language/language.status
index 1b35b74..60460aa 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -83,7 +83,6 @@
 
 type_variable_field_initializer_closure_test: Crash # issue 8847
 
-super_getter_setter_test: Fail # Issue 8917
 
 execute_finally10_test: Fail # Issue 430
 execute_finally11_test: Fail # Issue 430
@@ -508,7 +507,6 @@
 
 type_variable_field_initializer_closure_test: Crash # VM bug: issue 8847
 
-super_getter_setter_test: Fail # VM bug: issue 8917
 
 execute_finally10_test: Fail # VM bug: issue 430
 execute_finally11_test: Fail # VM bug: issue 430
@@ -517,6 +515,8 @@
 
 [ $compiler == dart2dart && $minified ]
 
+super_getter_setter_test: Fail # Issue 11065.
+
 # TODO(tball): Assign proper bug numbers.
 class_literal_test/none: Fail
 
@@ -570,7 +570,6 @@
 compile_time_constant_d_test: fail
 compile_time_constant_e_test: fail
 compile_time_constant_test/02: fail
-const_optional_args_negative_test: fail
 const_syntax_test/06: fail
 constructor2_negative_test: fail
 constructor3_negative_test: fail
@@ -798,25 +797,23 @@
 type_variable_scope_test/04: fail
 type_variable_scope_test/05: fail
 
-
-[ $arch == arm ]
-*: Skip
-
-[ $arch == simarm ]
-arithmetic_test: Crash
-bit_operations_test: Crash
+[ $arch == simarm || $arch == arm ]
+arithmetic_test: Fail, Crash
+bit_operations_test: Crash, Fail
 char_escape_test: Pass, Crash
 deopt_smi_op_test: Fail
 div_with_power_of_two_test: Fail
-double_modulo_test: Crash
+double_modulo_test: Fail
 gc_test: Crash
 invocation_mirror_test: Fail
 large_implicit_getter_test: Crash
 load_to_load_forwarding_test: Fail
-math_vm_test: Crash
+math_vm_test: Fail
 named_parameters_with_conversions_test: Pass, Crash
 stack_overflow_stacktrace_test: Crash
 stack_overflow_test: Crash
+positive_bit_operations_test: Pass, Fail, Crash
+left_shift_test: Pass, Fail
 
 [ $arch == mips ]
 *: Skip
diff --git a/tests/language/lazy_static3_test.dart b/tests/language/lazy_static3_test.dart
index 76186f6..ee412e1 100644
--- a/tests/language/lazy_static3_test.dart
+++ b/tests/language/lazy_static3_test.dart
@@ -45,7 +45,7 @@
   Expect.throws(() => fib(x2), (e) => e == "interrupt initialization");
   Expect.equals(499, x2);
 
-  Expect.throws(() => fib(x3), (e) => e is RuntimeError);
+  Expect.throws(() => fib(x3), (e) => e is CyclicInitializationError);
   Expect.equals(null, x3);
 
   Expect.equals(499, x4);
@@ -54,5 +54,5 @@
 
   Expect.equals(499, x6);
 
-  Expect.throws(() => fib(x7), (e) => e is RuntimeError);
+  Expect.throws(() => fib(x7), (e) => e is CyclicInitializationError);
 }
diff --git a/tests/language/regress_11010_test.dart b/tests/language/regress_11010_test.dart
new file mode 100644
index 0000000..5028dcf
--- /dev/null
+++ b/tests/language/regress_11010_test.dart
@@ -0,0 +1,16 @@
+// 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.
+
+// We used to have an issue in dart2js where calling a top-level or
+// static field wouldn't register the 'call' selector correctly.
+var caller = new Caller();
+class Caller {
+  call(a, b) => a + b;
+}
+
+main() {
+  if (caller(42, 87) != 42 + 87) {
+    throw 'unexpected result';
+  }
+}
diff --git a/tests/language/smaller_4_Interface_Types_A11_t01_test.dart b/tests/language/smaller_4_Interface_Types_A11_t01_test.dart
new file mode 100644
index 0000000..a141584
--- /dev/null
+++ b/tests/language/smaller_4_Interface_Types_A11_t01_test.dart
@@ -0,0 +1,144 @@
+/*
+ * 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.
+ */
+
+// This is a small version of the co19 test
+// Language/14_Types/4_Interface_Types_A11_t01.
+
+import 'package:expect/expect.dart';
+
+class C {}
+
+main() {
+  Expect.isTrue(new C126() is C);
+  Expect.isTrue(new C126() is Object);
+}
+
+class C1 extends C {}
+class C2 extends C1 {}
+class C3 extends C2 {}
+class C4 extends C3 {}
+class C5 extends C4 {}
+class C6 extends C5 {}
+class C7 extends C6 {}
+class C8 extends C7 {}
+class C9 extends C8 {}
+class C10 extends C9 {}
+class C11 extends C10 {}
+class C12 extends C11 {}
+class C13 extends C12 {}
+class C14 extends C13 {}
+class C15 extends C14 {}
+class C16 extends C15 {}
+class C17 extends C16 {}
+class C18 extends C17 {}
+class C19 extends C18 {}
+class C20 extends C19 {}
+class C21 extends C20 {}
+class C22 extends C21 {}
+class C23 extends C22 {}
+class C24 extends C23 {}
+class C25 extends C24 {}
+class C26 extends C25 {}
+class C27 extends C26 {}
+class C28 extends C27 {}
+class C29 extends C28 {}
+class C30 extends C29 {}
+class C31 extends C30 {}
+class C32 extends C31 {}
+class C33 extends C32 {}
+class C34 extends C33 {}
+class C35 extends C34 {}
+class C36 extends C35 {}
+class C37 extends C36 {}
+class C38 extends C37 {}
+class C39 extends C38 {}
+class C40 extends C39 {}
+class C41 extends C40 {}
+class C42 extends C41 {}
+class C43 extends C42 {}
+class C44 extends C43 {}
+class C45 extends C44 {}
+class C46 extends C45 {}
+class C47 extends C46 {}
+class C48 extends C47 {}
+class C49 extends C48 {}
+class C50 extends C49 {}
+class C51 extends C50 {}
+class C52 extends C51 {}
+class C53 extends C52 {}
+class C54 extends C53 {}
+class C55 extends C54 {}
+class C56 extends C55 {}
+class C57 extends C56 {}
+class C58 extends C57 {}
+class C59 extends C58 {}
+class C60 extends C59 {}
+class C61 extends C60 {}
+class C62 extends C61 {}
+class C63 extends C62 {}
+class C64 extends C63 {}
+class C65 extends C64 {}
+class C66 extends C65 {}
+class C67 extends C66 {}
+class C68 extends C67 {}
+class C69 extends C68 {}
+class C70 extends C69 {}
+class C71 extends C70 {}
+class C72 extends C71 {}
+class C73 extends C72 {}
+class C74 extends C73 {}
+class C75 extends C74 {}
+class C76 extends C75 {}
+class C77 extends C76 {}
+class C78 extends C77 {}
+class C79 extends C78 {}
+class C80 extends C79 {}
+class C81 extends C80 {}
+class C82 extends C81 {}
+class C83 extends C82 {}
+class C84 extends C83 {}
+class C85 extends C84 {}
+class C86 extends C85 {}
+class C87 extends C86 {}
+class C88 extends C87 {}
+class C89 extends C88 {}
+class C90 extends C89 {}
+class C91 extends C90 {}
+class C92 extends C91 {}
+class C93 extends C92 {}
+class C94 extends C93 {}
+class C95 extends C94 {}
+class C96 extends C95 {}
+class C97 extends C96 {}
+class C98 extends C97 {}
+class C99 extends C98 {}
+class C100 extends C99 {}
+class C101 extends C100 {}
+class C102 extends C101 {}
+class C103 extends C102 {}
+class C104 extends C103 {}
+class C105 extends C104 {}
+class C106 extends C105 {}
+class C107 extends C106 {}
+class C108 extends C107 {}
+class C109 extends C108 {}
+class C110 extends C109 {}
+class C111 extends C110 {}
+class C112 extends C111 {}
+class C113 extends C112 {}
+class C114 extends C113 {}
+class C115 extends C114 {}
+class C116 extends C115 {}
+class C117 extends C116 {}
+class C118 extends C117 {}
+class C119 extends C118 {}
+class C120 extends C119 {}
+class C121 extends C120 {}
+class C122 extends C121 {}
+class C123 extends C122 {}
+class C124 extends C123 {}
+class C125 extends C124 {}
+class C126 extends C125 {}
diff --git a/tests/language/smaller_4_Interface_Types_A11_t02_test.dart b/tests/language/smaller_4_Interface_Types_A11_t02_test.dart
new file mode 100644
index 0000000..37e95c0
--- /dev/null
+++ b/tests/language/smaller_4_Interface_Types_A11_t02_test.dart
@@ -0,0 +1,144 @@
+/*
+ * 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.
+ */
+
+// This is a small version of the co19 test
+// Language/14_Types/4_Interface_Types_A11_t02.
+
+import 'package:expect/expect.dart';
+
+class C {}
+class G<T, S, U>{}
+
+main() {
+  Expect.isTrue(new G<C126, C126, C126>() is G<C, C, C>);
+}
+
+class C1 extends C {}
+class C2 extends C1 {}
+class C3 extends C2 {}
+class C4 extends C3 {}
+class C5 extends C4 {}
+class C6 extends C5 {}
+class C7 extends C6 {}
+class C8 extends C7 {}
+class C9 extends C8 {}
+class C10 extends C9 {}
+class C11 extends C10 {}
+class C12 extends C11 {}
+class C13 extends C12 {}
+class C14 extends C13 {}
+class C15 extends C14 {}
+class C16 extends C15 {}
+class C17 extends C16 {}
+class C18 extends C17 {}
+class C19 extends C18 {}
+class C20 extends C19 {}
+class C21 extends C20 {}
+class C22 extends C21 {}
+class C23 extends C22 {}
+class C24 extends C23 {}
+class C25 extends C24 {}
+class C26 extends C25 {}
+class C27 extends C26 {}
+class C28 extends C27 {}
+class C29 extends C28 {}
+class C30 extends C29 {}
+class C31 extends C30 {}
+class C32 extends C31 {}
+class C33 extends C32 {}
+class C34 extends C33 {}
+class C35 extends C34 {}
+class C36 extends C35 {}
+class C37 extends C36 {}
+class C38 extends C37 {}
+class C39 extends C38 {}
+class C40 extends C39 {}
+class C41 extends C40 {}
+class C42 extends C41 {}
+class C43 extends C42 {}
+class C44 extends C43 {}
+class C45 extends C44 {}
+class C46 extends C45 {}
+class C47 extends C46 {}
+class C48 extends C47 {}
+class C49 extends C48 {}
+class C50 extends C49 {}
+class C51 extends C50 {}
+class C52 extends C51 {}
+class C53 extends C52 {}
+class C54 extends C53 {}
+class C55 extends C54 {}
+class C56 extends C55 {}
+class C57 extends C56 {}
+class C58 extends C57 {}
+class C59 extends C58 {}
+class C60 extends C59 {}
+class C61 extends C60 {}
+class C62 extends C61 {}
+class C63 extends C62 {}
+class C64 extends C63 {}
+class C65 extends C64 {}
+class C66 extends C65 {}
+class C67 extends C66 {}
+class C68 extends C67 {}
+class C69 extends C68 {}
+class C70 extends C69 {}
+class C71 extends C70 {}
+class C72 extends C71 {}
+class C73 extends C72 {}
+class C74 extends C73 {}
+class C75 extends C74 {}
+class C76 extends C75 {}
+class C77 extends C76 {}
+class C78 extends C77 {}
+class C79 extends C78 {}
+class C80 extends C79 {}
+class C81 extends C80 {}
+class C82 extends C81 {}
+class C83 extends C82 {}
+class C84 extends C83 {}
+class C85 extends C84 {}
+class C86 extends C85 {}
+class C87 extends C86 {}
+class C88 extends C87 {}
+class C89 extends C88 {}
+class C90 extends C89 {}
+class C91 extends C90 {}
+class C92 extends C91 {}
+class C93 extends C92 {}
+class C94 extends C93 {}
+class C95 extends C94 {}
+class C96 extends C95 {}
+class C97 extends C96 {}
+class C98 extends C97 {}
+class C99 extends C98 {}
+class C100 extends C99 {}
+class C101 extends C100 {}
+class C102 extends C101 {}
+class C103 extends C102 {}
+class C104 extends C103 {}
+class C105 extends C104 {}
+class C106 extends C105 {}
+class C107 extends C106 {}
+class C108 extends C107 {}
+class C109 extends C108 {}
+class C110 extends C109 {}
+class C111 extends C110 {}
+class C112 extends C111 {}
+class C113 extends C112 {}
+class C114 extends C113 {}
+class C115 extends C114 {}
+class C116 extends C115 {}
+class C117 extends C116 {}
+class C118 extends C117 {}
+class C119 extends C118 {}
+class C120 extends C119 {}
+class C121 extends C120 {}
+class C122 extends C121 {}
+class C123 extends C122 {}
+class C124 extends C123 {}
+class C125 extends C124 {}
+class C126 extends C125 {}
diff --git a/tests/language/super_operator_index8_test.dart b/tests/language/super_operator_index8_test.dart
new file mode 100644
index 0000000..85c9772
--- /dev/null
+++ b/tests/language/super_operator_index8_test.dart
@@ -0,0 +1,46 @@
+// 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.
+
+// Test for unresolved super[] and super[]= and correct evaluation order.
+
+import "package:expect/expect.dart";
+
+class A {
+  var indexField = new List(2);
+
+  noSuchMethod(Invocation im) {
+    if (im.memberName == const Symbol('[]=')) {
+      Expect.equals(2, im.positionalArguments.length);
+      indexField[im.positionalArguments[0]] = im.positionalArguments[1];
+    } else if (im.memberName == const Symbol('[]')) {
+      Expect.equals(1, im.positionalArguments.length);
+      return indexField[im.positionalArguments[0]];
+    } else {
+      Expect.fail('Should not reach here');
+    }
+  }
+}
+
+var global = 0;
+
+f() {
+  Expect.equals(0, global++);
+  return 0;
+}
+
+g() {
+  Expect.equals(1, global++);
+  return 42;
+}
+
+class B extends A {
+  test() {
+    Expect.equals(42, super[f()] = g());
+    Expect.equals(2, global);
+  }
+}
+
+main() {
+  new B().test();
+}
diff --git a/tests/language/type_propagation_test.dart b/tests/language/type_propagation_test.dart
new file mode 100644
index 0000000..53501f1
--- /dev/null
+++ b/tests/language/type_propagation_test.dart
@@ -0,0 +1,43 @@
+// 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.
+
+// dart2js used to have an infinite loop in its type propagation
+// algorithm due to types becoming broader instead of narrower.
+
+import "package:expect/expect.dart";
+
+class A {
+  resolveSend(node) {
+    if (node == null) {
+      return [new B()][0];
+    } else {
+      return [new B(), new A()][1];
+    }
+  }
+
+  visitSend(node) {
+    var target = resolveSend(node);
+
+    if (false) {
+      if (false) {
+        target = target.getter;
+        if (false) {
+          target = new Object();
+        }
+      }
+    }
+    return true ? target : null;
+  }
+}
+
+var a = 43;
+
+class B {
+  var getter = a == 42 ? new A() : null;
+}
+
+main() {
+  Expect.isTrue(new A().visitSend(new A()) is A);
+  Expect.isTrue(new A().visitSend(null) is B);
+}
diff --git a/tests/lib/async/run_async4_test.dart b/tests/lib/async/run_async4_test.dart
index 46967df..c4a1fc1 100644
--- a/tests/lib/async/run_async4_test.dart
+++ b/tests/lib/async/run_async4_test.dart
@@ -14,7 +14,7 @@
     runAsync(() {
       invokedCallbacks++;
       if (invokedCallbacks == 100) finishPort.send("done");
-      if (i == 50) throw new RuntimeError("ignore exception");
+      if (i == 50) throw new UnsupportedError("ignore exception");
     });
   }
 }
@@ -24,7 +24,7 @@
 }
 
 bool globalErrorHandler(IsolateUnhandledException e) {
-  return e.source is RuntimeError && e.source.message == "ignore exception";
+  return e.source is UnsupportedError && e.source.message == "ignore exception";
 }
 
 main() {
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index a1bd9e0..b746139 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -23,7 +23,10 @@
 mirrors/mirrors_resolve_fields_test: Fail # Issue 6490
 
 [ $csp ]
-mirrors/library_uri_package_test: Fail, Pass # Issue 6490
+mirrors/metadata_test: Fail # Issue 6490
+mirrors/reflect_runtime_type_test: Fail # Issue 6490
+mirrors/reflect_uninstantiated_class_test: Fail # Issue 6490
+
 
 [ $compiler == dart2js && $checked ]
 async/stream_event_transform_test: Fail # Issue 7733.
@@ -70,6 +73,9 @@
 typed_data/float32x4_list_test: Fail           # Issue 10961
 typed_data/float32x4_unbox_phi_test: Fail      # Issue 10961
 typed_data/float32x4_unbox_regress_test: Fail  # Issue 10961
+mirrors/reflect_runtime_type_test: Fail
+mirrors/reflect_uninstantiated_class_test: Fail
+
 
 [ $runtime == safari]
  # Bug in JSC: the test only passes when being debugged.
@@ -81,6 +87,9 @@
 timer_isolate_test: Pass, Fail
 timer_test: Pass, Fail
 
+[ $runtime == ie9 ]
+typed_data/typed_list_iterable_test: Fail # Issue 11036
+
 [ $runtime == opera ]
 async/multiple_timer_test: Pass, Fail
 
@@ -105,8 +114,8 @@
 async/run_async6_test: Fail # Issue 10910
 
 [ $compiler == none && $runtime == drt && $system == windows ]
-async/multiple_timer_test: Fail # See Issue 10982
-async/timer_test: Fail # See Issue 10982
+async/multiple_timer_test: Fail, Pass # See Issue 10982
+async/timer_test: Fail, Pass # See Issue 10982
 
 [ $arch == arm ]
 *: Skip
diff --git a/tests/lib/mirrors/metadata_test.dart b/tests/lib/mirrors/metadata_test.dart
index 973bf34..8b54b6e 100644
--- a/tests/lib/mirrors/metadata_test.dart
+++ b/tests/lib/mirrors/metadata_test.dart
@@ -2,17 +2,24 @@
 // 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.
 
-@fisk @symbol
+@string @symbol
 library test.metadata_test;
 
 import 'dart:mirrors';
 
-const fisk = 'a metadata string';
+const string = 'a metadata string';
 
-const symbol = const Symbol('fisk');
+const symbol = const Symbol('symbol');
 
-@symbol @fisk
+const hest = 'hest';
+
+@symbol @string
 class MyClass {
+  @hest @hest @symbol
+  var x;
+
+  @string @symbol @string
+  myMethod() => 1;
 }
 
 checkMetadata(DeclarationMirror mirror, List expectedMetadata) {
@@ -34,8 +41,9 @@
   print(metadata);
 }
 
+@symbol @string @symbol
 main() {
-  if (MirrorSystem.getName(symbol) != 'fisk') {
+  if (MirrorSystem.getName(symbol) != 'symbol') {
     // This happened in dart2js due to how early library metadata is
     // computed.
     throw 'Bad constant: $symbol';
@@ -43,6 +51,16 @@
 
   MirrorSystem mirrors = currentMirrorSystem();
   checkMetadata(mirrors.findLibrary(const Symbol('test.metadata_test')).first,
-                [fisk, symbol]);
-  checkMetadata(reflect(new MyClass()).type, [symbol, fisk]);
+                [string, symbol]);
+  ClassMirror myClassMirror = reflectClass(MyClass);
+  checkMetadata(myClassMirror, [symbol, string]);
+  ClosureMirror closure = reflect(main);
+  checkMetadata(closure.function, [symbol, string, symbol]);
+  closure = reflect(new MyClass().myMethod);
+  checkMetadata(closure.function, [string, symbol, string]);
+
+  VariableMirror xMirror = myClassMirror.variables[const Symbol('x')];
+  checkMetadata(xMirror, [hest, hest, symbol]);
+
+  // TODO(ahe): Test local functions.
 }
diff --git a/tests/lib/mirrors/mirrors_test.dart b/tests/lib/mirrors/mirrors_test.dart
index 695ee778..310f57c 100644
--- a/tests/lib/mirrors/mirrors_test.dart
+++ b/tests/lib/mirrors/mirrors_test.dart
@@ -200,9 +200,10 @@
   expect(check(valueLibrary.uri), isTrue);
 }
 
-mainWithArgument({bool isDart2js}) {
+mainWithArgument({bool isDart2js: false, bool isMinified: false}) {
   var mirrors = currentMirrorSystem();
   test("Test reflective method invocation", () { testInvoke(mirrors); });
+  if (isMinified) return;
   test("Test instance field access", () { testInstanceFieldAccess(mirrors); });
   test('Test intercepted objects', () { testIntercepted(mirrors); });
   test("Test field access", () { testFieldAccess(mirrors); });
@@ -221,5 +222,5 @@
 }
 
 main() {
-  mainWithArgument(isDart2js: false);
+  mainWithArgument();
 }
diff --git a/tests/lib/mirrors/reflect_runtime_type_test.dart b/tests/lib/mirrors/reflect_runtime_type_test.dart
new file mode 100644
index 0000000..c766c2d
--- /dev/null
+++ b/tests/lib/mirrors/reflect_runtime_type_test.dart
@@ -0,0 +1,24 @@
+// 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.
+
+// A simple test that ensure that reflection works on runtime types of
+// instantiated classes.
+
+import "dart:mirrors";
+
+class Foo {
+  int a;
+}
+
+main() {
+  var m = reflectClass(new Foo().runtimeType);
+  var field = publicFields(m).single;
+  if (MirrorSystem.getName(field.simpleName) != 'a') {
+    throw 'Expected "a", but got "${MirrorSystem.getName(field.simpleName)}"';
+  }
+  print(field);
+}
+
+Iterable<VariableMirror> publicFields(ClassMirror mirror) =>
+    mirror.variables.values.where((x) => !(x.isPrivate || x.isStatic));
diff --git a/tests/lib/mirrors/reflect_uninstantiated_class_test.dart b/tests/lib/mirrors/reflect_uninstantiated_class_test.dart
new file mode 100644
index 0000000..15479b5
--- /dev/null
+++ b/tests/lib/mirrors/reflect_uninstantiated_class_test.dart
@@ -0,0 +1,24 @@
+// 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.
+
+// A simple test that ensure that reflection works on uninstantiated classes.
+
+import "dart:mirrors";
+
+class Foo {
+  int a;
+}
+
+main() {
+  // Do NOT instantiate Foo.
+  var m = reflectClass(Foo);
+  var field = publicFields(m).single;
+  if (MirrorSystem.getName(field.simpleName) != 'a') {
+    throw 'Expected "a", but got "${MirrorSystem.getName(field.simpleName)}"';
+  }
+  print(field);
+}
+
+Iterable<VariableMirror> publicFields(ClassMirror mirror) =>
+    mirror.variables.values.where((x) => !(x.isPrivate || x.isStatic));
diff --git a/tests/standalone/coverage_test.dart b/tests/standalone/coverage_test.dart
new file mode 100644
index 0000000..b5a236e
--- /dev/null
+++ b/tests/standalone/coverage_test.dart
@@ -0,0 +1,89 @@
+// 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.
+
+// This test forks a second vm process that runs the script tools/coverage.dart
+// and verifies that the coverage tool produces its expected output.
+// This test is mainly here to ensure that the coverage tool compiles and
+// runs.
+
+import "dart:io";
+import "dart:async";
+
+// Coverage tool script relative to the path of this test.
+var coverageToolScript = "../../tools/coverage.dart";
+
+// Coverage target script relative to this test.
+var coverageTargetScript = "../language/hello_dart_test.dart";
+var targPath;
+
+Process coverageToolProcess;
+List sourceLines;
+int nextLineToMatch = 0;
+
+void onCoverageOutput(String line) {
+  print("COV: $line");
+  if (nextLineToMatch < sourceLines.length) {
+    if (line.endsWith("|" + sourceLines[nextLineToMatch])) {
+      nextLineToMatch++;
+    }
+  }
+}
+
+bool checkExitCode(exitCode) {
+  var pid = coverageToolProcess.pid;
+  print("Coverage tool process (pid $pid) terminated with "
+        "exit code $exitCode.");
+  return exitCode == 0;
+}
+
+void checkSuccess() {
+  if (nextLineToMatch == sourceLines.length) {
+    print("Successfully matched all lines of '$targPath'");
+  } else {
+    print("Error: could not match all source code lines of '$targPath'");
+    exit(-1);
+  }
+}
+
+void main() {
+  var options = new Options();
+
+  // Compute paths for coverage tool and coverage target relative
+  // the the path of this script.
+  var scriptPath = new Path(options.script).directoryPath;
+  var toolPath = scriptPath.join(new Path(coverageToolScript)).canonicalize();
+  targPath = scriptPath.join(new Path(coverageTargetScript)).canonicalize();
+
+  sourceLines = new File(targPath.toNativePath()).readAsLinesSync();
+  assert(sourceLines != null);
+
+  var processOpts = [ "--compile_all",
+                      toolPath.toNativePath(),
+                      targPath.toNativePath() ];
+
+  Process.start(options.executable, processOpts).then((Process process) {
+    coverageToolProcess = process;
+    coverageToolProcess.stdin.close();
+    var stdoutStringStream = coverageToolProcess.stdout
+        .transform(new StringDecoder())
+        .transform(new LineTransformer());
+
+    var stderrStringStream = coverageToolProcess.stderr
+        .transform(new StringDecoder())
+        .transform(new LineTransformer());
+
+    // Wait for 3 future events: stdout and stderr streams of the coverage
+    // tool process closed, and coverage tool process terminated.
+    var futures = [];
+    var subscription = stdoutStringStream.listen(onCoverageOutput);
+    futures.add(subscription.asFuture(true));
+    subscription = stderrStringStream.listen(onCoverageOutput);
+    futures.add(subscription.asFuture(true));
+    futures.add(coverageToolProcess.exitCode.then(checkExitCode));
+    Future.wait(futures).then((results) {
+      checkSuccess();
+      if (results.contains(false)) exit(-1);
+    });
+  });
+}
diff --git a/tests/standalone/http_launch_data/http_isolate_main.dart b/tests/standalone/http_launch_data/http_isolate_main.dart
new file mode 100644
index 0000000..ba7a59d
--- /dev/null
+++ b/tests/standalone/http_launch_data/http_isolate_main.dart
@@ -0,0 +1,11 @@
+// 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.
+
+import 'dart:isolate';
+
+main() {
+  port.receive((message, replyTo) {
+    replyTo.call(message);
+  });
+}
diff --git a/tests/standalone/http_launch_data/http_launch_main.dart b/tests/standalone/http_launch_data/http_launch_main.dart
new file mode 100644
index 0000000..bd35bae
--- /dev/null
+++ b/tests/standalone/http_launch_data/http_launch_main.dart
@@ -0,0 +1,13 @@
+// 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 http_lanuch_main;
+
+import 'package:simple/simple.dart';
+
+main() {
+  print(getSimpleString());
+}
+
diff --git a/tests/standalone/http_launch_data/http_spawn_main.dart b/tests/standalone/http_launch_data/http_spawn_main.dart
new file mode 100644
index 0000000..dadc385
--- /dev/null
+++ b/tests/standalone/http_launch_data/http_spawn_main.dart
@@ -0,0 +1,18 @@
+// 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 http_lanuch_main;
+
+import 'dart:isolate';
+import 'dart:io';
+
+main() {
+  int port = int.parse(new Options().arguments[0]);
+  SendPort spawnedPort =
+      spawnUri('http://127.0.0.1:$port/http_isolate_main.dart');
+  spawnedPort.call('hello').then((response) {
+    print(response);
+  });
+}
+
diff --git a/tests/standalone/http_launch_data/packages/simple/simple.dart b/tests/standalone/http_launch_data/packages/simple/simple.dart
new file mode 100644
index 0000000..b571f9d
--- /dev/null
+++ b/tests/standalone/http_launch_data/packages/simple/simple.dart
@@ -0,0 +1,7 @@
+// 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 simple;
+
+String getSimpleString() => 'hello';
\ No newline at end of file
diff --git a/tests/standalone/http_launch_test.dart b/tests/standalone/http_launch_test.dart
new file mode 100644
index 0000000..06b647e
--- /dev/null
+++ b/tests/standalone/http_launch_test.dart
@@ -0,0 +1,90 @@
+// 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.
+// VMOptions=
+// VMOptions=--short_socket_read
+// VMOptions=--short_socket_write
+// VMOptions=--short_socket_read --short_socket_write
+//
+// Test:
+//   *) Launching a script fetched over HTTP.
+//   *) Importing a library fetched over HTTP.
+//   *) Automatically resolving package_root when script is fetched over HTTP.
+//   *) Spawning a URI over HTTP.
+
+library http_launch_test;
+
+import 'dart:async';
+import 'dart:io';
+import 'package:expect/expect.dart';
+
+String pathToExecutable = new Options().executable;
+String pathOfData = new File(new Options().script).directory.path +
+                    '/http_launch_data';
+int port;
+
+_sendNotFound(HttpResponse response) {
+  response.statusCode = HttpStatus.NOT_FOUND;
+  response.close();
+}
+
+handleRequest(HttpRequest request) {
+  final String path = request.uri.path;
+  final String requestPath = '$pathOfData$path';
+  final File file = new File(requestPath);
+  file.exists().then((bool found) {
+    if (found) {
+      file.openRead()
+          .pipe(request.response)
+          .catchError((e) { _sendNotFound(request.response); });
+    } else {
+      _sendNotFound(request.response);
+    }
+  });
+}
+
+serverRunning(HttpServer server) {
+  port = server.port;
+  server.listen(handleRequest);
+  Future<ProcessResult> no_http_run =
+      Process.run(pathToExecutable, ['${pathOfData}/http_launch_main.dart']);
+  Future<ProcessResult> http_run =
+    Process.run(pathToExecutable,
+                ['http://127.0.0.1:$port/http_launch_main.dart']);
+  Future<ProcessResult> http_pkg_root_run =
+    Process.run(pathToExecutable,
+                ['--package-root=http://127.0.0.1:$port/packages/',
+                'http://127.0.0.1:$port/http_launch_main.dart']);
+  Future<ProcessResult> isolate_run =
+    Process.run(pathToExecutable,
+                ['http://127.0.0.1:$port/http_spawn_main.dart', '$port']);
+  Future<List<ProcessResult>> results = Future.wait([no_http_run, http_run,
+                                                     http_pkg_root_run,
+                                                     isolate_run]);
+  results.then((results) {
+    // Close server.
+    server.close();
+    // Check results.
+    checkResults(results);
+  });
+}
+
+checkResults(List<ProcessResult> results) {
+  Expect.equals(4, results.length);
+  // Exited cleanly.
+  for (int i = 0; i < results.length; i++) {
+    ProcessResult result = results[i];
+    Expect.equals(0, result.exitCode);
+  }
+  String stdout = results[0].stdout;
+  // Output is the string 'hello'. Use startsWith to avoid new line differences.
+  Expect.isTrue(stdout.startsWith('hello'));
+  // Same output from all three process runs.
+  for (int i = 0; i < results.length; i++) {
+    Expect.equals(stdout, results[i].stdout);
+  }
+}
+
+main() {
+  HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, 0).then(serverRunning);
+}
diff --git a/tests/standalone/io/file_stat_test.dart b/tests/standalone/io/file_stat_test.dart
index 901b848..171417b 100644
--- a/tests/standalone/io/file_stat_test.dart
+++ b/tests/standalone/io/file_stat_test.dart
@@ -12,22 +12,27 @@
 void testStat() {
   Directory directory = new Directory("").createTempSync();
   File file = new File.fromPath(new Path(directory.path).append("file"));
-  FileStat nonExistent = FileStat.statSync(file.path);
-  Expect.equals(FileSystemEntityType.NOT_FOUND, nonExistent.type);
+  Expect.throws(file.statSync);
+  Expect.throws(() => FileStat.statSync(file.path));
   file.writeAsStringSync("Dart IO library test of FileStat");
   new Timer(const Duration(seconds: 2), () {
     file.readAsStringSync();
     directory.listSync();
     FileStat fileStat = FileStat.statSync(file.path);
+    FileStat fileStatDirect = file.statSync();
     Expect.equals(FileSystemEntityType.FILE, fileStat.type);
     Expect.equals(32, fileStat.size);
+    Expect.equals(FileSystemEntityType.FILE, fileStatDirect.type);
+    Expect.equals(32, fileStatDirect.size);
     if (Platform.operatingSystem != 'windows') {
       Expect.isTrue(fileStat.modified.compareTo(fileStat.accessed) < 0);
       Expect.isTrue(fileStat.changed.compareTo(fileStat.accessed) < 0);
     }
     Expect.equals(6 << 6, fileStat.mode & (6 << 6));  // Mode includes +urw.
     FileStat directoryStat = FileStat.statSync(directory.path);
+    FileStat directoryStatDirect = directory.statSync();
     Expect.equals(FileSystemEntityType.DIRECTORY, directoryStat.type);
+    Expect.equals(FileSystemEntityType.DIRECTORY, directoryStatDirect.type);
     if (Platform.operatingSystem != 'windows') {
       Expect.isTrue(
           directoryStat.modified.compareTo(directoryStat.accessed) < 0);
@@ -45,9 +50,11 @@
   .then((directory) {
     File file = new File.fromPath(new Path(directory.path).append("file"));
     return FileStat.stat(file.path)
-    .then((missingStat) {
-      Expect.equals(FileSystemEntityType.NOT_FOUND, missingStat.type);
-    })
+    .then((_) => Expect.fail("FileStat.stat should throw an exception."))
+    .catchError((e) => null)
+    .then((_) => file.stat())
+    .then((_) => Expect.fail("File.stat should throw an exception."))
+    .catchError((e) => null)
     .then((_) => file.writeAsString("Dart IO library test of FileStat"))
     .then((_) => new Future.delayed(const Duration(seconds: 2)))
     .then((_) => file.readAsString())
@@ -61,6 +68,16 @@
         Expect.isTrue(fileStat.changed.compareTo(fileStat.accessed) < 0);
       }
       Expect.equals(6 << 6, fileStat.mode & (6 << 6));  // Mode includes +urw.
+      return file.stat();
+    })
+    .then((FileStat fileStat) {
+      Expect.equals(FileSystemEntityType.FILE, fileStat.type);
+      Expect.equals(32, fileStat.size);
+      if (Platform.operatingSystem != 'windows') {
+        Expect.isTrue(fileStat.modified.compareTo(fileStat.accessed) < 0);
+        Expect.isTrue(fileStat.changed.compareTo(fileStat.accessed) < 0);
+      }
+      Expect.equals(6 << 6, fileStat.mode & (6 << 6));  // Mode includes +urw.
       return FileStat.stat(directory.path);
     })
     .then((FileStat directoryStat) {
@@ -72,6 +89,28 @@
             directoryStat.changed.compareTo(directoryStat.accessed) < 0);
       }
       Expect.equals(7 << 6, directoryStat.mode & (7 << 6));  // Includes +urwx.
+      return directory.stat();
+    })
+    .then((FileStat directoryStat) {
+      Expect.equals(FileSystemEntityType.DIRECTORY, directoryStat.type);
+      if (Platform.operatingSystem != 'windows') {
+        Expect.isTrue(
+            directoryStat.modified.compareTo(directoryStat.accessed) < 0);
+        Expect.isTrue(
+            directoryStat.changed.compareTo(directoryStat.accessed) < 0);
+      }
+      Expect.equals(7 << 6, directoryStat.mode & (7 << 6));  // Includes +urwx.
+      return new Link(directory.path).stat();
+    })
+    .then((FileStat linkStat) {
+      Expect.equals(FileSystemEntityType.DIRECTORY, linkStat.type);
+      if (Platform.operatingSystem != 'windows') {
+        Expect.isTrue(
+            linkStat.modified.compareTo(linkStat.accessed) < 0);
+        Expect.isTrue(
+            linkStat.changed.compareTo(linkStat.accessed) < 0);
+      }
+      Expect.equals(7 << 6, linkStat.mode & (7 << 6));  // Includes +urwx.
       return directory.delete(recursive: true);
     });
   });
diff --git a/tests/standalone/io/http_cookie_test.dart b/tests/standalone/io/http_cookie_test.dart
new file mode 100644
index 0000000..edc0bfd
--- /dev/null
+++ b/tests/standalone/io/http_cookie_test.dart
@@ -0,0 +1,66 @@
+// 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.
+
+import "package:expect/expect.dart";
+import "dart:async";
+import "dart:io";
+
+void testCookies() {
+  var cookies = [{'abc': 'def'},
+                 {'ABC': 'DEF'},
+                 {'Abc': 'Def'},
+                 {'Abc': 'Def', 'SID': 'sffFSDF4FsdfF56765'}];
+
+  HttpServer.bind("127.0.0.1", 0).then((server) {
+    server.listen((HttpRequest request) {
+      // Collect the cookies in a map.
+      var cookiesMap = {};
+      request.cookies.forEach((c) => cookiesMap[c.name] = c.value);
+      int index = int.parse(request.uri.path.substring(1));
+      Expect.mapEquals(cookies[index], cookiesMap);
+      // Return the same cookies to the client.
+      cookiesMap.forEach((k, v) {
+        request.response.cookies.add(new Cookie(k, v));
+      });
+      request.response.close();
+    });
+
+    int count = 0;
+    HttpClient client = new HttpClient();
+    for (int i = 0; i < cookies.length; i++) {
+      client.get("127.0.0.1", server.port, "/$i")
+          .then((request) {
+            // Send the cookies to the server.
+            cookies[i].forEach((k, v) {
+              request.cookies.add(new Cookie(k, v));
+            });
+            return request.close();
+          })
+          .then((response) {
+            // Expect the same cookies back.
+            var cookiesMap = {};
+            response.cookies.forEach((c) => cookiesMap[c.name] = c.value);
+            Expect.mapEquals(cookies[i], cookiesMap);
+            response.listen(
+                (d) {},
+                onDone: () {
+                  if (++count == cookies.length) {
+                    client.close();
+                    server.close();
+                  }
+                });
+          })
+          .catchError((e) {
+            String msg = "Unexpected error $e";
+            var trace = getAttachedStackTrace(e);
+            if (trace != null) msg += "\nStackTrace: $trace";
+            Expect.fail(msg);
+         });
+    }
+  });
+}
+
+void main() {
+  testCookies();
+}
diff --git a/tests/standalone/io/http_headers_test.dart b/tests/standalone/io/http_headers_test.dart
index 88faa65..b477497 100644
--- a/tests/standalone/io/http_headers_test.dart
+++ b/tests/standalone/io/http_headers_test.dart
@@ -314,83 +314,91 @@
 }
 
 void testCookie() {
-  void checkCookiesEquals(a, b) {
-    Expect.equals(a.name, b.name);
-    Expect.equals(a.value, b.value);
-    Expect.equals(a.expires, b.expires);
-    Expect.equals(a.toString(), b.toString());
-  }
+  test(String name, String value) {
 
-  void checkCookie(cookie, s) {
-    Expect.equals(s, cookie.toString());
-    var c = new _Cookie.fromSetCookieValue(s);
-    checkCookiesEquals(cookie, c);
-  }
+    void checkCookiesEquals(a, b) {
+      Expect.equals(a.name, b.name);
+      Expect.equals(a.value, b.value);
+      Expect.equals(a.expires, b.expires);
+      Expect.equals(a.toString(), b.toString());
+    }
 
-  Cookie cookie;
-  cookie = new Cookie("name", "value");
-  Expect.equals("name=value", cookie.toString());
-  DateTime date = new DateTime.utc(2014, DateTime.JANUARY, 5, 23, 59, 59, 0);
-  cookie.expires = date;
-  checkCookie(cookie, "name=value"
-                      "; Expires=Sun, 5 Jan 2014 23:59:59 GMT");
-  cookie.maxAge = 567;
-  checkCookie(cookie, "name=value"
-                      "; Expires=Sun, 5 Jan 2014 23:59:59 GMT"
-                      "; Max-Age=567");
-  cookie.domain = "example.com";
-  checkCookie(cookie, "name=value"
-                      "; Expires=Sun, 5 Jan 2014 23:59:59 GMT"
-                      "; Max-Age=567"
-                      "; Domain=example.com");
-  cookie.path = "/xxx";
-  checkCookie(cookie, "name=value"
-                      "; Expires=Sun, 5 Jan 2014 23:59:59 GMT"
-                      "; Max-Age=567"
-                      "; Domain=example.com"
-                      "; Path=/xxx");
-  cookie.secure = true;
-  checkCookie(cookie, "name=value"
-                      "; Expires=Sun, 5 Jan 2014 23:59:59 GMT"
-                      "; Max-Age=567"
-                      "; Domain=example.com"
-                      "; Path=/xxx"
-                      "; Secure");
-  cookie.httpOnly = true;
-  checkCookie(cookie, "name=value"
-                      "; Expires=Sun, 5 Jan 2014 23:59:59 GMT"
-                      "; Max-Age=567"
-                      "; Domain=example.com"
-                      "; Path=/xxx"
-                      "; Secure"
-                      "; HttpOnly");
-  cookie.expires = null;
-  checkCookie(cookie, "name=value"
-                      "; Max-Age=567"
-                      "; Domain=example.com"
-                      "; Path=/xxx"
-                      "; Secure"
-                      "; HttpOnly");
-  cookie.maxAge = null;
-  checkCookie(cookie, "name=value"
-                      "; Domain=example.com"
-                      "; Path=/xxx"
-                      "; Secure"
-                      "; HttpOnly");
-  cookie.domain = null;
-  checkCookie(cookie, "name=value"
-                      "; Path=/xxx"
-                      "; Secure"
-                      "; HttpOnly");
-  cookie.path = null;
-  checkCookie(cookie, "name=value"
-                      "; Secure"
-                      "; HttpOnly");
-  cookie.secure = false;
-  checkCookie(cookie, "name=value"
-                      "; HttpOnly");
-  cookie.httpOnly = false;
-  checkCookie(cookie, "name=value");
+    void checkCookie(cookie, s) {
+      Expect.equals(s, cookie.toString());
+      var c = new _Cookie.fromSetCookieValue(s);
+      checkCookiesEquals(cookie, c);
+    }
+
+    Cookie cookie;
+    cookie = new Cookie(name, value);
+    Expect.equals("$name=$value", cookie.toString());
+    DateTime date = new DateTime.utc(2014, DateTime.JANUARY, 5, 23, 59, 59, 0);
+    cookie.expires = date;
+    checkCookie(cookie, "$name=$value"
+                "; Expires=Sun, 5 Jan 2014 23:59:59 GMT");
+    cookie.maxAge = 567;
+    checkCookie(cookie, "$name=$value"
+                "; Expires=Sun, 5 Jan 2014 23:59:59 GMT"
+                "; Max-Age=567");
+    cookie.domain = "example.com";
+    checkCookie(cookie, "$name=$value"
+                "; Expires=Sun, 5 Jan 2014 23:59:59 GMT"
+                "; Max-Age=567"
+                "; Domain=example.com");
+    cookie.path = "/xxx";
+    checkCookie(cookie, "$name=$value"
+                "; Expires=Sun, 5 Jan 2014 23:59:59 GMT"
+                "; Max-Age=567"
+                "; Domain=example.com"
+                "; Path=/xxx");
+    cookie.secure = true;
+    checkCookie(cookie, "$name=$value"
+                "; Expires=Sun, 5 Jan 2014 23:59:59 GMT"
+                "; Max-Age=567"
+                "; Domain=example.com"
+                "; Path=/xxx"
+                "; Secure");
+    cookie.httpOnly = true;
+    checkCookie(cookie, "$name=$value"
+                "; Expires=Sun, 5 Jan 2014 23:59:59 GMT"
+                "; Max-Age=567"
+                "; Domain=example.com"
+                "; Path=/xxx"
+                "; Secure"
+                "; HttpOnly");
+    cookie.expires = null;
+    checkCookie(cookie, "$name=$value"
+                "; Max-Age=567"
+                "; Domain=example.com"
+                "; Path=/xxx"
+                "; Secure"
+                "; HttpOnly");
+    cookie.maxAge = null;
+    checkCookie(cookie, "$name=$value"
+                "; Domain=example.com"
+                "; Path=/xxx"
+                "; Secure"
+                "; HttpOnly");
+    cookie.domain = null;
+    checkCookie(cookie, "$name=$value"
+                "; Path=/xxx"
+                "; Secure"
+                "; HttpOnly");
+    cookie.path = null;
+    checkCookie(cookie, "$name=$value"
+                "; Secure"
+                "; HttpOnly");
+    cookie.secure = false;
+    checkCookie(cookie, "$name=$value"
+                "; HttpOnly");
+    cookie.httpOnly = false;
+    checkCookie(cookie, "$name=$value");
+  }
+  test("name", "value");
+  test("abc", "def");
+  test("ABC", "DEF");
+  test("Abc", "Def");
+  test("SID", "sJdkjKSJD12343kjKj78");
 }
 
 void testInvalidCookie() {
diff --git a/tests/standalone/io/process_non_ascii_test.dart b/tests/standalone/io/process_non_ascii_test.dart
index 92e3a8b..bd8a683 100644
--- a/tests/standalone/io/process_non_ascii_test.dart
+++ b/tests/standalone/io/process_non_ascii_test.dart
@@ -19,7 +19,7 @@
 
 main() {
   if ('æøå' != new File('æøå.txt').readAsStringSync()) {
-    throw new RuntimeError("not equal");
+    throw new StateError("not equal");
   }
 }
 """);
diff --git a/tests/standalone/io/test_extension_fail_test.dart b/tests/standalone/io/test_extension_fail_test.dart
index 0c721a5..96d0a3a 100644
--- a/tests/standalone/io/test_extension_fail_test.dart
+++ b/tests/standalone/io/test_extension_fail_test.dart
@@ -17,7 +17,7 @@
     case 'windows':
       return Process.run('cmd.exe', ['/C', 'copy $src $dst']);
     default:
-      throw new RuntimeError(
+      throw new StateError(
           'Unknown operating system ${Platform.operatingSystem}');
   }
 }
@@ -31,7 +31,7 @@
     case 'windows':
       return buildDirectory.append('test_extension.dll');
     default:
-      throw new RuntimeError(
+      throw new StateError(
           'Unknown operating system ${Platform.operatingSystem}');
   }
 }
@@ -61,13 +61,13 @@
     print("ERR: ${result.stderr}\n\n");
     print("OUT: ${result.stdout}\n\n");
     if (result.exitCode != 255) {
-      throw new RuntimeError("bad exit code");
+      throw new StateError("bad exit code");
     }
     if (!result.stderr.contains("Unhandled exception:")) {
-      throw new RuntimeError("stderr doesn't contain unhandled exception.");
+      throw new StateError("stderr doesn't contain unhandled exception.");
     }
     if (!result.stderr.contains("ball")) {
-      throw new RuntimeError("stderr doesn't contain 'ball'.");
+      throw new StateError("stderr doesn't contain 'ball'.");
     }
   }).whenComplete(() => tempDirectory.deleteSync(recursive: true));
 }
diff --git a/tests/standalone/io/test_extension_fail_tester.dart b/tests/standalone/io/test_extension_fail_tester.dart
index aa8daae..f2e72ae 100644
--- a/tests/standalone/io/test_extension_fail_tester.dart
+++ b/tests/standalone/io/test_extension_fail_tester.dart
@@ -12,7 +12,7 @@
   try {
     Cat.throwMeTheBall("ball");
   } on String catch (e) {
-    if (e != "ball") throw new RuntimeError("exception not equal to 'ball'");
+    if (e != "ball") throw new StateError("exception not equal to 'ball'");
   }
   // Make sure the exception is thrown out to the event handler from C++ code.
   // The harness expects the string "ball" to be thrown and the process to
diff --git a/tests/standalone/io/test_extension_tester.dart b/tests/standalone/io/test_extension_tester.dart
index 7077717..2c34983 100644
--- a/tests/standalone/io/test_extension_tester.dart
+++ b/tests/standalone/io/test_extension_tester.dart
@@ -10,14 +10,14 @@
   static void equals(expected, actual, [msg]) {
     if (expected != actual) {
       if (msg == null) msg = "Expected: $expected. Actual: $actual";
-      throw new RuntimeError(msg);
+      throw new StateError(msg);
     }
   }
 
   static void isNull(x, [msg]) {
     if (x != null) {
       if (msg != null) msg = "$x not null";
-      throw new RuntimeError(msg);
+      throw new StateError(msg);
     }
   }
 }
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index 3b328ab..7bb7492 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -56,6 +56,8 @@
 crypto/*: Skip # Don't run tests using dart:io in the browser
 package/*: Skip # Do not run those in Dartium.
 debugger/*: Skip # Do not run standalone debugger tests in browser.
+coverage_test: Skip
+http_launch_test: Skip
 
 [ $compiler == dartc ]
 
@@ -114,6 +116,7 @@
 pow_test: Skip # Precision > 53 bits.
 io/test_runner_test: Fail # Library dart:uri removed.
 io/skipping_dart2js_compilations_test: Skip # Library dart:uri removed.
+http_launch_test: Skip
 
 [ $compiler == dart2js && $jscl ]
 assert_test: Fail, OK # Assumes unspecified fields on the AssertionError.
diff --git a/tools/VERSION b/tools/VERSION
index 6594807..73c3ade 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -1,4 +1,4 @@
 MAJOR 0
 MINOR 5
-BUILD 13
-PATCH 1
+BUILD 14
+PATCH 0
diff --git a/tools/coverage.dart b/tools/coverage.dart
index 1c9519e..4a3467b 100644
--- a/tools/coverage.dart
+++ b/tools/coverage.dart
@@ -101,7 +101,8 @@
       }
     });
 
-    List lines = new File(Uri.parse(url).path).readAsLinesSync();
+    String srcPath = new Path(Uri.parse(url).path).toNativePath();
+    List lines = new File(srcPath).readAsLinesSync();
     for (int line = 1; line <= lines.length; line++) {
       String prefix = "      ";
       if (lineCounts.containsKey(line)) {
@@ -177,7 +178,9 @@
       if (line.startsWith("Debugger listening")) {
         RegExp portExpr = new RegExp(r"\d+");
         var port = portExpr.stringMatch(line);
-        print("Debug target found listening at port '$port'");
+        var pid = targetProcess.pid;
+        print("Coverage target process (pid $pid) found "
+              "listening on port $port.");
         openConnection(int.parse(port));
       }
     });
@@ -227,15 +230,14 @@
     }
   }
 
-  // Handle one JSON message object and match it to the
-  // expected events and responses in the debugging script.
+  // Handle one JSON message object.
   void handleMessage(Map<String,dynamic> receivedMsg) {
     currentMessage = receivedMsg;
     if (receivedMsg["event"] != null) {
       handleEvent(receivedMsg);
       if (errorsDetected) {
-        error("Error while handling debugger event");
-        error("Event received from debug target: $receivedMsg");
+        error("Error while handling event message");
+        error("Event received from coverage target: $receivedMsg");
       }
     } else if (receivedMsg["id"] != null) {
       // This is a response to the last command we sent.
@@ -249,7 +251,7 @@
     }
   }
 
-  // Handle data received over the wire from the debug target
+  // Handle data received over the wire from the coverage target
   // process. Split input from JSON wire format into individual
   // message objects (maps).
   void handleMessages() {
@@ -265,8 +267,8 @@
       var msgObj = JSON.parse(msg);
       handleMessage(msgObj);
       if (errorsDetected) {
-        error("Error while handling message from debug target");
-        error("Message received from debug target: $msg");
+        error("Error while handling message from coverage target");
+        error("Message received from coverage target: $msg");
         cleanup();
         return;
       }
@@ -327,16 +329,16 @@
             }
           },
           onDone: () {
-            print("Connection closed by debug target");
+            print("Connection closed by coverage target");
             cleanup();
           },
           onError: (e) {
-            print("Error '$e' detected in input stream from debug target");
+            print("Error '$e' detected in input stream from coverage target");
             cleanup();
           });
       },
       onError: (e) {
-        String msg = "Error while connecting to debugee: $e";
+        String msg = "Error while connecting to coverage target: $e";
         var trace = getAttachedStackTrace(e);
         if (trace != null) msg += "\nStackTrace: $trace";
         error(msg);
@@ -356,14 +358,14 @@
       });
     }
     var targetPid = targetProcess.pid;
-    print("Sending kill signal to process $targetPid...");
+    print("Sending kill signal to process $targetPid.");
     targetProcess.kill();
     // If the process was already dead exitCode is already
     // available and we call exit() in the next event loop cycle.
     // Otherwise this will wait for the process to exit.
 
     targetProcess.exitCode.then((exitCode) {
-      print("process $targetPid terminated with exit code $exitCode.");
+      print("Process $targetPid terminated with exit code $exitCode.");
       if (errorsDetected) {
         print("\n===== Errors detected: =====");
         for (int i = 0; i < errors.length; i++) print(errors[i]);
@@ -377,7 +379,7 @@
 }
 
 
-// Class to buffer wire protocol data from debug target and
+// Class to buffer wire protocol data from coverage target and
 // break it down to individual json messages.
 class JsonBuffer {
   String buffer = null;
diff --git a/tools/create_sdk.py b/tools/create_sdk.py
index d157268..c938e92 100755
--- a/tools/create_sdk.py
+++ b/tools/create_sdk.py
@@ -16,7 +16,7 @@
 # ......dart or dart.exe (executable)
 # ......dart.lib (import library for VM native extensions on Windows)
 # ......dart2js
-# ......dart_analyzer
+# ......dartanalyzer
 # ......pub
 # ......snapshots/
 # ........utils_wrapper.dart.snapshot
@@ -49,8 +49,6 @@
 # ......unittest/
 # ......(more will come here)
 # ....util/
-# ......analyzer/
-# ........dart_analyzer.jar
 # ......dartanalyzer/
 # ........dartanalyzer.jar
 # ........(third-party libraries for dart_analyzer)
@@ -160,10 +158,8 @@
   # TODO(dgrove) - deal with architectures that are not ia32.
   build_dir = os.path.dirname(SDK)
   dart_file_extension = ''
-  analyzer_file_extension = ''
   if HOST_OS == 'win32':
     dart_file_extension = '.exe'
-    analyzer_file_extension = '.bat'
     dart_import_lib_src = join(HOME, build_dir, 'dart.lib')
     dart_import_lib_dest = join(BIN, 'dart.lib')
     copyfile(dart_import_lib_src, dart_import_lib_dest)
@@ -177,15 +173,6 @@
   elif HOST_OS == 'macos':
     subprocess.call(['strip', '-x', dart_dest_binary])
 
-  # Copy analyzer into sdk/bin
-  ANALYZER_HOME = join(HOME, build_dir, 'analyzer')
-  dart_analyzer_src_binary = join(ANALYZER_HOME, 'bin',
-      'dart_analyzer' + analyzer_file_extension)
-  dart_analyzer_dest_binary = join(BIN,
-      'dart_analyzer' + analyzer_file_extension)
-  copyfile(dart_analyzer_src_binary, dart_analyzer_dest_binary)
-  copymode(dart_analyzer_src_binary, dart_analyzer_dest_binary)
-
   #
   # Create and populate sdk/include.
   #
@@ -250,25 +237,6 @@
   UTIL = join(SDK_tmp, 'util')
   os.makedirs(UTIL)
 
-  # Create and copy Analyzer library into 'util'
-  ANALYZER_DEST = join(UTIL, 'analyzer')
-  os.makedirs(ANALYZER_DEST)
-
-  analyzer_src_jar = join(ANALYZER_HOME, 'util', 'analyzer',
-                          'dart_analyzer.jar')
-  analyzer_dest_jar = join(ANALYZER_DEST, 'dart_analyzer.jar')
-  copyfile(analyzer_src_jar, analyzer_dest_jar)
-
-  jarsToCopy = [ join("args4j", "2.0.12", "args4j-2.0.12.jar"),
-                 join("guava", "r13", "guava-13.0.1.jar"),
-                 join("json", "r2_20080312", "json.jar") ]
-  for jarToCopy in jarsToCopy:
-    dest_dir = join (ANALYZER_DEST, os.path.dirname(jarToCopy))
-    os.makedirs(dest_dir)
-    dest_file = join (ANALYZER_DEST, jarToCopy)
-    src_file = join(ANALYZER_HOME, 'util', 'analyzer', jarToCopy)
-    copyfile(src_file, dest_file)
-
   # Create and copy dartanalyzer into 'util'
   DARTANALYZER_SRC = join(HOME, build_dir, 'dartanalyzer')
   DARTANALYZER_DEST = join(UTIL, 'dartanalyzer')
diff --git a/tools/dom/dom.json b/tools/dom/dom.json
index f773ca9..c0f2c2c 100644
--- a/tools/dom/dom.json
+++ b/tools/dom/dom.json
@@ -96,15 +96,9 @@
       "loop": {},
       "loopEnd": {},
       "loopStart": {},
-      "noteGrainOn": {
-        "support_level": "untriaged"
-      },
-      "noteOff": {
-        "support_level": "untriaged"
-      },
-      "noteOn": {
-        "support_level": "untriaged"
-      },
+      "noteGrainOn": {},
+      "noteOff": {},
+      "noteOn": {},
       "playbackRate": {},
       "playbackState": {},
       "start": {},
@@ -125,17 +119,11 @@
       "createChannelSplitter": {},
       "createConvolver": {},
       "createDelay": {},
-      "createDelayNode": {
-        "support_level": "untriaged"
-      },
+      "createDelayNode": {},
       "createDynamicsCompressor": {},
       "createGain": {},
-      "createGainNode": {
-        "support_level": "untriaged"
-      },
-      "createJavaScriptNode": {
-        "support_level": "untriaged"
-      },
+      "createGainNode": {},
+      "createJavaScriptNode": {},
       "createMediaElementSource": {},
       "createMediaStreamDestination": {},
       "createMediaStreamSource": {},
@@ -175,14 +163,17 @@
   "AudioNode": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioNode-section",
     "members": {
+      "addEventListener": {},
       "channelCount": {},
       "channelCountMode": {},
       "channelInterpretation": {},
       "connect": {},
       "context": {},
       "disconnect": {},
+      "dispatchEvent": {},
       "numberOfInputs": {},
-      "numberOfOutputs": {}
+      "numberOfOutputs": {},
+      "removeEventListener": {}
     },
     "support_level": "experimental"
   },
@@ -197,9 +188,7 @@
       "minValue": {},
       "name": {},
       "setTargetAtTime": {},
-      "setTargetValueAtTime": {
-        "support_level": "untriaged"
-      },
+      "setTargetValueAtTime": {},
       "setValueAtTime": {},
       "setValueCurveAtTime": {},
       "units": {},
@@ -227,12 +216,13 @@
     },
     "support_level": "experimental"
   },
-  "BarInfo": {
-    "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#barprop (Rename to BarProp?)",
+  "BarProp": {
+    "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#barprop",
+    "dart_action": "suppress",
     "members": {
       "visible": {}
     },
-    "support_level": "nonstandard"
+    "support_level": "standard"
   },
   "BatteryManager": {
     "comment": "https://dvcs.w3.org/hg/dap/raw-file/default/battery/Overview.html#batterymanager-interface",
@@ -294,6 +284,13 @@
     "members": {},
     "support_level": "deprecated"
   },
+  "CSS": {
+    "comment": "http://www.w3.org/TR/css3-conditional/#the-css-interface",
+    "dart_action": "experimental",
+    "members": {
+      "supports": {}
+    }
+  },
   "CSSCharsetRule": {
     "comment": "http://dev.w3.org/csswg/cssom/#the-csscharsetrule-interface",
     "members": {
@@ -410,9 +407,7 @@
       "MEDIA_RULE": {},
       "PAGE_RULE": {},
       "STYLE_RULE": {},
-      "SUPPORTS_RULE": {
-        "support_level": "untriaged"
-      },
+      "SUPPORTS_RULE": {},
       "UNKNOWN_RULE": {
         "comment": "http://dev.w3.org/csswg/cssom/#changes-from-dom2",
         "dart_action": "suppress",
@@ -459,17 +454,7 @@
         "support_level": "deprecated"
       },
       "getPropertyPriority": {},
-      "getPropertyShorthand": {
-        "comment": "http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface",
-        "dart_action": "suppress",
-        "support_level": "deprecated"
-      },
       "getPropertyValue": {},
-      "isPropertyImplicit": {
-        "comment": "http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface",
-        "dart_action": "suppress",
-        "support_level": "deprecated"
-      },
       "item": {},
       "length": {},
       "parentRule": {},
@@ -506,21 +491,14 @@
     "support_level": "stable"
   },
   "CSSSupportsRule": {
+    "comment": "http://www.w3.org/TR/css3-conditional/#csssupportsrule",
     "members": {
-      "conditionText": {
-        "support_level": "untriaged"
-      },
-      "cssRules": {
-        "support_level": "untriaged"
-      },
-      "deleteRule": {
-        "support_level": "untriaged"
-      },
-      "insertRule": {
-        "support_level": "untriaged"
-      }
+      "conditionText": {},
+      "cssRules": {},
+      "deleteRule": {},
+      "insertRule": {}
     },
-    "support_level": "untriaged"
+    "support_level": "standard"
   },
   "CSSUnknownRule": {
     "comment": "http://dev.w3.org/csswg/cssom/#the-cssstylesheet-interface",
@@ -551,12 +529,11 @@
     "support_level": "deprecated"
   },
   "Canvas2DContextAttributes": {
+    "comment": "http://wiki.whatwg.org/wiki/CanvasOpaque#Suggested_IDL",
     "members": {
-      "alpha": {
-        "support_level": "untriaged"
-      }
+      "alpha": {}
     },
-    "support_level": "untriaged"
+    "support_level": "experimental"
   },
   "CanvasGradient": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#canvasgradient",
@@ -611,7 +588,8 @@
       "fillText": {},
       "font": {},
       "getContextAttributes": {
-        "support_level": "untriaged"
+        "comment": "http://wiki.whatwg.org/wiki/CanvasOpaque#Suggested_IDL",
+        "support_level": "experimental"
       },
       "getImageData": {},
       "getLineDash": {},
@@ -714,6 +692,12 @@
       "deleteData": {},
       "insertData": {},
       "length": {},
+      "nextElementSibling": {
+        "comment": "http://dom.spec.whatwg.org/#childnode"
+      },
+      "previousElementSibling": {
+        "comment": "http://dom.spec.whatwg.org/#childnode"
+      },
       "remove": {
         "support_level": "nonstandard"
       },
@@ -768,19 +752,18 @@
   },
   "Comment": {
     "comment": "http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-1728279322",
-    "members": {},
+    "members": {
+      "Comment": {}
+    },
     "support_level": "stable"
   },
   "Composition": {
+    "comment": "http://www.w3.org/TR/ime-api/#idl-def-Composition",
     "members": {
-      "caret": {
-        "support_level": "untriaged"
-      },
-      "text": {
-        "support_level": "untriaged"
-      }
+      "caret": {},
+      "text": {}
     },
-    "support_level": "untriaged"
+    "support_level": "experimental"
   },
   "CompositionEvent": {
     "comment": "http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-CompositionEvent",
@@ -1061,17 +1044,6 @@
     },
     "support_level": "experimental"
   },
-  "DOMFormData": {
-    "comment": "http://www.w3.org/TR/XMLHttpRequest2/#interface-formdata",
-    "members": {
-      "DOMFormData": {},
-      "FormData": {
-        "support_level": "untriaged"
-      },
-      "append": {}
-    },
-    "support_level": "stable"
-  },
   "DOMImplementation": {
     "comment": "http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-102161490",
     "members": {
@@ -1085,23 +1057,6 @@
     },
     "support_level": "stable"
   },
-  "DOMMimeType": {
-    "members": {
-      "description": {},
-      "enabledPlugin": {},
-      "suffixes": {},
-      "type": {}
-    },
-    "support_level": "nonstandard"
-  },
-  "DOMMimeTypeArray": {
-    "members": {
-      "item": {},
-      "length": {},
-      "namedItem": {}
-    },
-    "support_level": "nonstandard"
-  },
   "DOMNamedFlowCollection": {
     "comment": "http://dev.w3.org/csswg/css-regions/#dom-named-flow-collection",
     "members": {
@@ -1118,126 +1073,16 @@
     },
     "support_level": "stable"
   },
-  "DOMPath": {
-    "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#path-objects",
-    "members": {
-      "DOMPath": {},
-      "arc": {},
-      "arcTo": {},
-      "bezierCurveTo": {},
-      "closePath": {},
-      "lineTo": {},
-      "moveTo": {},
-      "quadraticCurveTo": {},
-      "rect": {}
-    },
-    "support_level": "experimental"
-  },
-  "DOMPlugin": {
-    "members": {
-      "description": {},
-      "filename": {},
-      "item": {},
-      "length": {},
-      "name": {},
-      "namedItem": {}
-    },
-    "support_level": "nonstandard"
-  },
-  "DOMPluginArray": {
-    "members": {
-      "item": {},
-      "length": {},
-      "namedItem": {},
-      "refresh": {}
-    },
-    "support_level": "nonstandard"
-  },
   "DOMPoint": {
     "comment": "http://developer.apple.com/library/safari/#documentation/DataManagement/Reference/DOMWindowAdditionsReference/DOMWindowAdditions/DOMWindowAdditions.html",
     "members": {
       "DOMPoint": {},
-      "_DomPoint": {
-        "support_level": "untriaged"
-      },
+      "_DomPoint": {},
       "x": {},
       "y": {}
     },
     "support_level": "nonstandard"
   },
-  "DOMSecurityPolicy": {
-    "comment": "https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#securitypolicy",
-    "members": {
-      "allowsConnectionTo": {},
-      "allowsEval": {},
-      "allowsFontFrom": {},
-      "allowsFormAction": {},
-      "allowsFrameFrom": {},
-      "allowsImageFrom": {},
-      "allowsInlineScript": {},
-      "allowsInlineStyle": {},
-      "allowsMediaFrom": {},
-      "allowsObjectFrom": {},
-      "allowsPluginType": {},
-      "allowsScriptFrom": {},
-      "allowsStyleFrom": {},
-      "isActive": {},
-      "reportURIs": {}
-    },
-    "support_level": "experimental"
-  },
-  "DOMSelection": {
-    "comment": "https://dvcs.w3.org/hg/editing/raw-file/tip/editing.html#concept-selection",
-    "members": {
-      "addRange": {},
-      "anchorNode": {},
-      "anchorOffset": {},
-      "baseNode": {
-        "support_level": "nonstandard"
-      },
-      "baseOffset": {
-        "support_level": "nonstandard"
-      },
-      "collapse": {},
-      "collapseToEnd": {},
-      "collapseToStart": {},
-      "containsNode": {
-        "support_level": "nonstandard"
-      },
-      "deleteFromDocument": {},
-      "empty": {
-        "support_level": "nonstandard"
-      },
-      "extend": {},
-      "extentNode": {
-        "support_level": "nonstandard"
-      },
-      "extentOffset": {
-        "support_level": "nonstandard"
-      },
-      "focusNode": {},
-      "focusOffset": {},
-      "getRangeAt": {},
-      "isCollapsed": {},
-      "modify": {
-        "support_level": "nonstandard"
-      },
-      "rangeCount": {},
-      "removeAllRanges": {},
-      "selectAllChildren": {},
-      "setBaseAndExtent": {
-        "support_level": "nonstandard"
-      },
-      "setPosition": {
-        "support_level": "nonstandard"
-      },
-      "toString": {},
-      "type": {
-        "support_level": "nonstandard"
-      }
-    },
-    "support_level": "stable"
-  },
   "DOMSettableTokenList": {
     "comment": "http://dev.w3.org/html5/spec-LC/common-dom-interfaces.html#domsettabletokenlist-0",
     "members": {
@@ -1270,18 +1115,10 @@
     },
     "support_level": "stable"
   },
-  "DOMURL": {
-    "comment": "http://www.w3.org/TR/FileAPI/#URL-object",
-    "members": {
-      "createObjectURL": {},
-      "revokeObjectURL": {}
-    },
-    "support_level": "stable"
-  },
   "DOMWindow": {
     "members": {
       "CSS": {
-        "support_level": "untriaged"
+        "comment": "http://www.w3.org/TR/css3-conditional/#the-css-interface"
       },
       "PERSISTENT": {
         "comment": "http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem",
@@ -1367,9 +1204,7 @@
       "offscreenBuffering": {
         "support_level": "nonstandard"
       },
-      "onDOMContentLoaded": {
-        "support_level": "untriaged"
-      },
+      "onDOMContentLoaded": {},
       "onabort": {},
       "onbeforeunload": {},
       "onblur": {},
@@ -1464,13 +1299,13 @@
       "onvolumechange": {},
       "onwaiting": {},
       "onwebkitAnimationEnd": {
-        "support_level": "untriaged"
+        "support_level": "experimental"
       },
       "onwebkitAnimationIteration": {
-        "support_level": "untriaged"
+        "support_level": "experimental"
       },
       "onwebkitAnimationStart": {
-        "support_level": "untriaged"
+        "support_level": "experimental"
       },
       "onwebkitTransitionEnd": {
         "support_level": "deprecated"
@@ -1540,7 +1375,8 @@
       "setTimeout": {},
       "showModalDialog": {},
       "speechSynthesis": {
-        "support_level": "untriaged"
+        "comment": "https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section",
+        "support_level": "experimental"
       },
       "status": {},
       "statusbar": {},
@@ -1597,14 +1433,6 @@
     },
     "support_level": "stable"
   },
-  "DOMWindowCSS": {
-    "members": {
-      "supports": {
-        "support_level": "untriaged"
-      }
-    },
-    "support_level": "untriaged"
-  },
   "DataTransferItem": {
     "comment": "http://www.w3.org/TR/2011/WD-html5-20110113/dnd.html#the-datatransferitem-interface",
     "members": {
@@ -1791,6 +1619,12 @@
         "dart_action": "suppress",
         "support_level": "nonstandard"
       },
+      "childElementCount": {
+        "comment": "http://dom.spec.whatwg.org/#parentnode"
+      },
+      "children": {
+        "comment": "http://dom.spec.whatwg.org/#parentnode"
+      },
       "compatMode": {
         "dart_action": "suppress"
       },
@@ -1861,6 +1695,9 @@
         "dart_action": "suppress"
       },
       "execCommand": {},
+      "firstElementChild": {
+        "comment": "http://dom.spec.whatwg.org/#parentnode"
+      },
       "fontloader": {
         "comment": "http://www.w3.org/TR/css3-fonts/#document-fontloader",
         "support_level": "experimental"
@@ -1893,6 +1730,9 @@
         "dart_action": "suppress",
         "support_level": "deprecated"
       },
+      "lastElementChild": {
+        "comment": "http://dom.spec.whatwg.org/#parentnode"
+      },
       "lastModified": {},
       "links": {
         "dart_action": "suppress"
@@ -2084,6 +1924,16 @@
   },
   "DocumentFragment": {
     "members": {
+      "DocumentFragment": {},
+      "childElementCount": {
+        "comment": "http://dom.spec.whatwg.org/#parentnode"
+      },
+      "firstElementChild": {
+        "comment": "http://dom.spec.whatwg.org/#parentnode"
+      },
+      "lastElementChild": {
+        "comment": "http://dom.spec.whatwg.org/#parentnode"
+      },
       "querySelector": {},
       "querySelectorAll": {}
     },
@@ -2246,6 +2096,10 @@
       "getElementsByTagNameNS": {
         "dart_action": "suppress"
       },
+      "getInputContext": {
+        "comment": "http://www.w3.org/TR/ime-api/#the-getinputcontext-method",
+        "support_level": "experimental"
+      },
       "hasAttribute": {},
       "hasAttributeNS": {},
       "hasAttributes": {},
@@ -2498,6 +2352,14 @@
     },
     "support_level": "stable"
   },
+  "Entity": {
+    "members": {
+      "notationName": {},
+      "publicId": {},
+      "systemId": {}
+    },
+    "support_level": "untriaged"
+  },
   "EntityReference": {
     "dart_action": "suppress",
     "members": {},
@@ -2690,6 +2552,10 @@
       "defaultPrevented": {},
       "eventPhase": {},
       "initEvent": {},
+      "path": {
+        "comment": "https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#extensions-to-event",
+        "support_level": "experimental"
+      },
       "preventDefault": {},
       "returnValue": {
         "comment": "http://dev.w3.org/html5/spec-LC/history.html#dom-beforeunloadevent-returnvalue",
@@ -2980,6 +2846,14 @@
     },
     "support_level": "experimental"
   },
+  "FormData": {
+    "comment": "http://www.w3.org/TR/XMLHttpRequest2/#interface-formdata",
+    "members": {
+      "FormData": {},
+      "append": {}
+    },
+    "support_level": "stable"
+  },
   "GainNode": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#GainNode",
     "members": {
@@ -3432,6 +3306,10 @@
       "contentEditable": {},
       "dir": {},
       "draggable": {},
+      "getInputContext": {
+        "comment": "http://www.w3.org/TR/ime-api/#the-getinputcontext-method",
+        "support_level": "experimental"
+      },
       "hidden": {},
       "id": {},
       "innerHTML": {},
@@ -4033,6 +3911,10 @@
       "load": {},
       "loop": {},
       "mediaGroup": {},
+      "mediaKeys": {
+        "comment": "https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html",
+        "support_level": "experimental"
+      },
       "muted": {},
       "networkState": {},
       "oncanplay": {},
@@ -5133,30 +5015,17 @@
     "support_level": "stable"
   },
   "InputMethodContext": {
+    "comment": "http://www.w3.org/TR/ime-api/#idl-def-InputMethodContext",
     "members": {
-      "composition": {
-        "support_level": "untriaged"
-      },
-      "confirmComposition": {
-        "support_level": "untriaged"
-      },
-      "enabled": {
-        "support_level": "untriaged"
-      },
-      "locale": {
-        "support_level": "untriaged"
-      },
-      "open": {
-        "support_level": "untriaged"
-      },
-      "setCaretRectangle": {
-        "support_level": "untriaged"
-      },
-      "setExclusionRectangle": {
-        "support_level": "untriaged"
-      }
+      "composition": {},
+      "confirmComposition": {},
+      "enabled": {},
+      "locale": {},
+      "open": {},
+      "setCaretRectangle": {},
+      "setExclusionRectangle": {}
     },
-    "support_level": "untriaged"
+    "support_level": "experimental"
   },
   "Int16Array": {
     "comment": "http://www.khronos.org/registry/typedarray/specs/latest/",
@@ -5266,63 +5135,51 @@
     "support_level": "stable"
   },
   "MIDIConnectionEvent": {
+    "comment": "http://webaudio.github.io/web-midi-api/#midiconnectionevent-interface",
     "members": {
-      "port": {
-        "support_level": "untriaged"
-      }
+      "port": {}
     },
-    "support_level": "untriaged"
+    "support_level": "experimental"
   },
   "MIDIErrorCallback": {
+    "comment": "http://webaudio.github.io/web-midi-api/#midierrorcallback",
     "members": {},
-    "support_level": "untriaged"
+    "support_level": "experimental"
   },
   "MIDIInput": {
+    "comment": "http://webaudio.github.io/web-midi-api/#idl-def-MIDIInput",
     "members": {},
-    "support_level": "untriaged"
+    "support_level": "experimental"
   },
   "MIDIMessageEvent": {
+    "comment": "http://webaudio.github.io/web-midi-api/#midimessageevent-interface",
     "members": {
-      "data": {
-        "support_level": "untriaged"
-      },
-      "receivedTime": {
-        "support_level": "untriaged"
-      }
+      "data": {},
+      "receivedTime": {}
     },
-    "support_level": "untriaged"
+    "support_level": "experimental"
+  },
+  "MIDIOutput": {
+    "comment": "http://webaudio.github.io/web-midi-api/#midioutput-interface",
+    "members": {
+      "send": {}
+    },
+    "support_level": "experimental"
   },
   "MIDIPort": {
+    "comment": "http://webaudio.github.io/web-midi-api/#idl-def-MIDIPort",
     "members": {
-      "addEventListener": {
-        "support_level": "untriaged"
-      },
-      "dispatchEvent": {
-        "support_level": "untriaged"
-      },
-      "id": {
-        "support_level": "untriaged"
-      },
-      "manufacturer": {
-        "support_level": "untriaged"
-      },
-      "name": {
-        "support_level": "untriaged"
-      },
-      "ondisconnect": {
-        "support_level": "untriaged"
-      },
-      "removeEventListener": {
-        "support_level": "untriaged"
-      },
-      "type": {
-        "support_level": "untriaged"
-      },
-      "version": {
-        "support_level": "untriaged"
-      }
+      "addEventListener": {},
+      "dispatchEvent": {},
+      "id": {},
+      "manufacturer": {},
+      "name": {},
+      "ondisconnect": {},
+      "removeEventListener": {},
+      "type": {},
+      "version": {}
     },
-    "support_level": "untriaged"
+    "support_level": "experimental"
   },
   "MediaController": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#mediacontroller",
@@ -5382,7 +5239,10 @@
       "MEDIA_KEYERR_OUTPUT": {},
       "MEDIA_KEYERR_SERVICE": {},
       "MEDIA_KEYERR_UNKNOWN": {},
-      "code": {}
+      "code": {},
+      "systemCode": {
+        "support_level": "nonstandard"
+      }
     },
     "support_level": "experimental"
   },
@@ -5399,6 +5259,44 @@
     },
     "support_level": "experimental"
   },
+  "MediaKeyMessageEvent": {
+    "comment": "https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-mediakeymessageevent",
+    "members": {
+      "destinationURL": {},
+      "message": {}
+    },
+    "support_level": "experimental"
+  },
+  "MediaKeyNeededEvent": {
+    "comment": "https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-mediakeyneededevent",
+    "members": {
+      "initData": {}
+    },
+    "support_level": "experimental"
+  },
+  "MediaKeySession": {
+    "comment": "https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-mediakeysession",
+    "members": {
+      "addEventListener": {},
+      "close": {},
+      "dispatchEvent": {},
+      "error": {},
+      "keySystem": {},
+      "removeEventListener": {},
+      "sessionId": {},
+      "update": {}
+    },
+    "support_level": "experimental"
+  },
+  "MediaKeys": {
+    "comment": "https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html",
+    "members": {
+      "MediaKeys": {},
+      "createSession": {},
+      "keySystem": {}
+    },
+    "support_level": "experimental"
+  },
   "MediaList": {
     "comment": "http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSMediaRule",
     "dart_action": "unstable",
@@ -5430,24 +5328,6 @@
     },
     "support_level": "stable"
   },
-  "MediaSource": {
-    "comment": "https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#mediasource",
-    "members": {
-      "MediaSource": {},
-      "activeSourceBuffers": {},
-      "addEventListener": {},
-      "addSourceBuffer": {},
-      "dispatchEvent": {},
-      "duration": {},
-      "endOfStream": {},
-      "isTypeSupported": {},
-      "readyState": {},
-      "removeEventListener": {},
-      "removeSourceBuffer": {},
-      "sourceBuffers": {}
-    },
-    "support_level": "experimental"
-  },
   "MediaStream": {
     "comment": "http://dev.w3.org/2011/webrtc/editor/getusermedia.html#mediastream",
     "members": {
@@ -5468,9 +5348,7 @@
       "onremovetrack": {},
       "removeEventListener": {},
       "removeTrack": {},
-      "stop": {
-        "support_level": "untriaged"
-      }
+      "stop": {}
     },
     "support_level": "experimental"
   },
@@ -5587,6 +5465,23 @@
     },
     "support_level": "experimental"
   },
+  "MimeType": {
+    "members": {
+      "description": {},
+      "enabledPlugin": {},
+      "suffixes": {},
+      "type": {}
+    },
+    "support_level": "nonstandard"
+  },
+  "MimeTypeArray": {
+    "members": {
+      "item": {},
+      "length": {},
+      "namedItem": {}
+    },
+    "support_level": "nonstandard"
+  },
   "MouseEvent": {
     "comment": "http://www.w3.org/TR/DOM-Level-3-Events/#events-mouseevents",
     "members": {
@@ -6078,16 +5973,24 @@
     "members": {},
     "support_level": "experimental"
   },
+  "OESTextureFloatLinear": {
+    "comment": "http://www.khronos.org/registry/webgl/extensions/OES_texture_float_linear/",
+    "members": {},
+    "support_level": "experimental"
+  },
   "OESTextureHalfFloat": {
     "comment": "http://www.khronos.org/registry/webgl/extensions/OES_texture_half_float/",
     "dart_action": "experimental",
     "members": {
-      "HALF_FLOAT_OES": {
-        "support_level": "untriaged"
-      }
+      "HALF_FLOAT_OES": {}
     },
     "support_level": "experimental"
   },
+  "OESTextureHalfFloatLinear": {
+    "comment": "http://www.khronos.org/registry/webgl/extensions/OES_texture_half_float_linear/",
+    "members": {},
+    "support_level": "experimental"
+  },
   "OESVertexArrayObject": {
     "comment": "http://www.khronos.org/registry/webgl/extensions/OES_vertex_array_object/",
     "dart_action": "experimental",
@@ -6148,12 +6051,8 @@
       "UNSCHEDULED_STATE": {},
       "detune": {},
       "frequency": {},
-      "noteOff": {
-        "support_level": "untriaged"
-      },
-      "noteOn": {
-        "support_level": "untriaged"
-      },
+      "noteOff": {},
+      "noteOn": {},
       "playbackState": {},
       "setWaveTable": {},
       "start": {},
@@ -6241,29 +6140,51 @@
     },
     "support_level": "experimental"
   },
+  "Path": {
+    "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#path-objects",
+    "members": {
+      "Path": {},
+      "arc": {},
+      "arcTo": {},
+      "bezierCurveTo": {},
+      "closePath": {},
+      "lineTo": {},
+      "moveTo": {},
+      "quadraticCurveTo": {},
+      "rect": {}
+    },
+    "support_level": "experimental"
+  },
   "Performance": {
     "comment": "http://www.w3.org/TR/navigation-timing/#performance",
     "members": {
       "clearMarks": {
-        "support_level": "untriaged"
+        "comment": "https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface",
+        "support_level": "experimental"
       },
       "clearMeasures": {
-        "support_level": "untriaged"
+        "comment": "https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface",
+        "support_level": "experimental"
       },
       "getEntries": {
-        "support_level": "untriaged"
+        "comment": "http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute",
+        "support_level": "experimental"
       },
       "getEntriesByName": {
-        "support_level": "untriaged"
+        "comment": "http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute",
+        "support_level": "experimental"
       },
       "getEntriesByType": {
-        "support_level": "untriaged"
+        "comment": "http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute",
+        "support_level": "experimental"
       },
       "mark": {
-        "support_level": "untriaged"
+        "comment": "https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface",
+        "support_level": "experimental"
       },
       "measure": {
-        "support_level": "untriaged"
+        "comment": "https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface",
+        "support_level": "experimental"
       },
       "memory": {
         "dart_action": "experimental",
@@ -6278,36 +6199,8 @@
         "support_level": "experimental"
       },
       "timing": {},
-      "webkitClearMarks": {
-        "comment": "https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface",
-        "support_level": "experimental"
-      },
-      "webkitClearMeasures": {
-        "comment": "https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface",
-        "support_level": "experimental"
-      },
       "webkitClearResourceTimings": {
-        "comment": "http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods",
-        "support_level": "experimental"
-      },
-      "webkitGetEntries": {
-        "comment": "http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute",
-        "support_level": "experimental"
-      },
-      "webkitGetEntriesByName": {
-        "comment": "http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute",
-        "support_level": "experimental"
-      },
-      "webkitGetEntriesByType": {
-        "comment": "http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute",
-        "support_level": "experimental"
-      },
-      "webkitMark": {
-        "comment": "https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface",
-        "support_level": "experimental"
-      },
-      "webkitMeasure": {
-        "comment": "https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface",
+        "comment": "http://www.w3c-test.org/webperf/specs/ResourceTiming/#extensions-performance-interface",
         "support_level": "experimental"
       },
       "webkitSetResourceTimingBufferSize": {
@@ -6413,6 +6306,26 @@
     },
     "support_level": "stable"
   },
+  "Plugin": {
+    "members": {
+      "description": {},
+      "filename": {},
+      "item": {},
+      "length": {},
+      "name": {},
+      "namedItem": {}
+    },
+    "support_level": "nonstandard"
+  },
+  "PluginArray": {
+    "members": {
+      "item": {},
+      "length": {},
+      "namedItem": {},
+      "refresh": {}
+    },
+    "support_level": "nonstandard"
+  },
   "PopStateEvent": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html#popstateevent",
     "members": {
@@ -6665,6 +6578,7 @@
         "dart_action": "experimental",
         "support_level": "nonstandard"
       },
+      "Range": {},
       "START_TO_END": {},
       "START_TO_START": {},
       "cloneContents": {},
@@ -9899,38 +9813,32 @@
     },
     "support_level": "experimental"
   },
-  "ScriptProfile": {
-    "dart_action": "suppress",
+  "SecurityPolicy": {
+    "comment": "https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#securitypolicy",
     "members": {
-      "head": {},
-      "idleTime": {},
-      "title": {},
-      "uid": {}
+      "allowsConnectionTo": {},
+      "allowsEval": {},
+      "allowsFontFrom": {},
+      "allowsFormAction": {},
+      "allowsFrameFrom": {},
+      "allowsImageFrom": {},
+      "allowsInlineScript": {},
+      "allowsInlineStyle": {},
+      "allowsMediaFrom": {},
+      "allowsObjectFrom": {},
+      "allowsPluginType": {},
+      "allowsScriptFrom": {},
+      "allowsStyleFrom": {},
+      "isActive": {},
+      "reportURIs": {}
     },
-    "support_level": "nonstandard"
-  },
-  "ScriptProfileNode": {
-    "dart_action": "suppress",
-    "members": {
-      "callUID": {},
-      "children": {},
-      "functionName": {},
-      "lineNumber": {},
-      "numberOfCalls": {},
-      "selfTime": {},
-      "totalTime": {},
-      "url": {},
-      "visible": {}
-    },
-    "support_level": "nonstandard"
+    "support_level": "experimental"
   },
   "SecurityPolicyViolationEvent": {
     "comment": "https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#securitypolicyviolationevent-events",
     "members": {
       "blockedURI": {},
-      "columnNumber": {
-        "support_level": "untriaged"
-      },
+      "columnNumber": {},
       "documentURI": {},
       "effectiveDirective": {},
       "lineNumber": {},
@@ -9941,6 +9849,58 @@
     },
     "support_level": "experimental"
   },
+  "Selection": {
+    "comment": "https://dvcs.w3.org/hg/editing/raw-file/tip/editing.html#concept-selection",
+    "members": {
+      "addRange": {},
+      "anchorNode": {},
+      "anchorOffset": {},
+      "baseNode": {
+        "support_level": "nonstandard"
+      },
+      "baseOffset": {
+        "support_level": "nonstandard"
+      },
+      "collapse": {},
+      "collapseToEnd": {},
+      "collapseToStart": {},
+      "containsNode": {
+        "support_level": "nonstandard"
+      },
+      "deleteFromDocument": {},
+      "empty": {
+        "support_level": "nonstandard"
+      },
+      "extend": {},
+      "extentNode": {
+        "support_level": "nonstandard"
+      },
+      "extentOffset": {
+        "support_level": "nonstandard"
+      },
+      "focusNode": {},
+      "focusOffset": {},
+      "getRangeAt": {},
+      "isCollapsed": {},
+      "modify": {
+        "support_level": "nonstandard"
+      },
+      "rangeCount": {},
+      "removeAllRanges": {},
+      "selectAllChildren": {},
+      "setBaseAndExtent": {
+        "support_level": "nonstandard"
+      },
+      "setPosition": {
+        "support_level": "nonstandard"
+      },
+      "toString": {},
+      "type": {
+        "support_level": "nonstandard"
+      }
+    },
+    "support_level": "stable"
+  },
   "ShadowRoot": {
     "comment": "https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-root",
     "members": {
@@ -9975,29 +9935,6 @@
     },
     "support_level": "nonstandard"
   },
-  "SourceBuffer": {
-    "comment": "https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#sourcebuffer",
-    "members": {
-      "abort": {},
-      "append": {
-        "support_level": "nonstandard"
-      },
-      "buffered": {},
-      "timestampOffset": {}
-    },
-    "support_level": "experimental"
-  },
-  "SourceBufferList": {
-    "comment": "https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#sourcebufferlist",
-    "members": {
-      "addEventListener": {},
-      "dispatchEvent": {},
-      "item": {},
-      "length": {},
-      "removeEventListener": {}
-    },
-    "support_level": "experimental"
-  },
   "SpeechGrammar": {
     "comment": "https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#dfn-speechgrammar",
     "members": {
@@ -10114,112 +10051,58 @@
     "support_level": "experimental"
   },
   "SpeechSynthesis": {
+    "comment": "https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section",
     "members": {
-      "cancel": {
-        "support_level": "untriaged"
-      },
-      "getVoices": {
-        "support_level": "untriaged"
-      },
-      "pause": {
-        "support_level": "untriaged"
-      },
-      "paused": {
-        "support_level": "untriaged"
-      },
-      "pending": {
-        "support_level": "untriaged"
-      },
-      "resume": {
-        "support_level": "untriaged"
-      },
-      "speak": {
-        "support_level": "untriaged"
-      },
-      "speaking": {
-        "support_level": "untriaged"
-      }
+      "cancel": {},
+      "getVoices": {},
+      "pause": {},
+      "paused": {},
+      "pending": {},
+      "resume": {},
+      "speak": {},
+      "speaking": {}
     },
-    "support_level": "untriaged"
+    "support_level": "experimental"
   },
   "SpeechSynthesisEvent": {
+    "comment": "https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section",
     "members": {
-      "charIndex": {
-        "support_level": "untriaged"
-      },
-      "elapsedTime": {
-        "support_level": "untriaged"
-      },
-      "name": {
-        "support_level": "untriaged"
-      }
+      "charIndex": {},
+      "elapsedTime": {},
+      "name": {}
     },
-    "support_level": "untriaged"
+    "support_level": "experimental"
   },
   "SpeechSynthesisUtterance": {
+    "comment": "https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section",
     "members": {
       "SpeechSynthesisUtterance": {},
-      "lang": {
-        "support_level": "untriaged"
-      },
-      "onboundary": {
-        "support_level": "untriaged"
-      },
-      "onend": {
-        "support_level": "untriaged"
-      },
-      "onerror": {
-        "support_level": "untriaged"
-      },
-      "onmark": {
-        "support_level": "untriaged"
-      },
-      "onpause": {
-        "support_level": "untriaged"
-      },
-      "onresume": {
-        "support_level": "untriaged"
-      },
-      "onstart": {
-        "support_level": "untriaged"
-      },
-      "pitch": {
-        "support_level": "untriaged"
-      },
-      "rate": {
-        "support_level": "untriaged"
-      },
-      "text": {
-        "support_level": "untriaged"
-      },
-      "voice": {
-        "support_level": "untriaged"
-      },
-      "volume": {
-        "support_level": "untriaged"
-      }
+      "lang": {},
+      "onboundary": {},
+      "onend": {},
+      "onerror": {},
+      "onmark": {},
+      "onpause": {},
+      "onresume": {},
+      "onstart": {},
+      "pitch": {},
+      "rate": {},
+      "text": {},
+      "voice": {},
+      "volume": {}
     },
-    "support_level": "untriaged"
+    "support_level": "experimental"
   },
   "SpeechSynthesisVoice": {
+    "comment": "https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section",
     "members": {
-      "default": {
-        "support_level": "untriaged"
-      },
-      "lang": {
-        "support_level": "untriaged"
-      },
-      "localService": {
-        "support_level": "untriaged"
-      },
-      "name": {
-        "support_level": "untriaged"
-      },
-      "voiceURI": {
-        "support_level": "untriaged"
-      }
+      "default": {},
+      "lang": {},
+      "localService": {},
+      "name": {},
+      "voiceURI": {}
     },
-    "support_level": "untriaged"
+    "support_level": "experimental"
   },
   "Storage": {
     "comment": "http://www.w3.org/TR/webstorage/#the-storage-interface",
@@ -10326,6 +10209,7 @@
   "Text": {
     "comment": "http://dom.spec.whatwg.org/#interface-text",
     "members": {
+      "Text": {},
       "replaceWholeText": {
         "comment": "http://dom.spec.whatwg.org/#dom-text-replacewholetext",
         "dart_action": "suppress",
@@ -10593,6 +10477,14 @@
     },
     "support_level": "stable"
   },
+  "URL": {
+    "comment": "http://www.w3.org/TR/FileAPI/#URL-object",
+    "members": {
+      "createObjectURL": {},
+      "revokeObjectURL": {}
+    },
+    "support_level": "stable"
+  },
   "Uint16Array": {
     "comment": "http://www.khronos.org/registry/typedarray/specs/latest/",
     "members": {
@@ -11392,6 +11284,47 @@
     },
     "support_level": "deprecated"
   },
+  "WebKitMediaSource": {
+    "comment": "https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#mediasource",
+    "members": {
+      "WebKitMediaSource": {},
+      "activeSourceBuffers": {},
+      "addEventListener": {},
+      "addSourceBuffer": {},
+      "dispatchEvent": {},
+      "duration": {},
+      "endOfStream": {},
+      "isTypeSupported": {},
+      "readyState": {},
+      "removeEventListener": {},
+      "removeSourceBuffer": {},
+      "sourceBuffers": {}
+    },
+    "support_level": "experimental"
+  },
+  "WebKitSourceBuffer": {
+    "comment": "https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#sourcebuffer",
+    "members": {
+      "abort": {},
+      "append": {
+        "support_level": "nonstandard"
+      },
+      "buffered": {},
+      "timestampOffset": {}
+    },
+    "support_level": "experimental"
+  },
+  "WebKitSourceBufferList": {
+    "comment": "https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#sourcebufferlist",
+    "members": {
+      "addEventListener": {},
+      "dispatchEvent": {},
+      "item": {},
+      "length": {},
+      "removeEventListener": {}
+    },
+    "support_level": "experimental"
+  },
   "WebSocket": {
     "comment": "http://www.w3.org/TR/websockets/#the-websocket-interface",
     "dart_action": "unstable",
@@ -11604,9 +11537,7 @@
     "members": {
       "DONE": {},
       "HEADERS_RECEIVED": {},
-      "HttpRequest": {
-        "support_level": "untriaged"
-      },
+      "HttpRequest": {},
       "LOADING": {},
       "OPENED": {},
       "UNSENT": {},
diff --git a/tools/dom/idl/dart/dart.idl b/tools/dom/idl/dart/dart.idl
index b307156..907cbb0 100644
--- a/tools/dom/idl/dart/dart.idl
+++ b/tools/dom/idl/dart/dart.idl
@@ -23,6 +23,12 @@
 };
 
 [Supplemental]
+interface Clipboard {
+  [Suppressed] void setDragImage(HTMLImageElement image, long x, long y);
+  [Custom] void setDragImage(Element element, long x, long y);
+};
+
+[Supplemental]
 interface Document {
   [Suppressed] DOMObject getCSSCanvasContext(DOMString contextId, DOMString name, long width, long height);
   CanvasRenderingContext getCSSCanvasContext(DOMString contextId, DOMString name, long width, long height);
@@ -240,7 +246,7 @@
   CustomConstructor,
   // Provide missing constructor signature.
   Constructor(optional HTMLFormElement form)]
-interface DOMFormData {
+interface FormData {
   [Suppressed] void append(DOMString name, DOMString value, DOMString filename);
   [Custom] void append(DOMString name, DOMString value);
   [Custom] void append(DOMString name, Blob value, optional DOMString filename);
@@ -277,7 +283,7 @@
    [Custom] void send(Blob data);
    [Custom] void send(Document data);
    [Custom] void send([StrictTypeChecking] DOMString data);
-   [Custom] void send(DOMFormData data);
+   [Custom] void send(FormData data);
 };
 
 
@@ -297,5 +303,20 @@
 interface JavaScriptCallFrame {};
 
 
-[Suppressed]
-interface Entity {};
+[Supplemental]
+interface Location {
+  [CustomSetter] attribute DOMString href;
+
+  [Custom] void assign(optional DOMString url);
+  [Custom] void replace([Default=Undefined] optional DOMString url);
+  [Custom] void reload();
+
+  // URI decomposition attributes
+  [CustomSetter] attribute DOMString protocol;
+  [CustomSetter] attribute DOMString host;
+  [CustomSetter] attribute DOMString hostname;
+  [CustomSetter] attribute DOMString port;
+  [CustomSetter] attribute DOMString pathname;
+  [CustomSetter] attribute DOMString search;
+  [CustomSetter] attribute DOMString hash;
+};
\ No newline at end of file
diff --git a/tools/dom/scripts/dartmetadata.py b/tools/dom/scripts/dartmetadata.py
index 3cbd995..042ef89 100644
--- a/tools/dom/scripts/dartmetadata.py
+++ b/tools/dom/scripts/dartmetadata.py
@@ -288,7 +288,7 @@
     "@Experimental",
   ],
   'Event.clipboardData': _webkit_experimental_annotations,
-  'DOMFormData': _all_but_ie9_annotations,
+  'FormData': _all_but_ie9_annotations,
   'HashChangeEvent': [
     "@SupportedBrowser(SupportedBrowser.CHROME)",
     "@SupportedBrowser(SupportedBrowser.FIREFOX)",
diff --git a/tools/dom/scripts/fremontcutbuilder.py b/tools/dom/scripts/fremontcutbuilder.py
index 16bf69a..503619a 100755
--- a/tools/dom/scripts/fremontcutbuilder.py
+++ b/tools/dom/scripts/fremontcutbuilder.py
@@ -20,7 +20,6 @@
     'ENABLE_BATTERY_STATUS',
     'ENABLE_CSS_DEVICE_ADAPTATION',
     'ENABLE_CUSTOM_SCHEME_HANDLER',
-    'ENABLE_ENCRYPTED_MEDIA_V2',
     'ENABLE_MEDIA_CAPTURE', # Only enabled on Android.
     'ENABLE_ORIENTATION_EVENTS', # Only enabled on Android.
     'ENABLE_WEBVTT_REGIONS',
@@ -29,13 +28,11 @@
 
 FEATURE_DEFINES = [
     'ENABLE_CALENDAR_PICKER', # Not on Android
-    'ENABLE_DATALIST_ELEMENT', # Not on Android
-    'ENABLE_ENCRYPTED_MEDIA',
+    'ENABLE_ENCRYPTED_MEDIA_V2',
     'ENABLE_INPUT_SPEECH', # Not on Android
     'ENABLE_LEGACY_NOTIFICATIONS', # Not on Android
     'ENABLE_NAVIGATOR_CONTENT_UTILS', # Not on Android
     'ENABLE_NOTIFICATIONS', # Not on Android
-    'ENABLE_PAGE_POPUP', # Not on Android
     'ENABLE_SVG',
     'ENABLE_SVG_FONTS',
     'ENABLE_WEB_AUDIO', # Not on Android
diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py
index 73bf90e..7912543 100644
--- a/tools/dom/scripts/generator.py
+++ b/tools/dom/scripts/generator.py
@@ -37,6 +37,17 @@
 def IsPureInterface(interface_name):
   return interface_name in _pure_interfaces
 
+#
+# Classes which have native constructors but which we are suppressing because
+# they are not cross-platform.
+#
+_suppressed_native_constructors = monitored.Set(
+    'generator._suppressed_native_constructors', [
+  'DocumentFragment',
+  'Range',
+  'Text',
+  ])
+
 _custom_types = monitored.Set('generator._custom_types',
                               typed_array_renames.keys())
 
@@ -242,6 +253,9 @@
 
   Returns None if the interface has no Constructor.
   """
+  if interface.id in _suppressed_native_constructors:
+    return None
+
   if 'Constructor' in interface.ext_attrs:
     name = None
     overloads = interface.ext_attrs['Constructor']
@@ -477,9 +491,9 @@
                  'dynamic'),
 
     'ImageData get':
-      Conversion('_convertNativeToDart_ImageData', 'dynamic', 'ImageData'),
+      Conversion('convertNativeToDart_ImageData', 'dynamic', 'ImageData'),
     'ImageData set':
-      Conversion('_convertDartToNative_ImageData', 'ImageData', 'dynamic'),
+      Conversion('convertDartToNative_ImageData', 'ImageData', 'dynamic'),
 
     'Dictionary get':
       Conversion('convertNativeToDart_Dictionary', 'dynamic', 'Map'),
@@ -503,7 +517,7 @@
                  'dynamic', 'dynamic'),
 
     '* get History.state':
-      Conversion('_convertNativeToDart_SerializedScriptValue',
+      Conversion('convertNativeToDart_SerializedScriptValue',
                  'dynamic', 'dynamic'),
 
     '* get PopStateEvent.state':
@@ -626,6 +640,10 @@
     if self._idl_type in WTF_INCLUDES:
       return ['<wtf/%s.h>' % self.native_type()]
 
+    # TODO(vsm): Why does this need special casing?
+    if self._idl_type == 'AnalyserNode':
+      return ['"AnalyserNode.h"', '<wtf/Uint8Array.h>']
+
     if not self._idl_type.startswith('SVG'):
       return ['"%s.h"' % self.native_type()]
 
@@ -688,6 +706,14 @@
 
     return implementation_name
 
+  def native_type(self):
+    database = self._type_registry._database
+    if database.HasInterface(self.idl_type()):
+      interface = database.GetInterface(self.idl_type())
+      if 'ImplementedAs' in interface.ext_attrs:
+        return interface.ext_attrs['ImplementedAs']
+    return super(InterfaceIDLTypeInfo, self).native_type()
+
   def has_generated_interface(self):
     return not self._data.suppress_interface
 
@@ -979,8 +1005,8 @@
         item_type='CSSRule', suppress_interface=True),
     'CSSValueList': TypeData(clazz='Interface',
         item_type='CSSValue', suppress_interface=True),
-    'DOMMimeTypeArray': TypeData(clazz='Interface', item_type='DOMMimeType'),
-    'DOMPluginArray': TypeData(clazz='Interface', item_type='DOMPlugin'),
+    'MimeTypeArray': TypeData(clazz='Interface', item_type='MimeType'),
+    'PluginArray': TypeData(clazz='Interface', item_type='Plugin'),
     'DOMStringList': TypeData(clazz='Interface', item_type='DOMString',
         dart_type='List<String>', custom_to_native=True),
     'EntryArray': TypeData(clazz='Interface', item_type='Entry',
@@ -999,7 +1025,7 @@
                          suppress_interface=False, dart_type='List<Node>'),
     'SVGElementInstanceList': TypeData(clazz='Interface',
         item_type='SVGElementInstance', suppress_interface=True),
-    'SourceBufferList': TypeData(clazz='Interface', item_type='SourceBuffer'),
+    'WebKitSourceBufferList': TypeData(clazz='Interface', item_type='WebKitSourceBuffer'),
     'SpeechGrammarList': TypeData(clazz='Interface', item_type='SpeechGrammar'),
     'SpeechInputResultList': TypeData(clazz='Interface',
         item_type='SpeechInputResult', suppress_interface=True),
diff --git a/tools/dom/scripts/htmldartgenerator.py b/tools/dom/scripts/htmldartgenerator.py
index 26aab5a..05e0b21 100644
--- a/tools/dom/scripts/htmldartgenerator.py
+++ b/tools/dom/scripts/htmldartgenerator.py
@@ -239,22 +239,22 @@
 
     def GenerateChecksAndCall(signature_index, argument_count):
       checks = []
-      for i in range(0, argument_count):
+      for i in reversed(range(0, argument_count)):
         argument = signatures[signature_index][i]
         parameter_name = parameter_names[i]
         test_type = self._DartType(argument.type.id)
 
         if test_type in ['dynamic', 'Object']:
-          checks.append('?%s' % parameter_name)
+          checks.append('%s != null' % parameter_name)
         elif not can_omit_type_check(test_type, i):
           checks.append('(%s is %s || %s == null)' % (
               parameter_name, test_type, parameter_name))
         elif i >= number_of_required_in_dart:
-          checks.append('?%s' % parameter_name)
+          checks.append('%s != null' % parameter_name)
 
       # There can be multiple presence checks.  We need them all since a later
       # optional argument could have been passed by name, leaving 'holes'.
-      checks.extend(['!?%s' % name for name in parameter_names[argument_count:]])
+      checks.extend(['%s == null' % name for name in parameter_names[argument_count:]])
 
       GenerateCall(signature_index, argument_count, checks)
 
@@ -292,7 +292,7 @@
       argument_count = len(signature)
       for argument_position, argument in list(enumerate(signature))[::-1]:
         if is_optional(0, argument):
-          check = '?%s' % parameter_names[argument_position]
+          check = '%s != null' % parameter_names[argument_position]
           # argument_count instead of argument_position + 1 is used here to cover one
           # complicated case with the effectively optional argument in the middle.
           # Consider foo(x, optional y, [Default=NullString] optional z)
@@ -375,10 +375,8 @@
     if not factory_constructor_name:
       factory_constructor_name = '_create'
       factory_parameters = constructor_info.ParametersAsArgumentList()
-      has_factory_provider = True
     else:
       factory_parameters = ', '.join(constructor_info.factory_parameters)
-      has_factory_provider = False
 
     if constructor_info.pure_dart_constructor:
       # TODO(antonm): use common dispatcher generation for this case as well.
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index b3d7354..29514e9 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -73,7 +73,6 @@
   'DedicatedWorkerContext', # Workers
   'DirectoryEntrySync', # Workers
   'DirectoryReaderSync', # Workers
-  'EntityReference',
   'EntrySync', # Workers
   'FileEntrySync', # Workers
   'FileReaderSync', # Workers
@@ -316,8 +315,6 @@
     'Document.createCDATASection': 'createCDataSection',
     'Document.defaultView': 'window',
     'Document.querySelector': 'query',
-    'DOMURL.createObjectURL': 'createObjectUrl',
-    'DOMURL.revokeObjectURL': 'revokeObjectUrl',
     'DOMWindow.CSS': 'css',
     'DOMWindow.clearTimeout': '_clearTimeout',
     'DOMWindow.clearInterval': '_clearInterval',
@@ -345,6 +342,8 @@
     'StorageInfo.queryUsageAndQuota': '_queryUsageAndQuota',
     'SVGElement.className': '$dom_svgClassName',
     'SVGStopElement.offset': 'gradientOffset',
+    'URL.createObjectURL': 'createObjectUrl',
+    'URL.revokeObjectURL': 'revokeObjectUrl',
     'WheelEvent.wheelDeltaX': '_wheelDeltaX',
     'WheelEvent.wheelDeltaY': '_wheelDeltaY',
     #'WorkerContext.webkitRequestFileSystem': '_requestFileSystem',
@@ -396,12 +395,10 @@
     'Document.all',
     'Document.applets',
     'Document.bgColor',
-    'Document.captureEvents',
     'Document.clear',
     'Document.createAttribute',
     'Document.createAttributeNS',
     'Document.createComment',
-    'Document.createEntityReference',
     'Document.createExpression',
     'Document.createNSResolver',
     'Document.createProcessingInstruction',
@@ -433,7 +430,6 @@
     'Document.linkColor',
     'Document.location',
     'Document.open',
-    'Document.releaseEvents',
     'Document.set:domain',
     'Document.vlinkColor',
     'Document.webkitCurrentFullScreenElement',
@@ -442,6 +438,7 @@
     'Document.writeln',
     'Document.xmlStandalone',
     'Document.xmlVersion',
+    'DocumentFragment.children',
     'DocumentType.*',
     'DOMCoreException.code',
     'DOMCoreException.ABORT_ERR',
@@ -666,6 +663,10 @@
     """
     interface = self._database.GetInterface(interface_name)
 
+    if not member:
+      if 'ImplementedAs' in member_node.ext_attrs:
+        member = member_node.ext_attrs['ImplementedAs']
+
     if self.ShouldSuppressMember(interface, member, member_prefix):
       return None
 
diff --git a/tools/dom/scripts/idlparser.py b/tools/dom/scripts/idlparser.py
index 3142118..7016f4d 100755
--- a/tools/dom/scripts/idlparser.py
+++ b/tools/dom/scripts/idlparser.py
@@ -263,8 +263,11 @@
     def Type():
       return _Type
 
+    def UnionType():
+      return ['(', Type, 'or', Type, ')']
+
     def ReturnType():
-      return OR(VoidType, _Type)
+      return OR(VoidType, _Type, UnionType)
 
     def InterfaceType():
       return ScopedName
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index 9c75488..cc0d179 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -23,7 +23,6 @@
     'CanvasRenderingContext2D.drawImage',
     'CanvasRenderingContext2D.lineDashOffset',
     'Console.memory',
-    'Console.profiles',
     'Console.assertCondition',
     'Console.count',
     'Console.debug',
diff --git a/tools/dom/scripts/systemnative.py b/tools/dom/scripts/systemnative.py
index 9b4b677..c016b7e 100644
--- a/tools/dom/scripts/systemnative.py
+++ b/tools/dom/scripts/systemnative.py
@@ -10,7 +10,7 @@
 import os
 from generator import *
 from htmldartgenerator import *
-from idlnode import IDLArgument
+from idlnode import IDLArgument, IDLAttribute
 from systemhtml import js_support_checks, GetCallbackInfo, HTML_LIBRARY_NAMES
 
 _cpp_type_map = {
@@ -424,7 +424,7 @@
         [],
         attr.type.id,
         attr.type.nullable,
-        'GetterRaisesException' in attr.ext_attrs)
+        'GetterRaisesException' in attr.ext_attrs or 'RaisesException' in attr.ext_attrs)
 
   def _AddSetter(self, attr, html_name):
     type_info = self._TypeInfo(attr.type.id)
@@ -798,6 +798,10 @@
         if argument.type.nullable:
           return True
 
+        if isinstance(argument, IDLAttribute):
+          return (argument.type.id == 'DOMString') and \
+              ('Reflect' in argument.ext_attrs)
+
         if isinstance(argument, IDLArgument):
           if IsOptional(argument) and not self._IsArgumentOptionalInWebCore(node, argument):
             return True
@@ -939,7 +943,7 @@
     if 'ImplementedBy' in idl_node.ext_attrs:
       return '%s::%s' % (idl_node.ext_attrs['ImplementedBy'], function_name)
     if idl_node.is_static:
-      return '%s::%s' % (self._interface_type_info.idl_type(), function_name)
+      return '%s::%s' % (self._interface_type_info.native_type(), function_name)
     interface_name = self._interface_type_info.idl_type()
     cpp_type_name = _GetCPPTypeName(interface_name, function_name)
     if cpp_type_name == interface_name:
diff --git a/tools/dom/src/dart2js_Conversions.dart b/tools/dom/src/dart2js_Conversions.dart
index 86f32fb..0ca4216 100644
--- a/tools/dom/src/dart2js_Conversions.dart
+++ b/tools/dom/src/dart2js_Conversions.dart
@@ -51,46 +51,3 @@
     return e;
   }
 }
-
-// Conversions for ImageData
-//
-// On Firefox, the returned ImageData is a plain object.
-
-class _TypedImageData implements ImageData {
-  final Uint8ClampedList data;
-  final int height;
-  final int width;
-
-  _TypedImageData(this.data, this.height, this.width);
-}
-
-ImageData _convertNativeToDart_ImageData(nativeImageData) {
-
-  // None of the native getters that return ImageData have the type ImageData
-  // since that is incorrect for FireFox (which returns a plain Object).  So we
-  // need something that tells the compiler that the ImageData class has been
-  // instantiated.
-  // TODO(sra): Remove this when all the ImageData returning APIs have been
-  // annotated as returning the union ImageData + Object.
-  JS('ImageData', '0');
-
-  if (nativeImageData is ImageData) return nativeImageData;
-
-  // On Firefox the above test fails because imagedata is a plain object.
-  // So we create a _TypedImageData.
-
-  return new _TypedImageData(
-      JS('var', '#.data', nativeImageData),
-      JS('var', '#.height', nativeImageData),
-      JS('var', '#.width', nativeImageData));
-}
-
-// We can get rid of this conversion if _TypedImageData implements the fields
-// with native names.
-_convertDartToNative_ImageData(ImageData imageData) {
-  if (imageData is _TypedImageData) {
-    return JS('', '{data: #, height: #, width: #}',
-        imageData.data, imageData.height, imageData.width);
-  }
-  return imageData;
-}
diff --git a/tools/dom/src/dart2js_FactoryProviders.dart b/tools/dom/src/dart2js_FactoryProviders.dart
deleted file mode 100644
index 03edac9..0000000
--- a/tools/dom/src/dart2js_FactoryProviders.dart
+++ /dev/null
@@ -1,10 +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.
-
-part of html;
-
-class _TextFactoryProvider {
-  static Text createText(String data) =>
-      JS('Text', 'document.createTextNode(#)', data);
-}
diff --git a/tools/dom/src/dartium_FactoryProviders.dart b/tools/dom/src/dartium_FactoryProviders.dart
deleted file mode 100644
index 5a4f3831..0000000
--- a/tools/dom/src/dartium_FactoryProviders.dart
+++ /dev/null
@@ -1,9 +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.
-
-part of html;
-
-class _TextFactoryProvider {
-  static Text createText(String data) => document.$dom_createTextNode(data);
-}
diff --git a/tools/dom/src/native_DOMImplementation.dart b/tools/dom/src/native_DOMImplementation.dart
index 65c918e..89f1394 100644
--- a/tools/dom/src/native_DOMImplementation.dart
+++ b/tools/dom/src/native_DOMImplementation.dart
@@ -71,7 +71,6 @@
   static void spawnDomFunction(Function f, int replyTo) native "Utils_spawnDomFunction";
   static void spawnDomUri(String uri, int replyTo) native "Utils_spawnDomUri";
   static int _getNewIsolateId() native "Utils_getNewIsolateId";
-  static bool shadowRootSupported(Document document) native "Utils_shadowRootSupported";
 }
 
 class _NPObject extends NativeFieldWrapperClass1 {
diff --git a/tools/dom/src/shared_FactoryProviders.dart b/tools/dom/src/shared_FactoryProviders.dart
deleted file mode 100644
index 0355ba9..0000000
--- a/tools/dom/src/shared_FactoryProviders.dart
+++ /dev/null
@@ -1,52 +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.
-
-part of html;
-
-class _CssStyleDeclarationFactoryProvider {
-  static CssStyleDeclaration createCssStyleDeclaration_css(String css) {
-    final style = new Element.tag('div').style;
-    style.cssText = css;
-    return style;
-  }
-
-  static CssStyleDeclaration createCssStyleDeclaration() {
-    return new CssStyleDeclaration.css('');
-  }
-}
-
-class _DocumentFragmentFactoryProvider {
-  @DomName('Document.createDocumentFragment')
-  static DocumentFragment createDocumentFragment() =>
-      document.createDocumentFragment();
-
-  static DocumentFragment createDocumentFragment_html(String html) {
-    final fragment = new DocumentFragment();
-    fragment.innerHtml = html;
-    return fragment;
-  }
-
-  // TODO(nweiz): enable this when XML is ported.
-  // factory DocumentFragment.xml(String xml) {
-  //   final fragment = new DocumentFragment();
-  //   final e = new XMLElement.tag("xml");
-  //   e.innerHtml = xml;
-  //
-  //   // Copy list first since we don't want liveness during iteration.
-  //   final List nodes = new List.from(e.nodes);
-  //   fragment.nodes.addAll(nodes);
-  //   return fragment;
-  // }
-
-  static DocumentFragment createDocumentFragment_svg(String svgContent) {
-    final fragment = new DocumentFragment();
-    final e = new svg.SvgSvgElement();
-    e.innerHtml = svgContent;
-
-    // Copy list first since we don't want liveness during iteration.
-    final List nodes = new List.from(e.nodes);
-    fragment.nodes.addAll(nodes);
-    return fragment;
-  }
-}
diff --git a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
index 64629ed..b843324 100644
--- a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
@@ -53,11 +53,9 @@
 part '$AUXILIARY_DIR/Serialization.dart';
 part '$AUXILIARY_DIR/WrappedEvent.dart';
 part '$AUXILIARY_DIR/WrappedList.dart';
-part '$AUXILIARY_DIR/shared_FactoryProviders.dart';
 part '$AUXILIARY_DIR/dart2js_Conversions.dart';
 part '$AUXILIARY_DIR/dart2js_DOMImplementation.dart';
 part '$AUXILIARY_DIR/dart2js_KeyEvent.dart';
-part '$AUXILIARY_DIR/dart2js_FactoryProviders.dart';
 part '$AUXILIARY_DIR/dart2js_LocationWrapper.dart';
 part '$AUXILIARY_DIR/dart2js_Platform.dart';
 part '$AUXILIARY_DIR/_ListIterators.dart';
diff --git a/tools/dom/templates/html/dart2js/impl_Console.darttemplate b/tools/dom/templates/html/dart2js/impl_Console.darttemplate
index 84527d2..cfd9531 100644
--- a/tools/dom/templates/html/dart2js/impl_Console.darttemplate
+++ b/tools/dom/templates/html/dart2js/impl_Console.darttemplate
@@ -14,10 +14,6 @@
   MemoryInfo get memory => _isConsoleDefined ?
       JS('MemoryInfo', 'console.memory') : null;
 
-  @DomName('Console.profiles')
-  List<ScriptProfile> get profiles => _isConsoleDefined ?
-      JS('List<ScriptProfile>', 'console.profiles') : null;
-
   @DomName('Console.assertCondition')
   void assertCondition(bool condition, Object arg) => _isConsoleDefined ?
       JS('void', 'console.assertCondition(#, #)', condition, arg) : null;
diff --git a/tools/dom/templates/html/dart2js/web_audio_dart2js.darttemplate b/tools/dom/templates/html/dart2js/web_audio_dart2js.darttemplate
index c7b04f6..772177a 100644
--- a/tools/dom/templates/html/dart2js/web_audio_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/web_audio_dart2js.darttemplate
@@ -10,7 +10,7 @@
 import 'dart:html';
 import 'dart:html_common';
 import 'dart:typed_data';
-import 'dart:_js_helper' show Creates, Returns, convertDartClosureToJS;
+import 'dart:_js_helper' show Creates, JSName, Returns, convertDartClosureToJS;
 import 'dart:_foreign_helper' show JS;
 import 'dart:_interceptors' show Interceptor;
 
diff --git a/tools/dom/templates/html/dartium/html_dartium.darttemplate b/tools/dom/templates/html/dartium/html_dartium.darttemplate
index 24323cb..9c7b733 100644
--- a/tools/dom/templates/html/dartium/html_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/html_dartium.darttemplate
@@ -46,9 +46,7 @@
 part '$AUXILIARY_DIR/WrappedEvent.dart';
 part '$AUXILIARY_DIR/WrappedList.dart';
 part '$AUXILIARY_DIR/_HttpRequestUtils.dart';
-part '$AUXILIARY_DIR/shared_FactoryProviders.dart';
 part '$AUXILIARY_DIR/dartium_KeyEvent.dart';
-part '$AUXILIARY_DIR/dartium_FactoryProviders.dart';
 part '$AUXILIARY_DIR/dartium_Platform.dart';
 part '$AUXILIARY_DIR/Isolates.dart';
 part '$AUXILIARY_DIR/Microtask.dart';
diff --git a/tools/dom/templates/html/impl/impl_CSSStyleDeclaration.darttemplate b/tools/dom/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
index 90fb83a..bab80c9 100644
--- a/tools/dom/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
+++ b/tools/dom/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
@@ -5,9 +5,13 @@
 part of $LIBRARYNAME;
 
 $(ANNOTATIONS)class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
-  factory $CLASSNAME() => _$(CLASSNAME)FactoryProvider.create$CLASSNAME();
-  factory $CLASSNAME.css(String css) =>
-      _$(CLASSNAME)FactoryProvider.create$(CLASSNAME)_css(css);
+  factory $CLASSNAME() => new CssStyleDeclaration.css('');
+
+  factory $CLASSNAME.css(String css) {
+    final style = new Element.tag('div').style;
+    style.cssText = css;
+    return style;
+  }
 
 $!MEMBERS
 
diff --git a/tools/dom/templates/html/impl/impl_DocumentFragment.darttemplate b/tools/dom/templates/html/impl/impl_DocumentFragment.darttemplate
index f591237..0f8a72b 100644
--- a/tools/dom/templates/html/impl/impl_DocumentFragment.darttemplate
+++ b/tools/dom/templates/html/impl/impl_DocumentFragment.darttemplate
@@ -5,13 +5,24 @@
 part of $LIBRARYNAME;
 
 $(ANNOTATIONS)class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
-  factory $CLASSNAME() => _$(CLASSNAME)FactoryProvider.createDocumentFragment();
+  factory $CLASSNAME() => document.createDocumentFragment();
 
-  factory $CLASSNAME.html(String html) =>
-      _$(CLASSNAME)FactoryProvider.createDocumentFragment_html(html);
+  factory $CLASSNAME.html(String html) {
+    final fragment = new DocumentFragment();
+    fragment.innerHtml = html;
+    return fragment;
+  }
 
-  factory $CLASSNAME.svg(String svgContent) =>
-      _$(CLASSNAME)FactoryProvider.createDocumentFragment_svg(svgContent);
+  factory $CLASSNAME.svg(String svgContent) {
+    final fragment = new DocumentFragment();
+    final e = new svg.SvgSvgElement();
+    e.innerHtml = svgContent;
+
+    // Copy list first since we don't want liveness during iteration.
+    final List nodes = new List.from(e.nodes);
+    fragment.nodes.addAll(nodes);
+    return fragment;
+  }
 
 $if DART2JS
   // Native field is used only by Dart code so does not lead to instantiation
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index 7b8a594..cea6c05 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -593,7 +593,7 @@
    * * [insertAdjacentElement]
    */
   void insertAdjacentHtml(String where, String html) {
-    if (JS('bool', '!!#.insertAdjacentHtml', this)) {
+    if (JS('bool', '!!#.insertAdjacentHTML', this)) {
       _insertAdjacentHtml(where, html);
     } else {
       _insertAdjacentNode(where, new DocumentFragment.html(html));
@@ -601,7 +601,7 @@
   }
 
   @JSName('insertAdjacentHTML')
-  void _insertAdjacentHTML(String where, String text) native;
+  void _insertAdjacentHtml(String where, String text) native;
 
   /**
    * Inserts [element] into the DOM at the specified location.
diff --git a/tools/dom/templates/html/impl/impl_Range.darttemplate b/tools/dom/templates/html/impl/impl_Range.darttemplate
index 1aebb9e..6f9c119 100644
--- a/tools/dom/templates/html/impl/impl_Range.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Range.darttemplate
@@ -8,7 +8,6 @@
 
 $(ANNOTATIONS)class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   factory $CLASSNAME() => document.$dom_createRange();
-
 $!MEMBERS
 
   /**
diff --git a/tools/dom/templates/html/impl/impl_ShadowRoot.darttemplate b/tools/dom/templates/html/impl/impl_ShadowRoot.darttemplate
index cb2e479..2cddda6 100644
--- a/tools/dom/templates/html/impl/impl_ShadowRoot.darttemplate
+++ b/tools/dom/templates/html/impl/impl_ShadowRoot.darttemplate
@@ -12,6 +12,6 @@
   static bool get supported =>
       JS('bool', '!!(Element.prototype.webkitCreateShadowRoot)');
 $else
-  static bool get supported => _Utils.shadowRootSupported(window.document);
+  static final bool supported = true;
 $endif
 }
diff --git a/tools/dom/templates/html/impl/impl_Text.darttemplate b/tools/dom/templates/html/impl/impl_Text.darttemplate
index 05d0be7..2675d8b 100644
--- a/tools/dom/templates/html/impl/impl_Text.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Text.darttemplate
@@ -7,7 +7,7 @@
 part of $LIBRARYNAME;
 
 $(ANNOTATIONS)class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
-  factory $CLASSNAME(String data) => _$(CLASSNAME)FactoryProvider.create$CLASSNAME(data);
+  factory $CLASSNAME(String data) => document.$dom_createTextNode(data);
 $!MEMBERS
 
 $if DART2JS
diff --git a/tools/dom/templates/html/impl/impl_Window.darttemplate b/tools/dom/templates/html/impl/impl_Window.darttemplate
index cce9a48..62779ca 100644
--- a/tools/dom/templates/html/impl/impl_Window.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Window.darttemplate
@@ -301,8 +301,8 @@
 $if DART2JS
     // FF and IE use the value as the return value, Chrome will return this from
     // the event callback function.
-    if (JS('bool', '("returnValue" in #)', _base)) {
-      JS('void', '#.returnValue = #', _base, value);
+    if (JS('bool', '("returnValue" in #)', wrapped)) {
+      JS('void', '#.returnValue = #', wrapped, value);
     }
 $endif
   }
diff --git a/tools/gyp/configurations_make.gypi b/tools/gyp/configurations_make.gypi
index 05a3bad..adcbbdf 100644
--- a/tools/gyp/configurations_make.gypi
+++ b/tools/gyp/configurations_make.gypi
@@ -69,11 +69,18 @@
       },
 
       'Dart_mips_Base': {
-        'cflags': [
-          '-march=mips32r2',
-          '-mhard-float',
-          '-fno-strict-overflow',
-        ],
+        'target_conditions': [
+          ['_toolset=="target"', {
+            'cflags': [
+              '-march=mips32',
+              '-mhard-float',
+              '-fno-strict-overflow',
+            ],
+          }],
+          ['_toolset=="host"',{
+            'cflags': [ '-O3', '-m32', '-msse2' ],
+            'ldflags': [ '-m32' ],
+        }]]
       },
 
       'Dart_Debug': {
diff --git a/tools/testing/dart/status_expression.dart b/tools/testing/dart/status_expression.dart
index 8fae9e1..9579249 100644
--- a/tools/testing/dart/status_expression.dart
+++ b/tools/testing/dart/status_expression.dart
@@ -236,13 +236,13 @@
       scanner.advance();
       SetExpression value = parseSetExpression();
       if (scanner.current != Token.RIGHT_PAREN) {
-        throw new RuntimeError("Missing right parenthesis in expression");
+        throw new FormatException("Missing right parenthesis in expression");
       }
       scanner.advance();
       return value;
     }
     if (!new RegExp(r"^\w+$").hasMatch(scanner.current)) {
-      throw new RuntimeError(
+      throw new FormatException(
           "Expected identifier in expression, got ${scanner.current}");
     }
     SetExpression value = new SetConstant(scanner.current);
@@ -277,7 +277,7 @@
       scanner.advance();
       BooleanExpression value = parseBooleanExpression();
       if (scanner.current != Token.RIGHT_PAREN) {
-        throw new RuntimeError("Missing right parenthesis in expression");
+        throw new FormatException("Missing right parenthesis in expression");
       }
       scanner.advance();
       return value;
@@ -286,12 +286,12 @@
     // The only atomic booleans are of the form $variable == value or the
     // form $variable.
     if (scanner.current != Token.DOLLAR_SYMBOL) {
-      throw new RuntimeError(
+      throw new FormatException(
           "Expected \$ in expression, got ${scanner.current}");
     }
     scanner.advance();
     if (!new RegExp(r"^\w+$").hasMatch(scanner.current)) {
-      throw new RuntimeError(
+      throw new FormatException(
           "Expected identifier in expression, got ${scanner.current}");
     }
     TermVariable left = new TermVariable(scanner.current);
@@ -301,7 +301,7 @@
       bool negate = scanner.current == Token.NOT_EQUALS;
       scanner.advance();
       if (!new RegExp(r"^\w+$").hasMatch(scanner.current)) {
-        throw new RuntimeError(
+        throw new FormatException(
             "Expected identifier in expression, got ${scanner.current}");
       }
       TermConstant right = new TermConstant(scanner.current);
diff --git a/tools/testing/dart/test_options.dart b/tools/testing/dart/test_options.dart
index b04f731..ac83131 100644
--- a/tools/testing/dart/test_options.dart
+++ b/tools/testing/dart/test_options.dart
@@ -80,10 +80,11 @@
    dartc: Perform static analysis on Dart code by running dartc.
           (only valid with the following runtimes: none),
 
-   dartanalyzer: Perform static analysis on Dart code by running the analyzer.
+   dartanalyzer: Perform static analysis on Dart code by running the analyzer on Java.
+   dart2analyzer: Perform static analysis on Dart code by running the analyzer on Dart.
           (only valid with the following runtimes: none)''',
               ['-c', '--compiler'],
-              ['none', 'dart2dart', 'dart2js', 'dartc', 'dartanalyzer'],
+              ['none', 'dart2dart', 'dart2js', 'dartc', 'dartanalyzer', 'dart2analyzer'],
               'none'),
           // TODO(antonm): fix the option drt.
           new _TestOptionSpecification(
@@ -475,6 +476,7 @@
         break;
       case 'dartc':
       case 'dartanalyzer':
+      case 'dart2analyzer':
         validRuntimes = const ['none'];
         break;
       case 'none':
@@ -624,6 +626,7 @@
       switch (configuration['compiler']) {
         case 'dartc':
         case 'dartanalyzer':
+        case 'dart2analyzer':
           timeout *= 4;
           break;
         case 'dart2js':
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index 843bb8c..0546964 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -141,6 +141,7 @@
     switch (configuration['compiler']) {
       case 'dartc':
       case 'dartanalyzer':
+      case 'dart2analyzer':
         name = executablePath;
         break;
       case 'dart2js':
@@ -183,6 +184,8 @@
         return '$buildDir/analyzer/bin/dart_analyzer$suffix';
       case 'dartanalyzer':
         return 'sdk/bin/dartanalyzer_developer$suffix';
+      case 'dart2analyzer':
+        return 'sdk/bin/dart2analyzer_developer$suffix';
       default:
         throw "Unknown executable for: ${configuration['compiler']}";
     }
@@ -793,6 +796,7 @@
     case 'none':
     case 'dartc':
     case 'dartanalyzer':
+    case 'dart2analyzer':
       var arguments = new List.from(vmOptions);
       arguments.addAll(args);
       return <Command>[new Command(dartShellFileName, arguments)];
@@ -1010,7 +1014,15 @@
 
         List<String> args = <String>[];
 
-        if (TestUtils.usesWebDriver(runtime)) {
+        if (configuration['use_browser_controller']) {
+          // This command is not actually run, it is used for reproducing
+          // the failure.
+          args = ['tools/testing/dart/launch_browser.dart',
+                  runtime,
+                  fullHtmlPath];
+          commandSet.add(new Command(TestUtils.dartTestExecutable.toString(),
+                                     args));
+        } else if (TestUtils.usesWebDriver(runtime)) {
           args = [
               dartDir.append('tools/testing/run_selenium.py').toNativePath(),
               '--browser=$runtime',
@@ -1169,6 +1181,7 @@
         return 'application/dart';
       case 'dart2js':
       case 'dartanalyzer':
+      case 'dart2analyzer':
       case 'dartc':
         return 'text/javascript';
       default:
@@ -1845,7 +1858,7 @@
       const ['d8', 'jsshell'].contains(runtime);
 
   static bool isCommandLineAnalyzer(String compiler) =>
-      compiler == 'dartc' || compiler == 'dartanalyzer';
+      compiler == 'dartc' || compiler == 'dartanalyzer' || compiler == 'dart2analyzer';
 
   static String buildDir(Map configuration) {
     // FIXME(kustermann,ricow): Our code assumes that the returned 'buildDir'