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'
