Version 0.5.13.1 .

svn merge -c 23515 https://dart.googlecode.com/svn/branches/bleeding_edge/dart dart

R=scheglov@google.com

Review URL: https://codereview.chromium.org//16337007

git-svn-id: http://dart.googlecode.com/svn/trunk@23552 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/pkg/analyzer_experimental/lib/src/generated/ast.dart b/pkg/analyzer_experimental/lib/src/generated/ast.dart
index 044f2fb..4b50d80 100644
--- a/pkg/analyzer_experimental/lib/src/generated/ast.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/ast.dart
@@ -13,33 +13,39 @@
 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.
@@ -52,11 +58,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
@@ -65,11 +73,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
@@ -82,6 +92,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.
@@ -95,6 +106,7 @@
     }
     return beginToken.offset;
   }
+  
   /**
    * Return this node's parent node, or {@code null} if this node is the root of an AST structure.
    * <p>
@@ -103,6 +115,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.
@@ -114,6 +127,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)).
@@ -128,6 +142,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
@@ -135,6 +150,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
@@ -155,6 +171,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.
@@ -166,12 +183,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
@@ -184,6 +203,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
@@ -194,6 +214,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
@@ -204,6 +225,7 @@
   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.
@@ -312,6 +334,7 @@
   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).
@@ -324,10 +347,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
@@ -336,6 +361,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
@@ -344,6 +370,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
@@ -352,22 +379,31 @@
   void visitChildren(ASTVisitor<Object> visitor) {
     _strings.accept(visitor);
   }
+  void appendStringValue(JavaStringBuilder builder) {
+    for (StringLiteral stringLiteral in strings) {
+      stringLiteral.appendStringValue(builder);
+    }
+  }
 }
+
 /**
  * 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
@@ -378,6 +414,7 @@
     this._comment = becomeParentOf(comment);
     this._metadata.addAll(metadata);
   }
+  
   /**
    * Initialize a newly created node.
    * @param comment the documentation comment associated with this node
@@ -401,17 +438,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
@@ -419,6 +459,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
@@ -437,11 +478,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
@@ -453,6 +496,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.
@@ -468,6 +512,7 @@
     return children;
   }
 }
+
 /**
  * Instances of the class {@code Annotation} represent an annotation that can be associated with an
  * AST node.
@@ -480,30 +525,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
@@ -523,6 +574,7 @@
     this._constructorName = becomeParentOf(constructorName);
     this._arguments = becomeParentOf(arguments);
   }
+  
   /**
    * Initialize a newly created annotation.
    * @param atSign the at sign that introduced the annotation
@@ -537,24 +589,41 @@
    */
   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.
+   * @return the element associated with this annotation
+   */
+  Element get element {
+    if (_constructorName != null) {
+      return _constructorName.element;
+    } else if (_name != null) {
+      return _name.element;
+    }
+    return null;
+  }
   Token get endToken {
     if (_arguments != null) {
       return _arguments.endToken;
@@ -563,18 +632,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
@@ -582,6 +654,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
@@ -589,6 +662,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
@@ -596,6 +670,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.
@@ -604,6 +679,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
@@ -617,6 +693,7 @@
     safelyVisitChild(_arguments, visitor);
   }
 }
+
 /**
  * Instances of the class {@code ArgumentDefinitionTest} represent an argument definition test.
  * <pre>
@@ -625,14 +702,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
@@ -642,6 +722,7 @@
     this._question = question;
     this._identifier = becomeParentOf(identifier);
   }
+  
   /**
    * Initialize a newly created argument definition test.
    * @param question the token representing the question mark
@@ -651,16 +732,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
@@ -668,6 +752,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
@@ -679,6 +764,7 @@
     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.
@@ -691,18 +777,22 @@
  * @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
@@ -711,6 +801,7 @@
    * formal parameter.
    */
   List<ParameterElement> _correspondingParameters;
+  
   /**
    * Initialize a newly created list of arguments.
    * @param leftParenthesis the left parenthesis
@@ -723,6 +814,7 @@
     this._arguments.addAll(arguments);
     this._rightParenthesis = rightParenthesis;
   }
+  
   /**
    * Initialize a newly created list of arguments.
    * @param leftParenthesis the left parenthesis
@@ -731,6 +823,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
@@ -740,16 +833,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
@@ -763,6 +859,7 @@
     }
     _correspondingParameters = parameters;
   }
+  
   /**
    * Set the left parenthesis to the given token.
    * @param parenthesis the left parenthesis
@@ -770,6 +867,7 @@
   void set leftParenthesis(Token parenthesis) {
     _leftParenthesis = parenthesis;
   }
+  
   /**
    * Set the right parenthesis to the given token.
    * @param parenthesis the right parenthesis
@@ -780,6 +878,7 @@
   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
@@ -802,6 +901,7 @@
     return _correspondingParameters[index];
   }
 }
+
 /**
  * Instances of the class {@code AsExpression} represent an 'as' expression.
  * <pre>
@@ -809,18 +909,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
@@ -832,6 +936,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
@@ -840,6 +945,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
@@ -847,16 +953,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
@@ -864,6 +973,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
@@ -871,6 +981,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
@@ -883,6 +994,7 @@
     safelyVisitChild(_type, visitor);
   }
 }
+
 /**
  * Instances of the class {@code AssertStatement} represent an assert statement.
  * <pre>
@@ -892,26 +1004,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
@@ -927,6 +1045,7 @@
     this._rightParenthesis = rightParenthesis;
     this._semicolon = semicolon;
   }
+  
   /**
    * Initialize a newly created assert statement.
    * @param keyword the token representing the 'assert' keyword
@@ -938,32 +1057,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}
@@ -971,6 +1096,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
@@ -978,6 +1104,7 @@
   void set keyword(Token keyword2) {
     this._keyword = keyword2;
   }
+  
   /**
    * Set the left parenthesis to the given token.
    * @param the left parenthesis
@@ -985,6 +1112,7 @@
   void set leftParenthesis(Token leftParenthesis2) {
     this._leftParenthesis = leftParenthesis2;
   }
+  
   /**
    * Set the right parenthesis to the given token.
    * @param rightParenthesis the right parenthesis
@@ -992,6 +1120,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
@@ -1003,6 +1132,7 @@
     safelyVisitChild(_condition, visitor);
   }
 }
+
 /**
  * Instances of the class {@code AssignmentExpression} represent an assignment expression.
  * <pre>
@@ -1010,23 +1140,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, 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.
+   * 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 _element;
+  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
@@ -1038,6 +1179,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
@@ -1047,37 +1189,53 @@
   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, 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. One example of the latter case is an operator that is not defined for the type of the
-   * left-hand operand.
+   * 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
+   * not a compound operator, 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 left-hand operand.
    * @return the element associated with the operator
    */
-  MethodElement get element => _element;
+  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;
+  
   /**
-   * Set the element associated with the operator to the given element.
-   * @param element the element associated with the operator
+   * 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
+   * operator, 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 left-hand operand.
+   * @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.
+   * @param element the element to be associated with the operator
    */
   void set element(MethodElement element2) {
-    this._element = element2;
+    _propagatedElement = element2;
   }
+  
   /**
    * Return the expression used to compute the left hand side.
    * @param expression the expression used to compute the left hand side
@@ -1085,6 +1243,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
@@ -1092,6 +1251,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
@@ -1099,11 +1259,21 @@
   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.
+   * @param element the static element to be associated with the operator
+   */
+  void set staticElement(MethodElement element) {
+    _staticElement = element;
+  }
   void visitChildren(ASTVisitor<Object> visitor) {
     safelyVisitChild(_leftHandSide, visitor);
     safelyVisitChild(_rightHandSide, visitor);
   }
 }
+
 /**
  * Instances of the class {@code BinaryExpression} represent a binary (infix) expression.
  * <pre>
@@ -1111,23 +1281,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, 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.
+   * 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 _element;
+  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
@@ -1139,6 +1320,7 @@
     this._operator = operator;
     this._rightOperand = becomeParentOf(rightOperand);
   }
+  
   /**
    * Initialize a newly created binary expression.
    * @param leftOperand the expression used to compute the left operand
@@ -1148,37 +1330,53 @@
   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, 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 not defined for the type of the left-hand
-   * operand.
+   * 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
+   * user definable, 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 left-hand operand.
    * @return the element associated with the operator
    */
-  MethodElement get element => _element;
+  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;
+  
   /**
-   * Set the element associated with the operator to the given element.
-   * @param element the element associated with the operator
+   * 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
+   * definable, 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 left operand.
+   * @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.
+   * @param element the element to be associated with the operator
    */
   void set element(MethodElement element2) {
-    this._element = 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
@@ -1186,6 +1384,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
@@ -1193,6 +1392,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
@@ -1200,11 +1400,40 @@
   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.
+   * @param element the static element to be associated with the operator
+   */
+  void set staticElement(MethodElement element) {
+    _staticElement = element;
+  }
   void visitChildren(ASTVisitor<Object> visitor) {
     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}.
+   * <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 {
+    if (_propagatedElement == null) {
+      return null;
+    }
+    List<ParameterElement> parameters2 = _propagatedElement.parameters;
+    if (parameters2.length < 1) {
+      return null;
+    }
+    return parameters2[0];
+  }
 }
+
 /**
  * Instances of the class {@code Block} represent a sequence of statements.
  * <pre>
@@ -1214,18 +1443,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
@@ -1238,6 +1471,7 @@
     this._statements.addAll(statements);
     this._rightBracket = rightBracket;
   }
+  
   /**
    * Initialize a newly created block of code.
    * @param leftBracket the left curly bracket
@@ -1248,21 +1482,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
@@ -1270,6 +1508,7 @@
   void set leftBracket(Token leftBracket2) {
     this._leftBracket = leftBracket2;
   }
+  
   /**
    * Set the right curly bracket to the given token.
    * @param rightBracket the right curly bracket
@@ -1281,6 +1520,7 @@
     _statements.accept(visitor);
   }
 }
+
 /**
  * Instances of the class {@code BlockFunctionBody} represent a function body that consists of a
  * block of statements.
@@ -1289,10 +1529,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
@@ -1300,6 +1542,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
@@ -1307,12 +1550,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
@@ -1324,6 +1569,7 @@
     safelyVisitChild(_block, visitor);
   }
 }
+
 /**
  * Instances of the class {@code BooleanLiteral} represent a boolean literal expression.
  * <pre>
@@ -1333,14 +1579,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
@@ -1350,6 +1599,7 @@
     this._literal = literal;
     this._value = value;
   }
+  
   /**
    * Initialize a newly created boolean literal.
    * @param literal the token representing the literal
@@ -1359,17 +1609,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
@@ -1377,6 +1630,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
@@ -1387,6 +1641,7 @@
   void visitChildren(ASTVisitor<Object> visitor) {
   }
 }
+
 /**
  * Instances of the class {@code BreakStatement} represent a break statement.
  * <pre>
@@ -1396,18 +1651,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
@@ -1419,6 +1678,7 @@
     this._label = becomeParentOf(label);
     this._semicolon = semicolon;
   }
+  
   /**
    * Initialize a newly created break statement.
    * @param keyword the token representing the 'break' keyword
@@ -1429,21 +1689,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
@@ -1451,6 +1715,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
@@ -1458,6 +1723,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
@@ -1469,6 +1735,7 @@
     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
@@ -1484,14 +1751,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
@@ -1502,6 +1772,7 @@
     this._target = becomeParentOf(target);
     this._cascadeSections.addAll(cascadeSections);
   }
+  
   /**
    * Initialize a newly created cascade expression.
    * @param target the target of the cascade sections
@@ -1510,17 +1781,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
@@ -1533,6 +1807,7 @@
     _cascadeSections.accept(visitor);
   }
 }
+
 /**
  * Instances of the class {@code CatchClause} represent a catch clause within a try statement.
  * <pre>
@@ -1543,43 +1818,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
@@ -1603,6 +1888,7 @@
     this._rightParenthesis = rightParenthesis;
     this._body = becomeParentOf(body);
   }
+  
   /**
    * Initialize a newly created catch clause.
    * @param onKeyword the token representing the 'on' keyword
@@ -1623,54 +1909,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
@@ -1678,6 +1974,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
@@ -1685,6 +1982,7 @@
   void set catchKeyword(Token catchKeyword2) {
     this._catchKeyword = catchKeyword2;
   }
+  
   /**
    * Set the comma to the given token.
    * @param comma the comma
@@ -1692,6 +1990,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
@@ -1699,6 +1998,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
@@ -1706,6 +2006,7 @@
   void set exceptionType(TypeName exceptionType2) {
     this._exceptionType = exceptionType2;
   }
+  
   /**
    * Set the left parenthesis to the given token.
    * @param parenthesis the left parenthesis
@@ -1713,6 +2014,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
@@ -1720,6 +2022,7 @@
   void set onKeyword(Token onKeyword2) {
     this._onKeyword = onKeyword2;
   }
+  
   /**
    * Set the right parenthesis to the given token.
    * @param parenthesis the right parenthesis
@@ -1727,6 +2030,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.
@@ -1743,6 +2047,7 @@
     safelyVisitChild(_body, visitor);
   }
 }
+
 /**
  * Instances of the class {@code ClassDeclaration} represent the declaration of a class.
  * <pre>
@@ -1754,48 +2059,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
@@ -1824,6 +2140,7 @@
     this._members.addAll(members);
     this._rightBracket = rightBracket;
   }
+  
   /**
    * Initialize a newly created class declaration.
    * @param comment the documentation comment associated with this class
@@ -1841,11 +2158,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
@@ -1853,49 +2172,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
@@ -1903,6 +2231,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
@@ -1910,6 +2239,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
@@ -1917,6 +2247,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
@@ -1924,6 +2255,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
@@ -1931,6 +2263,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
@@ -1938,6 +2271,7 @@
   void set name(SimpleIdentifier identifier) {
     _name = becomeParentOf(identifier);
   }
+  
   /**
    * Set the right curly bracket to the given token.
    * @param rightBracket the right curly bracket
@@ -1945,6 +2279,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
@@ -1952,6 +2287,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
@@ -1975,12 +2311,14 @@
     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
@@ -1988,6 +2326,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
@@ -1995,6 +2334,7 @@
    */
   ClassMember({Comment comment, List<Annotation> metadata}) : this.full(comment, metadata);
 }
+
 /**
  * Instances of the class {@code ClassTypeAlias} represent a class type alias.
  * <pre>
@@ -2004,36 +2344,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
@@ -2057,6 +2405,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
@@ -2073,6 +2422,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.
@@ -2080,37 +2430,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
@@ -2118,6 +2475,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
@@ -2125,6 +2483,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
@@ -2132,6 +2491,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
@@ -2139,6 +2499,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
@@ -2146,6 +2507,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
@@ -2153,6 +2515,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
@@ -2169,6 +2532,7 @@
     safelyVisitChild(_implementsClause, visitor);
   }
 }
+
 /**
  * Instances of the class {@code Combinator} represent the combinator associated with an import
  * directive.
@@ -2177,10 +2541,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
@@ -2189,6 +2555,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
@@ -2196,11 +2563,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.
@@ -2211,6 +2580,7 @@
     this._keyword = keyword2;
   }
 }
+
 /**
  * Instances of the class {@code Comment} represent a comment within the source code.
  * <pre>
@@ -2229,18 +2599,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
@@ -2248,25 +2621,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
@@ -2279,6 +2657,7 @@
     this._type = type;
     this._references.addAll(references);
   }
+  
   /**
    * Initialize a newly created comment.
    * @param tokens the tokens representing the comment
@@ -2289,26 +2668,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
@@ -2318,32 +2702,40 @@
     _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];
-  final String __name;
-  final int __ordinal;
-  int get ordinal => __ordinal;
-  CommentType(this.__name, this.__ordinal) {
+  
+  /// 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) {
   }
-  int compareTo(CommentType other) => __ordinal - other.__ordinal;
-  String toString() => __name;
+  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.
@@ -2354,14 +2746,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
@@ -2371,6 +2766,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
@@ -2380,16 +2776,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
@@ -2397,6 +2796,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
@@ -2408,6 +2808,7 @@
     safelyVisitChild(_identifier, visitor);
   }
 }
+
 /**
  * Instances of the class {@code CompilationUnit} represent a compilation unit.
  * <p>
@@ -2422,45 +2823,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
@@ -2478,6 +2889,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
@@ -2489,16 +2901,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.
@@ -2506,6 +2921,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}.
@@ -2533,17 +2949,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}.
@@ -2551,12 +2970,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
@@ -2564,6 +2985,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
@@ -2571,6 +2993,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
@@ -2579,6 +3002,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
@@ -2587,6 +3011,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
@@ -2605,6 +3030,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
@@ -2617,6 +3043,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.
@@ -2632,6 +3059,7 @@
     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.
@@ -2640,6 +3068,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
@@ -2647,6 +3076,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
@@ -2654,6 +3084,7 @@
    */
   CompilationUnitMember({Comment comment, List<Annotation> metadata}) : this.full(comment, metadata);
 }
+
 /**
  * Instances of the class {@code ConditionalExpression} represent a conditional expression.
  * <pre>
@@ -2661,26 +3092,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
@@ -2696,6 +3133,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
@@ -2707,32 +3145,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
@@ -2740,6 +3184,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.
@@ -2748,6 +3193,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.
@@ -2756,6 +3202,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
@@ -2763,6 +3210,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.
@@ -2777,6 +3225,7 @@
     safelyVisitChild(_elseExpression, visitor);
   }
 }
+
 /**
  * Instances of the class {@code ConstructorDeclaration} represent a constructor declaration.
  * <pre>
@@ -2795,61 +3244,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
@@ -2881,6 +3343,7 @@
     this._redirectedConstructor = becomeParentOf(redirectedConstructor);
     this._body = becomeParentOf(body);
   }
+  
   /**
    * Initialize a newly created constructor declaration.
    * @param externalKeyword the token for the 'external' keyword
@@ -2900,11 +3363,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
@@ -2919,44 +3384,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
@@ -2964,11 +3437,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
@@ -2976,6 +3451,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
@@ -2983,6 +3459,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
@@ -2990,6 +3467,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
@@ -2997,6 +3475,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
@@ -3004,6 +3483,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
@@ -3011,6 +3491,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
@@ -3018,6 +3499,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
@@ -3025,6 +3507,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.
@@ -3034,6 +3517,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
@@ -3041,6 +3525,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
@@ -3064,6 +3549,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}.
@@ -3081,6 +3567,7 @@
     return leftMost;
   }
 }
+
 /**
  * Instances of the class {@code ConstructorFieldInitializer} represent the initialization of a
  * field within a constructor's initialization list.
@@ -3090,27 +3577,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.
@@ -3127,6 +3620,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.
@@ -3145,32 +3639,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
@@ -3178,6 +3678,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.
@@ -3186,6 +3687,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
@@ -3193,6 +3695,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
@@ -3200,6 +3703,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
@@ -3212,6 +3716,7 @@
     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.
@@ -3221,6 +3726,7 @@
  */
 abstract class ConstructorInitializer extends ASTNode {
 }
+
 /**
  * Instances of the class {@code ConstructorName} represent the name of the constructor.
  * <pre>
@@ -3230,25 +3736,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, or {@code null} if the AST structure has not
-   * been resolved or if this constructor name could not be resolved.
+   * 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 _element;
+  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
@@ -3260,6 +3777,7 @@
     this._period = period;
     this._name = becomeParentOf(name);
   }
+  
   /**
    * Initialize a newly created constructor name.
    * @param type the name of the type defining the constructor
@@ -3269,42 +3787,57 @@
   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, 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 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.
    * @return the element associated with this constructor name
    */
-  ConstructorElement get element => _element;
+  ConstructorElement get element => _propagatedElement;
   Token get endToken {
     if (_name != null) {
       return _name.endToken;
     }
     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 to the given element.
-   * @param element the element associated with this constructor name
+   * Set the element associated with this constructor name based on propagated type information to
+   * the given element.
+   * @param element the element to be associated with this constructor name
    */
   void set element(ConstructorElement element2) {
-    this._element = element2;
+    _propagatedElement = element2;
   }
+  
   /**
    * Set the name of the constructor to the given name.
    * @param name the name of the constructor
@@ -3312,6 +3845,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
@@ -3319,6 +3853,16 @@
   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.
+   * @param element the element to be associated with this constructor name
+   */
+  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
@@ -3331,6 +3875,7 @@
     safelyVisitChild(_name, visitor);
   }
 }
+
 /**
  * Instances of the class {@code ContinueStatement} represent a continue statement.
  * <pre>
@@ -3340,18 +3885,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
@@ -3363,6 +3912,7 @@
     this._label = becomeParentOf(label);
     this._semicolon = semicolon;
   }
+  
   /**
    * Initialize a newly created continue statement.
    * @param keyword the token representing the 'continue' keyword
@@ -3373,21 +3923,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
@@ -3395,6 +3949,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
@@ -3402,6 +3957,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
@@ -3413,12 +3969,14 @@
     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
@@ -3426,12 +3984,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.
@@ -3439,6 +3999,7 @@
    */
   Element get element;
 }
+
 /**
  * Instances of the class {@code DeclaredIdentifier} represent the declaration of a single
  * identifier.
@@ -3448,20 +4009,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
@@ -3475,6 +4040,7 @@
     this._type = becomeParentOf(type);
     this._identifier = becomeParentOf(identifier);
   }
+  
   /**
    * Initialize a newly created formal parameter.
    * @param comment the documentation comment associated with this parameter
@@ -3493,27 +4059,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
@@ -3521,6 +4092,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
@@ -3528,6 +4100,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
@@ -3549,6 +4122,7 @@
     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
@@ -3560,24 +4134,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
@@ -3591,6 +4170,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
@@ -3601,6 +4181,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.
@@ -3615,22 +4196,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
@@ -3638,6 +4223,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
@@ -3645,6 +4231,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
@@ -3652,6 +4239,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
@@ -3659,6 +4247,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
@@ -3671,6 +4260,7 @@
     safelyVisitChild(_defaultValue, visitor);
   }
 }
+
 /**
  * The abstract class {@code Directive} defines the behavior common to nodes that represent a
  * directive.
@@ -3679,11 +4269,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
@@ -3691,12 +4283,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
@@ -3704,12 +4298,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
@@ -3718,6 +4314,7 @@
     this._element = element2;
   }
 }
+
 /**
  * Instances of the class {@code DoStatement} represent a do statement.
  * <pre>
@@ -3727,34 +4324,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
@@ -3774,6 +4379,7 @@
     this._rightParenthesis = rightParenthesis;
     this._semicolon = semicolon;
   }
+  
   /**
    * Initialize a newly created do loop.
    * @param doKeyword the token representing the 'do' keyword
@@ -3787,42 +4393,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
@@ -3830,6 +4444,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
@@ -3837,6 +4452,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
@@ -3844,6 +4460,7 @@
   void set doKeyword(Token doKeyword2) {
     this._doKeyword = doKeyword2;
   }
+  
   /**
    * Set the left parenthesis to the given token.
    * @param parenthesis the left parenthesis
@@ -3851,6 +4468,7 @@
   void set leftParenthesis(Token parenthesis) {
     _leftParenthesis = parenthesis;
   }
+  
   /**
    * Set the right parenthesis to the given token.
    * @param parenthesis the right parenthesis
@@ -3858,6 +4476,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
@@ -3865,6 +4484,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
@@ -3877,6 +4497,7 @@
     safelyVisitChild(_condition, visitor);
   }
 }
+
 /**
  * Instances of the class {@code DoubleLiteral} represent a floating point literal expression.
  * <pre>
@@ -3889,14 +4510,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
@@ -3906,6 +4530,7 @@
     this._literal = literal;
     this._value = value;
   }
+  
   /**
    * Initialize a newly created floating point literal.
    * @param literal the token representing the literal
@@ -3915,16 +4540,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
@@ -3932,6 +4560,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
@@ -3942,6 +4571,7 @@
   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.
@@ -3952,10 +4582,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
@@ -3963,6 +4595,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
@@ -3971,11 +4604,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.
@@ -3987,6 +4622,7 @@
   void visitChildren(ASTVisitor<Object> visitor) {
   }
 }
+
 /**
  * Instances of the class {@code EmptyStatement} represent an empty statement.
  * <pre>
@@ -3996,10 +4632,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
@@ -4007,6 +4645,7 @@
   EmptyStatement.full(Token semicolon) {
     this._semicolon = semicolon;
   }
+  
   /**
    * Initialize a newly created empty statement.
    * @param semicolon the semicolon terminating the statement
@@ -4015,11 +4654,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
@@ -4030,6 +4671,7 @@
   void visitChildren(ASTVisitor<Object> visitor) {
   }
 }
+
 /**
  * Ephemeral identifiers are created as needed to mimic the presence of an empty identifier.
  * @coverage dart.engine.ast
@@ -4040,6 +4682,7 @@
   }
   EphemeralIdentifier({ASTNode parent, int location}) : this.full(parent, location);
 }
+
 /**
  * Instances of the class {@code ExportDirective} represent an export directive.
  * <pre>
@@ -4048,6 +4691,7 @@
  * @coverage dart.engine.ast
  */
 class ExportDirective extends NamespaceDirective {
+  
   /**
    * Initialize a newly created export directive.
    * @param comment the documentation comment associated with this directive
@@ -4059,6 +4703,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
@@ -4070,11 +4715,19 @@
    */
   ExportDirective({Comment comment, List<Annotation> metadata, Token keyword, StringLiteral libraryUri, List<Combinator> combinators, Token semicolon}) : this.full(comment, metadata, keyword, libraryUri, combinators, semicolon);
   accept(ASTVisitor visitor) => visitor.visitExportDirective(this);
+  LibraryElement get uriElement {
+    Element element2 = element;
+    if (element2 is ExportElement) {
+      return ((element2 as ExportElement)).exportedLibrary;
+    }
+    return null;
+  }
   void visitChildren(ASTVisitor<Object> visitor) {
     super.visitChildren(visitor);
     combinators.accept(visitor);
   }
 }
+
 /**
  * Instances of the class {@code Expression} defines the behavior common to nodes that represent an
  * expression.
@@ -4084,15 +4737,18 @@
  * @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
@@ -4106,25 +4762,41 @@
     if (parent2 is ArgumentList) {
       return ((parent2 as ArgumentList)).getParameterElementFor(this);
     }
+    if (parent2 is IndexExpression) {
+      IndexExpression indexExpression = parent2 as IndexExpression;
+      if (identical(indexExpression.index, this)) {
+        return indexExpression.parameterElementForIndex;
+      }
+    }
+    if (parent2 is BinaryExpression) {
+      BinaryExpression binaryExpression = parent2 as BinaryExpression;
+      if (identical(binaryExpression.rightOperand, this)) {
+        return binaryExpression.parameterElementForRightOperand;
+      }
+    }
     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;
+  
   /**
    * 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
@@ -4132,6 +4804,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
@@ -4140,6 +4813,7 @@
     this._staticType = staticType2;
   }
 }
+
 /**
  * Instances of the class {@code ExpressionFunctionBody} represent a function body consisting of a
  * single expression.
@@ -4150,18 +4824,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
@@ -4174,6 +4852,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
@@ -4190,21 +4869,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
@@ -4212,6 +4895,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.
@@ -4220,6 +4904,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
@@ -4231,6 +4916,7 @@
     safelyVisitChild(_expression, visitor);
   }
 }
+
 /**
  * Instances of the class {@code ExpressionStatement} wrap an expression as a statement.
  * <pre>
@@ -4239,15 +4925,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
@@ -4257,6 +4946,7 @@
     this._expression = becomeParentOf(expression);
     this._semicolon = semicolon;
   }
+  
   /**
    * Initialize a newly created expression statement.
    * @param expression the expression that comprises the statement
@@ -4271,17 +4961,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
@@ -4289,6 +4982,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
@@ -4300,6 +4994,7 @@
     safelyVisitChild(_expression, visitor);
   }
 }
+
 /**
  * Instances of the class {@code ExtendsClause} represent the "extends" clause in a class
  * declaration.
@@ -4309,14 +5004,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
@@ -4326,6 +5024,7 @@
     this._keyword = keyword;
     this._superclass = becomeParentOf(superclass);
   }
+  
   /**
    * Initialize a newly created extends clause.
    * @param keyword the token representing the 'extends' keyword
@@ -4335,16 +5034,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
@@ -4352,6 +5054,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
@@ -4363,6 +5066,7 @@
     safelyVisitChild(_superclass, visitor);
   }
 }
+
 /**
  * Instances of the class {@code FieldDeclaration} represent the declaration of one or more fields
  * of the same type.
@@ -4373,18 +5077,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
@@ -4398,6 +5106,7 @@
     this._fieldList = becomeParentOf(fieldList);
     this._semicolon = semicolon;
   }
+  
   /**
    * Initialize a newly created field declaration.
    * @param comment the documentation comment associated with this field
@@ -4410,22 +5119,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
@@ -4433,6 +5152,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
@@ -4440,6 +5160,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
@@ -4458,6 +5179,7 @@
     return _fieldList.beginToken;
   }
 }
+
 /**
  * Instances of the class {@code FieldFormalParameter} represent a field formal parameter.
  * <pre>
@@ -4466,24 +5188,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
@@ -4500,6 +5227,7 @@
     this._thisToken = thisToken;
     this._period = period;
   }
+  
   /**
    * Initialize a newly created formal parameter.
    * @param comment the documentation comment associated with this parameter
@@ -4521,21 +5249,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.
@@ -4544,6 +5276,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
@@ -4551,6 +5284,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
@@ -4558,6 +5292,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
@@ -4565,6 +5300,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
@@ -4578,6 +5314,7 @@
     safelyVisitChild(identifier, visitor);
   }
 }
+
 /**
  * Instances of the class {@code ForEachStatement} represent a for-each statement.
  * <pre>
@@ -4586,34 +5323,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
@@ -4632,6 +5377,7 @@
     this._rightParenthesis = rightParenthesis;
     this._body = becomeParentOf(body);
   }
+  
   /**
    * Initialize a newly created for-each statement.
    * @param forKeyword the token representing the 'for' keyword
@@ -4644,42 +5390,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
@@ -4687,6 +5441,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
@@ -4694,6 +5449,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
@@ -4701,6 +5457,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
@@ -4708,6 +5465,7 @@
   void set iterator(Expression expression) {
     _iterator = becomeParentOf(expression);
   }
+  
   /**
    * Set the left parenthesis to the given token.
    * @param leftParenthesis the left parenthesis
@@ -4715,6 +5473,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
@@ -4722,6 +5481,7 @@
   void set loopVariable(DeclaredIdentifier variable) {
     _loopVariable = becomeParentOf(variable);
   }
+  
   /**
    * Set the right parenthesis to the given token.
    * @param rightParenthesis the right parenthesis
@@ -4735,6 +5495,7 @@
     safelyVisitChild(_body, visitor);
   }
 }
+
 /**
  * Instances of the class {@code ForStatement} represent a for statement.
  * <pre>
@@ -4746,50 +5507,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
@@ -4816,6 +5588,7 @@
     this._rightParenthesis = rightParenthesis;
     this._body = becomeParentOf(body);
   }
+  
   /**
    * Initialize a newly created for statement.
    * @param forKeyword the token representing the 'for' keyword
@@ -4832,57 +5605,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
@@ -4890,6 +5674,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
@@ -4897,6 +5682,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
@@ -4904,6 +5690,7 @@
   void set forKeyword(Token forKeyword2) {
     this._forKeyword = forKeyword2;
   }
+  
   /**
    * Set the initialization expression to the given expression.
    * @param initialization the initialization expression
@@ -4911,6 +5698,7 @@
   void set initialization(Expression initialization2) {
     this._initialization = becomeParentOf(initialization2);
   }
+  
   /**
    * Set the left parenthesis to the given token.
    * @param leftParenthesis the left parenthesis
@@ -4918,6 +5706,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
@@ -4925,6 +5714,7 @@
   void set leftSeparator(Token leftSeparator2) {
     this._leftSeparator = leftSeparator2;
   }
+  
   /**
    * Set the right parenthesis to the given token.
    * @param rightParenthesis the right parenthesis
@@ -4932,6 +5722,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
@@ -4939,6 +5730,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
@@ -4954,6 +5746,7 @@
     safelyVisitChild(_body, visitor);
   }
 }
+
 /**
  * The abstract class {@code FormalParameter} defines the behavior of objects representing a
  * parameter to a function.
@@ -4962,6 +5755,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.
@@ -4974,17 +5768,20 @@
     }
     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.
@@ -5010,26 +5807,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
@@ -5046,6 +5849,7 @@
     this._rightDelimiter = rightDelimiter;
     this._rightParenthesis = rightParenthesis;
   }
+  
   /**
    * Initialize a newly created parameter list.
    * @param leftParenthesis the left parenthesis
@@ -5057,6 +5861,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.
@@ -5071,6 +5876,7 @@
     return types;
   }
   Token get endToken => _rightParenthesis;
+  
   /**
    * Return the left square bracket ('\[') or left curly brace ('{') introducing the optional
    * parameters.
@@ -5078,16 +5884,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.
@@ -5095,11 +5904,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.
@@ -5108,6 +5919,7 @@
   void set leftDelimiter(Token bracket) {
     _leftDelimiter = bracket;
   }
+  
   /**
    * Set the left parenthesis to the given token.
    * @param parenthesis the left parenthesis
@@ -5115,6 +5927,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.
@@ -5123,6 +5936,7 @@
   void set rightDelimiter(Token bracket) {
     _rightDelimiter = bracket;
   }
+  
   /**
    * Set the right parenthesis to the given token.
    * @param parenthesis the right parenthesis
@@ -5134,6 +5948,7 @@
     _parameters.accept(visitor);
   }
 }
+
 /**
  * The abstract class {@code FunctionBody} defines the behavior common to objects representing the
  * body of a function or method.
@@ -5143,6 +5958,7 @@
  */
 abstract class FunctionBody extends ASTNode {
 }
+
 /**
  * Instances of the class {@code FunctionDeclaration} wrap a {@link FunctionExpression function
  * expression} as a top-level declaration.
@@ -5153,28 +5969,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
@@ -5192,6 +6014,7 @@
     this._name = becomeParentOf(name);
     this._functionExpression = becomeParentOf(functionExpression);
   }
+  
   /**
    * Initialize a newly created function declaration.
    * @param comment the documentation comment associated with this function
@@ -5206,43 +6029,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
@@ -5250,6 +6081,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
@@ -5257,6 +6089,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
@@ -5264,6 +6097,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
@@ -5271,6 +6105,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
@@ -5298,15 +6133,18 @@
     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
@@ -5314,6 +6152,7 @@
   FunctionDeclarationStatement.full(FunctionDeclaration functionDeclaration) {
     this._functionDeclaration = becomeParentOf(functionDeclaration);
   }
+  
   /**
    * Initialize a newly created function declaration statement.
    * @param functionDeclaration the the function declaration being wrapped
@@ -5322,11 +6161,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
@@ -5338,6 +6179,7 @@
     safelyVisitChild(_functionDeclaration, visitor);
   }
 }
+
 /**
  * Instances of the class {@code FunctionExpression} represent a function expression.
  * <pre>
@@ -5345,19 +6187,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
@@ -5367,6 +6213,7 @@
     this._parameters = becomeParentOf(parameters);
     this._body = becomeParentOf(body);
   }
+  
   /**
    * Initialize a newly created function declaration.
    * @param parameters the parameters associated with the function
@@ -5382,11 +6229,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.
@@ -5401,11 +6250,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
@@ -5413,6 +6264,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
@@ -5420,6 +6272,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
@@ -5432,6 +6285,7 @@
     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
@@ -5442,19 +6296,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, or {@code null} if the AST structure
-   * has not been resolved or the function could not be resolved.
+   * 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 _element;
+  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
@@ -5464,6 +6326,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
@@ -5471,25 +6334,39 @@
    */
   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, or {@code null} if the AST
-   * structure has not been resolved or the function could not be resolved. One common example of
-   * the latter case is an expression whose value can change over time.
+   * 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
+   * not be resolved. One common example of the latter case is an expression whose value can change
+   * over time.
    * @return the element associated with the function being invoked
    */
-  ExecutableElement get element => _element;
+  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
+   * resolved. One common example of the latter case is an expression whose value can change over
+   * time.
+   * @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
@@ -5497,13 +6374,16 @@
   void set argumentList(ArgumentList argumentList2) {
     this._argumentList = becomeParentOf(argumentList2);
   }
+  
   /**
-   * Set the element associated with the function being invoked to the given element.
-   * @param element the element associated with the function being invoked
+   * Set the element associated with the function being invoked based on propagated type information
+   * to the given element.
+   * @param element the element to be associated with the function being invoked
    */
   void set element(ExecutableElement element2) {
-    this._element = element2;
+    _propagatedElement = element2;
   }
+  
   /**
    * Set the expression producing the function being invoked to the given expression.
    * @param function the expression producing the function being invoked
@@ -5511,11 +6391,21 @@
   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.
+   * @param element the element to be associated with the function
+   */
+  void set staticElement(ExecutableElement element) {
+    this._staticElement = element;
+  }
   void visitChildren(ASTVisitor<Object> visitor) {
     safelyVisitChild(_function, visitor);
     safelyVisitChild(_argumentList, visitor);
   }
 }
+
 /**
  * Instances of the class {@code FunctionTypeAlias} represent a function type alias.
  * <pre>
@@ -5525,24 +6415,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
@@ -5560,6 +6455,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
@@ -5574,28 +6470,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
@@ -5603,6 +6504,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
@@ -5610,6 +6512,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
@@ -5617,6 +6520,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
@@ -5632,6 +6536,7 @@
     safelyVisitChild(_parameters, visitor);
   }
 }
+
 /**
  * Instances of the class {@code FunctionTypedFormalParameter} represent a function-typed formal
  * parameter.
@@ -5640,14 +6545,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
@@ -5661,6 +6569,7 @@
     this._returnType = becomeParentOf(returnType);
     this._parameters = becomeParentOf(parameters);
   }
+  
   /**
    * Initialize a newly created formal parameter.
    * @param comment the documentation comment associated with this parameter
@@ -5679,11 +6588,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.
@@ -5692,6 +6603,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
@@ -5699,6 +6611,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
@@ -5713,6 +6626,7 @@
     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.
@@ -5723,10 +6637,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
@@ -5736,6 +6652,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
@@ -5744,6 +6661,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
@@ -5753,6 +6671,7 @@
     _hiddenNames.accept(visitor);
   }
 }
+
 /**
  * The abstract class {@code Identifier} defines the behavior common to nodes that represent an
  * identifier.
@@ -5761,6 +6680,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.
@@ -5768,20 +6688,31 @@
    * @return {@code true} if the given name is private
    */
   static bool isPrivateName(String name) => name.startsWith("_");
+  
   /**
-   * Return the element associated with this identifier, 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 in which it appears.
+   * 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
+   * in which it appears.
    * @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
+   * in which it appears
+   * @return the element associated with the operator
+   */
+  Element get staticElement;
   bool isAssignable() => true;
 }
+
 /**
  * Instances of the class {@code IfStatement} represent an if statement.
  * <pre>
@@ -5791,35 +6722,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
@@ -5839,6 +6778,7 @@
     this._elseKeyword = elseKeyword;
     this._elseStatement = becomeParentOf(elseStatement);
   }
+  
   /**
    * Initialize a newly created if statement.
    * @param ifKeyword the token representing the 'if' keyword
@@ -5852,16 +6792,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}
@@ -5873,26 +6816,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.
@@ -5901,6 +6849,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
@@ -5908,6 +6857,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.
@@ -5916,6 +6866,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
@@ -5923,6 +6874,7 @@
   void set ifKeyword(Token ifKeyword2) {
     this._ifKeyword = ifKeyword2;
   }
+  
   /**
    * Set the left parenthesis to the given token.
    * @param leftParenthesis the left parenthesis
@@ -5930,6 +6882,7 @@
   void set leftParenthesis(Token leftParenthesis2) {
     this._leftParenthesis = leftParenthesis2;
   }
+  
   /**
    * Set the right parenthesis to the given token.
    * @param rightParenthesis the right parenthesis
@@ -5937,6 +6890,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.
@@ -5951,6 +6905,7 @@
     safelyVisitChild(_elseStatement, visitor);
   }
 }
+
 /**
  * Instances of the class {@code ImplementsClause} represent the "implements" clause in an class
  * declaration.
@@ -5961,14 +6916,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
@@ -5979,6 +6937,7 @@
     this._keyword = keyword;
     this._interfaces.addAll(interfaces);
   }
+  
   /**
    * Initialize a newly created extends clause.
    * @param keyword the token representing the 'implements' keyword
@@ -5988,16 +6947,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
@@ -6009,6 +6971,7 @@
     _interfaces.accept(visitor);
   }
 }
+
 /**
  * Instances of the class {@code ImportDirective} represent an import directive.
  * <pre>
@@ -6017,15 +6980,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
@@ -6041,6 +7007,7 @@
     this._asToken = asToken;
     this._prefix = becomeParentOf(prefix);
   }
+  
   /**
    * Initialize a newly created import directive.
    * @param comment the documentation comment associated with this directive
@@ -6054,18 +7021,28 @@
    */
   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.
    * @return the prefix to be used with the imported names
    */
   SimpleIdentifier get prefix => _prefix;
+  LibraryElement get uriElement {
+    Element element2 = element;
+    if (element2 is ImportElement) {
+      return ((element2 as ImportElement)).importedLibrary;
+    }
+    return null;
+  }
+  
   /**
    * Set the token representing the 'as' token to the given token.
    * @param asToken the token representing the 'as' token
@@ -6073,6 +7050,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
@@ -6086,6 +7064,7 @@
     combinators.accept(visitor);
   }
 }
+
 /**
  * Instances of the class {@code IndexExpression} represent an index expression.
  * <pre>
@@ -6094,33 +7073,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, or {@code null} if the AST structure has not been
-   * resolved or if the operator could not be resolved.
+   * 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 _element;
+  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
@@ -6131,6 +7123,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
@@ -6145,6 +7138,7 @@
     this._index = becomeParentOf(index2);
     this._rightBracket = rightBracket2;
   }
+  
   /**
    * Initialize a newly created index expression.
    * @param period the period ("..") before a cascaded index expression
@@ -6155,6 +7149,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
@@ -6170,6 +7165,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.
@@ -6183,30 +7179,35 @@
     }
     return _period;
   }
+  
   /**
-   * Return the element associated with the operator, 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 left-hand operand.
+   * 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
+   * target.
    * @return the element associated with this operator
    */
-  MethodElement get element => _element;
+  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
@@ -6228,11 +7229,21 @@
     }
     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
+   * target.
+   * @return the element associated with the operator
+   */
+  MethodElement get staticElement => _staticElement;
+  
   /**
    * Return {@code true} if this expression is computing a right-hand value.
    * <p>
@@ -6250,6 +7261,7 @@
     }
     return true;
   }
+  
   /**
    * Return {@code true} if this expression is computing a left-hand value.
    * <p>
@@ -6270,12 +7282,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
@@ -6283,13 +7297,16 @@
   void set array(Expression expression) {
     _target = becomeParentOf(expression);
   }
+  
   /**
-   * Set the element associated with the operator to the given element.
-   * @param element the element associated with this operator
+   * Set the element associated with the operator based on the propagated type of the target to the
+   * given element.
+   * @param element the element to be associated with this operator
    */
   void set element(MethodElement element2) {
-    this._element = element2;
+    _propagatedElement = element2;
   }
+  
   /**
    * Set the expression used to compute the index to the given expression.
    * @param expression the expression used to compute the index
@@ -6297,6 +7314,7 @@
   void set index(Expression expression) {
     _index = becomeParentOf(expression);
   }
+  
   /**
    * Set the left square bracket to the given token.
    * @param bracket the left square bracket
@@ -6304,6 +7322,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
@@ -6311,6 +7330,7 @@
   void set period(Token period2) {
     this._period = period2;
   }
+  
   /**
    * Set the right square bracket to the given token.
    * @param bracket the right square bracket
@@ -6318,11 +7338,40 @@
   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.
+   * @param element the static element to be associated with the operator
+   */
+  void set staticElement(MethodElement element) {
+    _staticElement = element;
+  }
   void visitChildren(ASTVisitor<Object> visitor) {
     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}.
+   * <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 {
+    if (_propagatedElement == null) {
+      return null;
+    }
+    List<ParameterElement> parameters2 = _propagatedElement.parameters;
+    if (parameters2.length < 1) {
+      return null;
+    }
+    return parameters2[0];
+  }
 }
+
 /**
  * Instances of the class {@code InstanceCreationExpression} represent an instance creation
  * expression.
@@ -6332,23 +7381,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, or {@code null} if the AST structure has not been
-   * resolved or if the constructor could not be resolved.
+   * 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 _element;
+  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
@@ -6360,6 +7419,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
@@ -6368,34 +7428,47 @@
    */
   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, 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 based on propagated 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 element => _element;
+  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
@@ -6403,6 +7476,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
@@ -6410,13 +7484,16 @@
   void set constructorName(ConstructorName constructorName2) {
     this._constructorName = constructorName2;
   }
+  
   /**
-   * Set the element associated with the constructor to the given element.
-   * @param element the element associated with the constructor
+   * Set the element associated with the constructor based on propagated type information to the
+   * given element.
+   * @param element the element to be associated with the constructor
    */
   void set element(ConstructorElement element2) {
-    this._element = 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
@@ -6424,11 +7501,21 @@
   void set keyword(Token keyword2) {
     this._keyword = keyword2;
   }
+  
+  /**
+   * Set the element associated with the constructor based on static type information to the given
+   * element.
+   * @param element the element to be associated with the constructor
+   */
+  void set staticElement(ConstructorElement element) {
+    this._staticElement = element;
+  }
   void visitChildren(ASTVisitor<Object> visitor) {
     safelyVisitChild(_constructorName, visitor);
     safelyVisitChild(_argumentList, visitor);
   }
 }
+
 /**
  * Instances of the class {@code IntegerLiteral} represent an integer literal expression.
  * <pre>
@@ -6444,14 +7531,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
@@ -6461,6 +7551,7 @@
     this._literal = literal;
     this._value = value;
   }
+  
   /**
    * Initialize a newly created integer literal.
    * @param literal the token representing the literal
@@ -6470,16 +7561,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
@@ -6487,6 +7581,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
@@ -6497,6 +7592,7 @@
   void visitChildren(ASTVisitor<Object> visitor) {
   }
 }
+
 /**
  * The abstract class {@code InterpolationElement} defines the behavior common to elements within a{@link StringInterpolation string interpolation}.
  * <pre>
@@ -6505,6 +7601,7 @@
  */
 abstract class InterpolationElement extends ASTNode {
 }
+
 /**
  * Instances of the class {@code InterpolationExpression} represent an expression embedded in a
  * string interpolation.
@@ -6515,19 +7612,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
@@ -6539,6 +7640,7 @@
     this._expression = becomeParentOf(expression);
     this._rightBracket = rightBracket;
   }
+  
   /**
    * Initialize a newly created interpolation expression.
    * @param leftBracket the left curly bracket
@@ -6554,21 +7656,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.
@@ -6577,6 +7683,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
@@ -6584,6 +7691,7 @@
   void set leftBracket(Token leftBracket2) {
     this._leftBracket = leftBracket2;
   }
+  
   /**
    * Set the right curly bracket to the given token.
    * @param rightBracket the right curly bracket
@@ -6595,6 +7703,7 @@
     safelyVisitChild(_expression, visitor);
   }
 }
+
 /**
  * Instances of the class {@code InterpolationString} represent a non-empty substring of an
  * interpolated string.
@@ -6605,14 +7714,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
@@ -6622,6 +7734,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
@@ -6630,17 +7743,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
@@ -6648,6 +7764,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
@@ -6658,6 +7775,7 @@
   void visitChildren(ASTVisitor<Object> visitor) {
   }
 }
+
 /**
  * Instances of the class {@code IsExpression} represent an is expression.
  * <pre>
@@ -6665,22 +7783,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
@@ -6694,6 +7817,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
@@ -6705,26 +7829,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.
@@ -6733,6 +7862,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
@@ -6740,6 +7870,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
@@ -6747,6 +7878,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
@@ -6759,6 +7891,7 @@
     safelyVisitChild(_type, visitor);
   }
 }
+
 /**
  * Instances of the class {@code Label} represent a label.
  * <pre>
@@ -6767,14 +7900,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
@@ -6784,6 +7920,7 @@
     this._label = becomeParentOf(label);
     this._colon = colon;
   }
+  
   /**
    * Initialize a newly created label.
    * @param label the label being applied
@@ -6792,17 +7929,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
@@ -6810,6 +7950,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
@@ -6821,6 +7962,7 @@
     safelyVisitChild(_label, visitor);
   }
 }
+
 /**
  * Instances of the class {@code LabeledStatement} represent a statement that has a label associated
  * with them.
@@ -6829,14 +7971,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
@@ -6847,6 +7992,7 @@
     this._labels.addAll(labels);
     this._statement = becomeParentOf(statement);
   }
+  
   /**
    * Initialize a newly created labeled statement.
    * @param labels the labels being associated with the statement
@@ -6861,16 +8007,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
@@ -6883,6 +8032,7 @@
     safelyVisitChild(_statement, visitor);
   }
 }
+
 /**
  * Instances of the class {@code LibraryDirective} represent a library directive.
  * <pre>
@@ -6891,18 +8041,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
@@ -6916,6 +8070,7 @@
     this._name = becomeParentOf(name);
     this._semicolon = semicolon;
   }
+  
   /**
    * Initialize a newly created library directive.
    * @param comment the documentation comment associated with this directive
@@ -6928,21 +8083,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
@@ -6950,6 +8109,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
@@ -6957,6 +8117,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
@@ -6970,6 +8131,7 @@
   }
   Token get firstTokenAfterCommentAndMetadata => _libraryToken;
 }
+
 /**
  * Instances of the class {@code LibraryIdentifier} represent the identifier for a library.
  * <pre>
@@ -6978,10 +8140,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
@@ -6990,6 +8154,7 @@
     this._components = new NodeList<SimpleIdentifier>(this);
     this._components.addAll(components);
   }
+  
   /**
    * Initialize a newly created prefixed identifier.
    * @param components the components of the identifier
@@ -6997,6 +8162,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
@@ -7017,10 +8183,12 @@
     }
     return builder.toString();
   }
+  Element get staticElement => null;
   void visitChildren(ASTVisitor<Object> visitor) {
     _components.accept(visitor);
   }
 }
+
 /**
  * Instances of the class {@code ListLiteral} represent a list literal.
  * <pre>
@@ -7030,18 +8198,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
@@ -7057,6 +8229,7 @@
     this._elements.addAll(elements);
     this._rightBracket = rightBracket;
   }
+  
   /**
    * Initialize a newly created list literal.
    * @param modifier the const modifier associated with this literal
@@ -7079,22 +8252,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
@@ -7102,6 +8279,7 @@
   void set leftBracket(Token bracket) {
     _leftBracket = bracket;
   }
+  
   /**
    * Set the right square bracket to the given token.
    * @param bracket the right square bracket
@@ -7114,6 +8292,7 @@
     _elements.accept(visitor);
   }
 }
+
 /**
  * The abstract class {@code Literal} defines the behavior common to nodes that represent a literal
  * expression.
@@ -7123,6 +8302,7 @@
  */
 abstract class Literal extends Expression {
 }
+
 /**
  * Instances of the class {@code MapLiteral} represent a literal map.
  * <pre>
@@ -7132,18 +8312,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
@@ -7159,6 +8343,7 @@
     this._entries.addAll(entries);
     this._rightBracket = rightBracket;
   }
+  
   /**
    * Initialize a newly created map literal.
    * @param modifier the const modifier associated with this literal
@@ -7182,21 +8367,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
@@ -7204,6 +8393,7 @@
   void set leftBracket(Token bracket) {
     _leftBracket = bracket;
   }
+  
   /**
    * Set the right curly bracket to the given token.
    * @param bracket the right curly bracket
@@ -7216,69 +8406,81 @@
     _entries.accept(visitor);
   }
 }
+
 /**
  * Instances of the class {@code MapLiteralEntry} represent a single key/value pair in a map
  * literal.
  * <pre>
- * mapLiteralEntry ::={@link StringLiteral key} ':' {@link Expression value}</pre>
+ * mapLiteralEntry ::={@link Expression key} ':' {@link Expression value}</pre>
  * @coverage dart.engine.ast
  */
 class MapLiteralEntry extends ASTNode {
+  
   /**
-   * The key with which the value will be associated.
+   * The expression computing the key with which the value will be associated.
    */
-  StringLiteral _key;
+  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 key with which the value will be associated
+   * @param key the expression computing the key with which the value will be associated
    * @param separator the colon that separates the key from the value
    * @param value the expression computing the value that will be associated with the key
    */
-  MapLiteralEntry.full(StringLiteral key, Token separator, Expression value) {
+  MapLiteralEntry.full(Expression key, Token separator, Expression value) {
     this._key = becomeParentOf(key);
     this._separator = separator;
     this._value = becomeParentOf(value);
   }
+  
   /**
    * Initialize a newly created map literal entry.
-   * @param key the key with which the value will be associated
+   * @param key the expression computing the key with which the value will be associated
    * @param separator the colon that separates the key from the value
    * @param value the expression computing the value that will be associated with the key
    */
-  MapLiteralEntry({StringLiteral key, Token separator, Expression value}) : this.full(key, separator, value);
+  MapLiteralEntry({Expression key, Token separator, Expression value}) : this.full(key, separator, value);
   accept(ASTVisitor visitor) => visitor.visitMapLiteralEntry(this);
   Token get beginToken => _key.beginToken;
   Token get endToken => _value.endToken;
+  
   /**
-   * Return the key with which the value will be associated.
-   * @return the key with which the value will be associated
+   * 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
    */
-  StringLiteral get key => _key;
+  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 key with which the value will be associated to the given string.
-   * @param string the key with which the value will be associated
+   * Set the expression computing the key with which the value will be associated to the given
+   * string.
+   * @param string the expression computing the key with which the value will be associated
    */
-  void set key(StringLiteral string) {
+  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
@@ -7286,6 +8488,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.
@@ -7299,6 +8502,7 @@
     safelyVisitChild(_value, visitor);
   }
 }
+
 /**
  * Instances of the class {@code MethodDeclaration} represent a method declaration.
  * <pre>
@@ -7308,41 +8512,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
@@ -7367,6 +8580,7 @@
     this._parameters = becomeParentOf(parameters);
     this._body = becomeParentOf(body);
   }
+  
   /**
    * Initialize a newly created method declaration.
    * @param externalKeyword the token for the 'external' keyword
@@ -7383,11 +8597,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
@@ -7397,71 +8613,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
@@ -7469,6 +8698,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
@@ -7476,6 +8706,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
@@ -7483,6 +8714,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
@@ -7490,6 +8722,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
@@ -7497,6 +8730,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
@@ -7504,6 +8738,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
@@ -7511,6 +8746,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
@@ -7538,6 +8774,7 @@
     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
@@ -7548,24 +8785,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
@@ -7579,6 +8821,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
@@ -7588,6 +8831,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
@@ -7602,17 +8846,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
@@ -7634,6 +8881,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
@@ -7642,12 +8890,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
@@ -7655,6 +8905,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
@@ -7662,6 +8913,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
@@ -7669,6 +8921,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
@@ -7682,6 +8935,7 @@
     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.
@@ -7690,14 +8944,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
@@ -7707,6 +8964,7 @@
     this._name = becomeParentOf(name);
     this._expression = becomeParentOf(expression);
   }
+  
   /**
    * Initialize a newly created named expression.
    * @param name the name associated with the expression
@@ -7715,6 +8973,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.
@@ -7728,16 +8987,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
@@ -7745,6 +9007,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
@@ -7757,6 +9020,7 @@
     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.
@@ -7765,18 +9029,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
@@ -7792,6 +9060,7 @@
     this._combinators.addAll(combinators);
     this._semicolon = semicolon;
   }
+  
   /**
    * Initialize a newly created namespace directive.
    * @param comment the documentation comment associated with this directive
@@ -7802,6 +9071,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
@@ -7809,11 +9079,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
@@ -7821,6 +9094,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
@@ -7830,6 +9104,7 @@
   }
   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.
@@ -7840,18 +9115,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.
@@ -7864,6 +9143,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.
@@ -7875,16 +9155,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
@@ -7894,6 +9177,7 @@
     safelyVisitChild(_stringLiteral, visitor);
   }
 }
+
 /**
  * The abstract class {@code NormalFormalParameter} defines the behavior common to formal parameters
  * that are required (are not optional).
@@ -7902,19 +9186,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
@@ -7927,6 +9215,7 @@
     this._metadata.addAll(metadata);
     this._identifier = becomeParentOf(identifier);
   }
+  
   /**
    * Initialize a newly created formal parameter.
    * @param comment the documentation comment associated with this parameter
@@ -7934,6 +9223,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.
@@ -7948,16 +9238,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
@@ -7965,6 +9258,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
@@ -7972,6 +9266,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
@@ -7989,6 +9284,7 @@
       }
     }
   }
+  
   /**
    * Return {@code true} if the comment is lexically before any annotations.
    * @return {@code true} if the comment is lexically before any annotations
@@ -8000,6 +9296,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.
@@ -8015,6 +9312,7 @@
     return children;
   }
 }
+
 /**
  * Instances of the class {@code NullLiteral} represent a null literal expression.
  * <pre>
@@ -8024,10 +9322,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
@@ -8035,6 +9335,7 @@
   NullLiteral.full(Token token) {
     this._literal = token;
   }
+  
   /**
    * Initialize a newly created null literal.
    * @param token the token representing the literal
@@ -8043,11 +9344,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
@@ -8058,6 +9361,7 @@
   void visitChildren(ASTVisitor<Object> visitor) {
   }
 }
+
 /**
  * Instances of the class {@code ParenthesizedExpression} represent a parenthesized expression.
  * <pre>
@@ -8067,18 +9371,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
@@ -8090,6 +9398,7 @@
     this._expression = becomeParentOf(expression);
     this._rightParenthesis = rightParenthesis;
   }
+  
   /**
    * Initialize a newly created parenthesized expression.
    * @param leftParenthesis the left parenthesis
@@ -8100,21 +9409,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
@@ -8122,6 +9435,7 @@
   void set expression(Expression expression2) {
     this._expression = becomeParentOf(expression2);
   }
+  
   /**
    * Set the left parenthesis to the given token.
    * @param parenthesis the left parenthesis
@@ -8129,6 +9443,7 @@
   void set leftParenthesis(Token parenthesis) {
     _leftParenthesis = parenthesis;
   }
+  
   /**
    * Set the right parenthesis to the given token.
    * @param parenthesis the right parenthesis
@@ -8140,6 +9455,7 @@
     safelyVisitChild(_expression, visitor);
   }
 }
+
 /**
  * Instances of the class {@code PartDirective} represent a part directive.
  * <pre>
@@ -8148,14 +9464,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
@@ -8168,6 +9487,7 @@
     this._partToken = partToken;
     this._semicolon = semicolon;
   }
+  
   /**
    * Initialize a newly created part directive.
    * @param comment the documentation comment associated with this directive
@@ -8180,16 +9500,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
@@ -8197,6 +9521,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
@@ -8206,6 +9531,7 @@
   }
   Token get firstTokenAfterCommentAndMetadata => _partToken;
 }
+
 /**
  * Instances of the class {@code PartOfDirective} represent a part-of directive.
  * <pre>
@@ -8214,22 +9540,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
@@ -8245,6 +9576,7 @@
     this._libraryName = becomeParentOf(libraryName);
     this._semicolon = semicolon;
   }
+  
   /**
    * Initialize a newly created part-of directive.
    * @param comment the documentation comment associated with this directive
@@ -8258,26 +9590,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
@@ -8285,6 +9622,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
@@ -8292,6 +9630,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
@@ -8299,6 +9638,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
@@ -8312,6 +9652,7 @@
   }
   Token get firstTokenAfterCommentAndMetadata => _partToken;
 }
+
 /**
  * Instances of the class {@code PostfixExpression} represent a postfix unary expression.
  * <pre>
@@ -8319,19 +9660,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, 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.
+   * 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 _element;
+  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
@@ -8341,6 +9692,7 @@
     this._operand = becomeParentOf(operand);
     this._operator = operator;
   }
+  
   /**
    * Initialize a newly created postfix expression.
    * @param operand the expression computing the operand for the operator
@@ -8349,31 +9701,45 @@
   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, 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 not defined for the type of the operand.
+   * 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
+   * not defined for the type of the operand.
    * @return the element associated with the operator
    */
-  MethodElement get element => _element;
+  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;
+  
   /**
-   * Set the element associated with the operator to the given element.
-   * @param element the element associated with the 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
+   * not defined for the type of the operand.
+   * @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.
+   * @param element the element to be associated with the operator
    */
   void set element(MethodElement element2) {
-    this._element = 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
@@ -8381,6 +9747,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
@@ -8388,10 +9755,20 @@
   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.
+   * @param element the element to be associated with the operator
+   */
+  void set staticElement(MethodElement element) {
+    _staticElement = element;
+  }
   void visitChildren(ASTVisitor<Object> visitor) {
     safelyVisitChild(_operand, visitor);
   }
 }
+
 /**
  * Instances of the class {@code PrefixExpression} represent a prefix unary expression.
  * <pre>
@@ -8399,19 +9776,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, 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.
+   * 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 _element;
+  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
@@ -8421,6 +9808,7 @@
     this._operator = operator;
     this._operand = becomeParentOf(operand);
   }
+  
   /**
    * Initialize a newly created prefix expression.
    * @param operator the prefix operator being applied to the operand
@@ -8429,31 +9817,45 @@
   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, 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 not defined for the type of the operand.
+   * 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
+   * not defined for the type of the operand.
    * @return the element associated with the operator
    */
-  MethodElement get element => _element;
+  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;
+  
   /**
-   * Set the element associated with the operator to the given element.
-   * @param element the element associated with the 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
+   * not defined for the type of the operand.
+   * @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.
+   * @param element the element to be associated with the operator
    */
   void set element(MethodElement element2) {
-    this._element = 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
@@ -8461,6 +9863,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
@@ -8468,10 +9871,20 @@
   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.
+   * @param element the static element to be associated with the operator
+   */
+  void set staticElement(MethodElement element) {
+    _staticElement = element;
+  }
   void visitChildren(ASTVisitor<Object> visitor) {
     safelyVisitChild(_operand, visitor);
   }
 }
+
 /**
  * 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
@@ -8481,18 +9894,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
@@ -8504,6 +9921,7 @@
     this._period = period;
     this._identifier = becomeParentOf(identifier);
   }
+  
   /**
    * Initialize a newly created prefixed identifier.
    * @param prefix the identifier being prefixed
@@ -8520,22 +9938,32 @@
     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
    */
   SimpleIdentifier get prefix => _prefix;
+  Element get staticElement {
+    if (_identifier == null) {
+      return null;
+    }
+    return _identifier.staticElement;
+  }
+  
   /**
    * Set the identifier being prefixed to the given identifier.
    * @param identifier the identifier being prefixed
@@ -8543,6 +9971,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
@@ -8550,6 +9979,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.
@@ -8563,6 +9993,7 @@
     safelyVisitChild(_identifier, visitor);
   }
 }
+
 /**
  * Instances of the class {@code PropertyAccess} represent the access of a property of an object.
  * <p>
@@ -8573,18 +10004,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
@@ -8596,6 +10031,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
@@ -8611,16 +10047,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
@@ -8642,6 +10081,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
@@ -8649,12 +10089,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
@@ -8662,6 +10104,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
@@ -8669,6 +10112,7 @@
   void set propertyName(SimpleIdentifier identifier) {
     _propertyName = becomeParentOf(identifier);
   }
+  
   /**
    * Set the expression computing the object defining the property being accessed to the given
    * expression.
@@ -8682,6 +10126,7 @@
     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.
@@ -8692,28 +10137,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, or {@code null} if the AST structure has not been
-   * resolved or if the constructor could not be resolved.
+   * 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 _element;
+  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.
@@ -8728,6 +10184,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.
@@ -8738,35 +10195,48 @@
    */
   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, 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 based on propagated 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 super constructor
    */
-  ConstructorElement get element => _element;
+  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
@@ -8774,6 +10244,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
@@ -8781,13 +10252,16 @@
   void set constructorName(SimpleIdentifier identifier) {
     _constructorName = becomeParentOf(identifier);
   }
+  
   /**
-   * Set the element associated with the constructor to the given element.
-   * @param element the element associated with the constructor
+   * Set the element associated with the constructor based on propagated type information to the
+   * given element.
+   * @param element the element to be associated with the constructor
    */
   void set element(ConstructorElement element2) {
-    this._element = element2;
+    _propagatedElement = element2;
   }
+  
   /**
    * Set the token for the 'this' keyword to the given token.
    * @param keyword the token for the 'this' keyword
@@ -8795,6 +10269,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.
@@ -8803,11 +10278,21 @@
   void set period(Token period2) {
     this._period = period2;
   }
+  
+  /**
+   * Set the element associated with the constructor based on static type information to the given
+   * element.
+   * @param element the element to be associated with the constructor
+   */
+  void set staticElement(ConstructorElement element) {
+    this._staticElement = element;
+  }
   void visitChildren(ASTVisitor<Object> visitor) {
     safelyVisitChild(_constructorName, visitor);
     safelyVisitChild(_argumentList, visitor);
   }
 }
+
 /**
  * Instances of the class {@code RethrowExpression} represent a rethrow expression.
  * <pre>
@@ -8817,10 +10302,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
@@ -8828,6 +10315,7 @@
   RethrowExpression.full(Token keyword) {
     this._keyword = keyword;
   }
+  
   /**
    * Initialize a newly created rethrow expression.
    * @param keyword the token representing the 'rethrow' keyword
@@ -8836,11 +10324,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
@@ -8851,6 +10341,7 @@
   void visitChildren(ASTVisitor<Object> visitor) {
   }
 }
+
 /**
  * Instances of the class {@code ReturnStatement} represent a return statement.
  * <pre>
@@ -8860,19 +10351,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
@@ -8884,6 +10379,7 @@
     this._expression = becomeParentOf(expression);
     this._semicolon = semicolon;
   }
+  
   /**
    * Initialize a newly created return statement.
    * @param keyword the token representing the 'return' keyword
@@ -8894,22 +10390,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
@@ -8917,6 +10417,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
@@ -8924,6 +10425,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
@@ -8935,6 +10437,7 @@
     safelyVisitChild(_expression, visitor);
   }
 }
+
 /**
  * Instances of the class {@code ScriptTag} represent the script tag that can optionally occur at
  * the beginning of a compilation unit.
@@ -8945,10 +10448,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
@@ -8956,6 +10461,7 @@
   ScriptTag.full(Token scriptTag) {
     this._scriptTag = scriptTag;
   }
+  
   /**
    * Initialize a newly created script tag.
    * @param scriptTag the token representing this script tag
@@ -8964,11 +10470,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
@@ -8979,6 +10487,7 @@
   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.
@@ -8989,10 +10498,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
@@ -9002,6 +10513,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
@@ -9010,6 +10522,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
@@ -9019,6 +10532,7 @@
     _shownNames.accept(visitor);
   }
 }
+
 /**
  * Instances of the class {@code SimpleFormalParameter} represent a simple formal parameter.
  * <pre>
@@ -9027,16 +10541,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
@@ -9049,6 +10566,7 @@
     this._keyword = keyword;
     this._type = becomeParentOf(type);
   }
+  
   /**
    * Initialize a newly created formal parameter.
    * @param comment the documentation comment associated with this parameter
@@ -9068,11 +10586,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.
@@ -9081,6 +10601,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
@@ -9088,6 +10609,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
@@ -9101,6 +10623,7 @@
     safelyVisitChild(identifier, visitor);
   }
 }
+
 /**
  * Instances of the class {@code SimpleIdentifier} represent a simple identifier.
  * <pre>
@@ -9112,15 +10635,23 @@
  * @coverage dart.engine.ast
  */
 class SimpleIdentifier extends Identifier {
+  
   /**
    * The token representing the identifier.
    */
   Token _token;
+  
   /**
-   * The element associated with this identifier, or {@code null} if the AST structure has not been
-   * resolved or if this identifier could not be resolved.
+   * 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 _element;
+  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
@@ -9128,6 +10659,7 @@
   SimpleIdentifier.full(Token token) {
     this._token = token;
   }
+  
   /**
    * Initialize a newly created identifier.
    * @param token the token representing the identifier
@@ -9135,14 +10667,17 @@
   SimpleIdentifier({Token token}) : this.full(token);
   accept(ASTVisitor visitor) => visitor.visitSimpleIdentifier(this);
   Token get beginToken => _token;
-  Element get element => _element;
+  Element get element => _propagatedElement;
   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
@@ -9175,6 +10710,7 @@
     }
     return false;
   }
+  
   /**
    * Return {@code true} if this expression is computing a right-hand value.
    * <p>
@@ -9211,6 +10747,7 @@
     }
     return true;
   }
+  
   /**
    * Return {@code true} if this expression is computing a left-hand value.
    * <p>
@@ -9246,13 +10783,25 @@
     return false;
   }
   bool isSynthetic() => _token.isSynthetic();
+  
   /**
-   * Set the element associated with this identifier to the given element.
-   * @param element the element associated with this identifier
+   * Set the element associated with this identifier based on propagated type information to the
+   * given element.
+   * @param element the element to be associated with this identifier
    */
   void set element(Element element2) {
-    this._element = element2;
+    _propagatedElement = element2;
   }
+  
+  /**
+   * Set the element associated with this identifier based on static type information to the given
+   * element.
+   * @param element the element to be associated with this identifier
+   */
+  void set staticElement(Element element) {
+    _staticElement = element;
+  }
+  
   /**
    * Set the token representing the identifier to the given token.
    * @param token the token representing the literal
@@ -9263,6 +10812,7 @@
   void visitChildren(ASTVisitor<Object> visitor) {
   }
 }
+
 /**
  * Instances of the class {@code SimpleStringLiteral} represent a string literal expression that
  * does not contain any interpolations.
@@ -9285,14 +10835,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
@@ -9302,6 +10855,7 @@
     this._literal = literal;
     this._value = StringUtilities.intern(value);
   }
+  
   /**
    * Initialize a newly created simple string literal.
    * @param literal the token representing the literal
@@ -9311,16 +10865,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
@@ -9331,12 +10888,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
@@ -9344,6 +10903,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
@@ -9353,7 +10913,11 @@
   }
   void visitChildren(ASTVisitor<Object> visitor) {
   }
+  void appendStringValue(JavaStringBuilder builder) {
+    builder.append(value);
+  }
 }
+
 /**
  * Instances of the class {@code Statement} defines the behavior common to nodes that represent a
  * statement.
@@ -9363,6 +10927,7 @@
  */
 abstract class Statement extends ASTNode {
 }
+
 /**
  * Instances of the class {@code StringInterpolation} represent a string interpolation literal.
  * <pre>
@@ -9373,10 +10938,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
@@ -9385,6 +10952,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
@@ -9392,6 +10960,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
@@ -9401,7 +10970,11 @@
   void visitChildren(ASTVisitor<Object> visitor) {
     _elements.accept(visitor);
   }
+  void appendStringValue(JavaStringBuilder builder) {
+    throw new IllegalArgumentException();
+  }
 }
+
 /**
  * Instances of the class {@code StringLiteral} represent a string literal expression.
  * <pre>
@@ -9409,7 +10982,31 @@
  * @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.
+   * @return the value of the string literal
+   */
+  String get stringValue {
+    JavaStringBuilder builder = new JavaStringBuilder();
+    try {
+      appendStringValue(builder);
+    } on IllegalArgumentException catch (exception) {
+      return null;
+    }
+    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
+   * @throws IllegalArgumentException if the string is not a constant string without any string
+   * interpolation
+   */
+  void appendStringValue(JavaStringBuilder builder);
 }
+
 /**
  * Instances of the class {@code SuperConstructorInvocation} represent the invocation of a
  * superclass' constructor from within a constructor's initialization list.
@@ -9419,28 +11016,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, or {@code null} if the AST structure has not been
+   * 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 _element;
+  ConstructorElement _propagatedElement;
+  
   /**
    * Initialize a newly created super invocation to invoke the inherited constructor with the given
    * name with the given arguments.
@@ -9455,6 +11063,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.
@@ -9465,35 +11074,48 @@
    */
   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, 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 based on propagated 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 super constructor
    */
-  ConstructorElement get element => _element;
+  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
@@ -9501,6 +11123,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
@@ -9508,13 +11131,16 @@
   void set constructorName(SimpleIdentifier identifier) {
     _constructorName = becomeParentOf(identifier);
   }
+  
   /**
-   * Set the element associated with the constructor to the given element.
-   * @param element the element associated with the constructor
+   * Set the element associated with the constructor based on propagated type information to the
+   * given element.
+   * @param element the element to be associated with the constructor
    */
   void set element(ConstructorElement element2) {
-    this._element = element2;
+    _propagatedElement = element2;
   }
+  
   /**
    * Set the token for the 'super' keyword to the given token.
    * @param keyword the token for the 'super' keyword
@@ -9522,6 +11148,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.
@@ -9530,11 +11157,21 @@
   void set period(Token period2) {
     this._period = period2;
   }
+  
+  /**
+   * Set the element associated with the constructor based on static type information to the given
+   * element.
+   * @param element the element to be associated with the constructor
+   */
+  void set staticElement(ConstructorElement element) {
+    this._staticElement = element;
+  }
   void visitChildren(ASTVisitor<Object> visitor) {
     safelyVisitChild(_constructorName, visitor);
     safelyVisitChild(_argumentList, visitor);
   }
 }
+
 /**
  * Instances of the class {@code SuperExpression} represent a super expression.
  * <pre>
@@ -9544,10 +11181,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
@@ -9555,6 +11194,7 @@
   SuperExpression.full(Token keyword) {
     this._keyword = keyword;
   }
+  
   /**
    * Initialize a newly created super expression.
    * @param keyword the token representing the keyword
@@ -9563,11 +11203,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
@@ -9578,6 +11220,7 @@
   void visitChildren(ASTVisitor<Object> visitor) {
   }
 }
+
 /**
  * Instances of the class {@code SwitchCase} represent the case in a switch statement.
  * <pre>
@@ -9585,10 +11228,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
@@ -9600,6 +11245,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
@@ -9610,11 +11256,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
@@ -9628,6 +11276,7 @@
     statements.accept(visitor);
   }
 }
+
 /**
  * Instances of the class {@code SwitchDefault} represent the default case in a switch statement.
  * <pre>
@@ -9635,6 +11284,7 @@
  * @coverage dart.engine.ast
  */
 class SwitchDefault extends SwitchMember {
+  
   /**
    * Initialize a newly created switch default.
    * @param labels the labels associated with the switch member
@@ -9644,6 +11294,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
@@ -9658,6 +11309,7 @@
     statements.accept(visitor);
   }
 }
+
 /**
  * The abstract class {@code SwitchMember} defines the behavior common to objects representing
  * elements within a switch statement.
@@ -9669,22 +11321,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
@@ -9700,6 +11357,7 @@
     this._colon = colon;
     this._statements.addAll(statements);
   }
+  
   /**
    * Initialize a newly created switch member.
    * @param labels the labels associated with the switch member
@@ -9714,6 +11372,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
@@ -9725,21 +11384,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
@@ -9747,6 +11410,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
@@ -9755,6 +11419,7 @@
     this._keyword = keyword2;
   }
 }
+
 /**
  * Instances of the class {@code SwitchStatement} represent a switch statement.
  * <pre>
@@ -9764,34 +11429,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
@@ -9812,6 +11485,7 @@
     this._members.addAll(members);
     this._rightBracket = rightBracket;
   }
+  
   /**
    * Initialize a newly created switch statement.
    * @param keyword the token representing the 'switch' keyword
@@ -9826,41 +11500,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.
@@ -9869,6 +11551,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
@@ -9876,6 +11559,7 @@
   void set keyword(Token keyword2) {
     this._keyword = keyword2;
   }
+  
   /**
    * Set the left curly bracket to the given token.
    * @param leftBracket the left curly bracket
@@ -9883,6 +11567,7 @@
   void set leftBracket(Token leftBracket2) {
     this._leftBracket = leftBracket2;
   }
+  
   /**
    * Set the left parenthesis to the given token.
    * @param leftParenthesis the left parenthesis
@@ -9890,6 +11575,7 @@
   void set leftParenthesis(Token leftParenthesis2) {
     this._leftParenthesis = leftParenthesis2;
   }
+  
   /**
    * Set the right curly bracket to the given token.
    * @param rightBracket the right curly bracket
@@ -9897,6 +11583,7 @@
   void set rightBracket(Token rightBracket2) {
     this._rightBracket = rightBracket2;
   }
+  
   /**
    * Set the right parenthesis to the given token.
    * @param rightParenthesis the right parenthesis
@@ -9909,6 +11596,7 @@
     _members.accept(visitor);
   }
 }
+
 /**
  * Instances of the class {@code ThisExpression} represent a this expression.
  * <pre>
@@ -9918,10 +11606,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
@@ -9929,6 +11619,7 @@
   ThisExpression.full(Token keyword) {
     this._keyword = keyword;
   }
+  
   /**
    * Initialize a newly created this expression.
    * @param keyword the token representing the keyword
@@ -9937,11 +11628,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
@@ -9952,6 +11645,7 @@
   void visitChildren(ASTVisitor<Object> visitor) {
   }
 }
+
 /**
  * Instances of the class {@code ThrowExpression} represent a throw expression.
  * <pre>
@@ -9960,14 +11654,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
@@ -9977,6 +11674,7 @@
     this._keyword = keyword;
     this._expression = becomeParentOf(expression);
   }
+  
   /**
    * Initialize a newly created throw expression.
    * @param keyword the token representing the 'throw' keyword
@@ -9991,16 +11689,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
@@ -10008,6 +11709,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
@@ -10019,6 +11721,7 @@
     safelyVisitChild(_expression, visitor);
   }
 }
+
 /**
  * Instances of the class {@code TopLevelVariableDeclaration} represent the declaration of one or
  * more top-level variables of the same type.
@@ -10030,14 +11733,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
@@ -10049,6 +11755,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
@@ -10060,16 +11767,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
@@ -10077,6 +11787,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
@@ -10090,6 +11801,7 @@
   }
   Token get firstTokenAfterCommentAndMetadata => _variableList.beginToken;
 }
+
 /**
  * Instances of the class {@code TryStatement} represent a try statement.
  * <pre>
@@ -10100,28 +11812,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
@@ -10138,6 +11856,7 @@
     this._finallyKeyword = finallyKeyword;
     this._finallyClause = becomeParentOf(finallyClause);
   }
+  
   /**
    * Initialize a newly created try statement.
    * @param tryKeyword the token representing the 'try' keyword
@@ -10149,11 +11868,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
@@ -10169,23 +11890,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
@@ -10193,6 +11918,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
@@ -10200,6 +11926,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
@@ -10207,6 +11934,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
@@ -10220,6 +11948,7 @@
     safelyVisitChild(_finallyClause, visitor);
   }
 }
+
 /**
  * The abstract class {@code TypeAlias} defines the behavior common to declarations of type aliases.
  * <pre>
@@ -10232,14 +11961,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
@@ -10251,6 +11983,7 @@
     this._keyword = keyword;
     this._semicolon = semicolon;
   }
+  
   /**
    * Initialize a newly created type alias.
    * @param comment the documentation comment associated with this type alias
@@ -10260,16 +11993,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
@@ -10277,6 +12013,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
@@ -10286,6 +12023,7 @@
   }
   Token get firstTokenAfterCommentAndMetadata => _keyword;
 }
+
 /**
  * Instances of the class {@code TypeArgumentList} represent a list of type arguments.
  * <pre>
@@ -10295,18 +12033,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
@@ -10319,6 +12061,7 @@
     this._arguments.addAll(arguments);
     this._rightBracket = rightBracket;
   }
+  
   /**
    * Initialize a newly created list of type arguments.
    * @param leftBracket the left bracket
@@ -10327,6 +12070,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
@@ -10334,16 +12078,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
@@ -10351,6 +12098,7 @@
   void set leftBracket(Token leftBracket2) {
     this._leftBracket = leftBracket2;
   }
+  
   /**
    * Set the right bracket to the given token.
    * @param rightBracket the right bracket
@@ -10362,6 +12110,7 @@
     _arguments.accept(visitor);
   }
 }
+
 /**
  * Instances of the class {@code TypeName} represent the name of a type, which can optionally
  * include type arguments.
@@ -10371,18 +12120,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
@@ -10393,6 +12146,7 @@
     this._name = becomeParentOf(name);
     this._typeArguments = becomeParentOf(typeArguments);
   }
+  
   /**
    * Initialize a newly created type name.
    * @param name the name of the type
@@ -10408,16 +12162,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.
@@ -10425,6 +12182,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
@@ -10432,6 +12190,7 @@
   void set name(Identifier identifier) {
     _name = becomeParentOf(identifier);
   }
+  
   /**
    * Set the type being named to the given type.
    * @param type the type being named
@@ -10439,6 +12198,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
@@ -10451,6 +12211,7 @@
     safelyVisitChild(_typeArguments, visitor);
   }
 }
+
 /**
  * Instances of the class {@code TypeParameter} represent a type parameter.
  * <pre>
@@ -10459,20 +12220,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
@@ -10486,6 +12251,7 @@
     this._keyword = keyword;
     this._bound = becomeParentOf(bound);
   }
+  
   /**
    * Initialize a newly created type parameter.
    * @param comment the documentation comment associated with the type parameter
@@ -10496,6 +12262,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.
@@ -10509,16 +12276,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
@@ -10526,6 +12296,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
@@ -10533,6 +12304,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
@@ -10547,6 +12319,7 @@
   }
   Token get firstTokenAfterCommentAndMetadata => _name.beginToken;
 }
+
 /**
  * Instances of the class {@code TypeParameterList} represent type parameters within a declaration.
  * <pre>
@@ -10556,18 +12329,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
@@ -10580,6 +12357,7 @@
     this._typeParameters.addAll(typeParameters);
     this._rightBracket = rightBracket;
   }
+  
   /**
    * Initialize a newly created list of type parameters.
    * @param leftBracket the left angle bracket
@@ -10590,16 +12368,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
@@ -10609,6 +12390,7 @@
     _typeParameters.accept(visitor);
   }
 }
+
 /**
  * The abstract class {@code TypedLiteral} defines the behavior common to literals that have a type
  * associated with them.
@@ -10617,16 +12399,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
@@ -10637,6 +12422,7 @@
     this._modifier = modifier;
     this._typeArguments = becomeParentOf(typeArguments);
   }
+  
   /**
    * Initialize a newly created typed literal.
    * @param modifier the const modifier associated with this literal
@@ -10644,17 +12430,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
@@ -10662,6 +12451,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
@@ -10673,6 +12463,7 @@
     safelyVisitChild(_typeArguments, visitor);
   }
 }
+
 /**
  * The abstract class {@code UriBasedDirective} defines the behavior common to nodes that represent
  * a directive that references a URI.
@@ -10681,10 +12472,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
@@ -10694,6 +12487,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
@@ -10701,11 +12495,21 @@
    * @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
+   * case include a directive that contains an invalid URL or a URL that does not exist.
+   * @return the element associated with this directive
+   */
+  Element get uriElement;
+  
   /**
    * Set the URI referenced by this directive to the given URI.
    * @param uri the URI referenced by this directive
@@ -10718,6 +12522,7 @@
     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}.
@@ -10727,20 +12532,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
@@ -10754,6 +12563,7 @@
     this._equals = equals;
     this._initializer = becomeParentOf(initializer);
   }
+  
   /**
    * Initialize a newly created variable declaration.
    * @param comment the documentation comment associated with this declaration
@@ -10771,23 +12581,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
@@ -10796,6 +12610,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
@@ -10806,6 +12621,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
@@ -10813,6 +12629,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
@@ -10820,6 +12637,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
@@ -10834,6 +12652,7 @@
   }
   Token get firstTokenAfterCommentAndMetadata => _name.beginToken;
 }
+
 /**
  * Instances of the class {@code VariableDeclarationList} represent the declaration of one or more
  * variables of the same type.
@@ -10848,19 +12667,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
@@ -10875,6 +12698,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
@@ -10886,27 +12710,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
@@ -10914,6 +12743,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
@@ -10921,6 +12751,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
@@ -10941,6 +12772,7 @@
     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.
@@ -10950,14 +12782,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
@@ -10967,6 +12802,7 @@
     this._variableList = becomeParentOf(variableList);
     this._semicolon = semicolon;
   }
+  
   /**
    * Initialize a newly created variable declaration statement.
    * @param variableList the fields being declared
@@ -10976,16 +12812,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
@@ -10993,6 +12832,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
@@ -11004,6 +12844,7 @@
     safelyVisitChild(_variableList, visitor);
   }
 }
+
 /**
  * Instances of the class {@code WhileStatement} represent a while statement.
  * <pre>
@@ -11012,26 +12853,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
@@ -11047,6 +12894,7 @@
     this._rightParenthesis = rightParenthesis;
     this._body = becomeParentOf(body);
   }
+  
   /**
    * Initialize a newly created while statement.
    * @param keyword the token representing the 'while' keyword
@@ -11058,32 +12906,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
@@ -11091,6 +12945,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.
@@ -11099,6 +12954,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
@@ -11106,6 +12962,7 @@
   void set keyword(Token keyword2) {
     this._keyword = keyword2;
   }
+  
   /**
    * Set the left parenthesis to the given token.
    * @param leftParenthesis the left parenthesis
@@ -11113,6 +12970,7 @@
   void set leftParenthesis(Token leftParenthesis2) {
     this._leftParenthesis = leftParenthesis2;
   }
+  
   /**
    * Set the right parenthesis to the given token.
    * @param rightParenthesis the right parenthesis
@@ -11125,6 +12983,7 @@
     safelyVisitChild(_body, visitor);
   }
 }
+
 /**
  * Instances of the class {@code WithClause} represent the with clause in a class declaration.
  * <pre>
@@ -11134,14 +12993,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
@@ -11152,6 +13014,7 @@
     this._withKeyword = withKeyword;
     this._mixinTypes.addAll(mixinTypes);
   }
+  
   /**
    * Initialize a newly created with clause.
    * @param withKeyword the token representing the 'with' keyword
@@ -11161,16 +13024,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
@@ -11182,6 +13048,45 @@
     _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
+ * visitor uses a breadth-first ordering rather than the depth-first ordering of{@link GeneralizingASTVisitor}.
+ * @coverage dart.engine.ast
+ */
+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
+   */
+  void visitAllNodes(ASTNode root) {
+    _queue.add(root);
+    while (!_queue.isEmpty) {
+      ASTNode next = _queue.removeFirst();
+      next.accept(this);
+    }
+  }
+  R visitNode(ASTNode node) {
+    node.visitChildren(_childVisitor);
+    return null;
+  }
+  BreadthFirstVisitor() {
+    this._childVisitor = new GeneralizingASTVisitor_1(this);
+  }
+}
+class GeneralizingASTVisitor_1 extends GeneralizingASTVisitor<Object> {
+  final BreadthFirstVisitor BreadthFirstVisitor_this;
+  GeneralizingASTVisitor_1(this.BreadthFirstVisitor_this) : super();
+  Object visitNode(ASTNode node) {
+    BreadthFirstVisitor_this._queue.add(node);
+    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
@@ -11215,16 +13120,12 @@
  * @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.
    */
   static Object NOT_A_CONSTANT = new Object();
-  /**
-   * Initialize a newly created constant evaluator.
-   */
-  ConstantEvaluator() {
-  }
   Object visitAdjacentStrings(AdjacentStrings node) {
     JavaStringBuilder builder = new JavaStringBuilder();
     for (StringLiteral string in node.strings) {
@@ -11449,6 +13350,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
@@ -11463,11 +13365,13 @@
     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}.
@@ -11478,12 +13382,8 @@
     ElementLocator_ElementMapper mapper = new ElementLocator_ElementMapper();
     return node.accept(mapper);
   }
-  /**
-   * Clients should use {@link #locate(ASTNode)}.
-   */
-  ElementLocator() {
-  }
 }
+
 /**
  * Visitor that maps nodes to elements.
  */
@@ -11509,6 +13409,15 @@
         }
       }
     }
+    if (parent2 is LibraryIdentifier) {
+      ASTNode grandParent = ((parent2 as LibraryIdentifier)).parent;
+      if (grandParent is PartOfDirective) {
+        Element element3 = ((grandParent as PartOfDirective)).element;
+        if (element3 is LibraryElement) {
+          return ((element3 as LibraryElement)).definingCompilationUnit;
+        }
+      }
+    }
     return node.element;
   }
   Element visitImportDirective(ImportDirective node) => node.element;
@@ -11523,12 +13432,13 @@
   Element visitStringLiteral(StringLiteral node) {
     ASTNode parent2 = node.parent;
     if (parent2 is UriBasedDirective) {
-      return ((parent2 as UriBasedDirective)).element;
+      return ((parent2 as UriBasedDirective)).uriElement;
     }
     return null;
   }
   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
@@ -11595,7 +13505,7 @@
   R visitFormalParameterList(FormalParameterList node) => visitNode(node);
   R visitForStatement(ForStatement node) => visitStatement(node);
   R visitFunctionBody(FunctionBody node) => visitNode(node);
-  R visitFunctionDeclaration(FunctionDeclaration node) => visitNode(node);
+  R visitFunctionDeclaration(FunctionDeclaration node) => visitCompilationUnitMember(node);
   R visitFunctionDeclarationStatement(FunctionDeclarationStatement node) => visitStatement(node);
   R visitFunctionExpression(FunctionExpression node) => visitExpression(node);
   R visitFunctionExpressionInvocation(FunctionExpressionInvocation node) => visitExpression(node);
@@ -11673,6 +13583,7 @@
   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
@@ -11681,19 +13592,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.
@@ -11705,6 +13620,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
@@ -11719,12 +13635,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
@@ -11765,6 +13683,7 @@
     return null;
   }
 }
+
 /**
  * Instances of the class {@code NodeFoundException} are used to cancel visiting after a node has
  * been found.
@@ -11772,6 +13691,7 @@
 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
@@ -12188,6 +14108,7 @@
     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
@@ -12298,16 +14219,19 @@
   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.
@@ -12999,6 +14923,7 @@
     visitList2(node.mixinTypes, ", ");
     return null;
   }
+  
   /**
    * Safely visit the given node.
    * @param node the node to be visited
@@ -13008,6 +14933,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
@@ -13019,6 +14945,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
@@ -13030,6 +14957,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
@@ -13041,6 +14969,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
@@ -13052,6 +14981,7 @@
       _writer.print(suffix);
     }
   }
+  
   /**
    * Print a list of nodes without any separation.
    * @param nodes the nodes to be printed
@@ -13060,6 +14990,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
@@ -13076,6 +15007,7 @@
       }
     }
   }
+  
   /**
    * Print a list of nodes, separated by the given separator.
    * @param nodes the nodes to be printed
@@ -13096,6 +15028,7 @@
       }
     }
   }
+  
   /**
    * Print a list of nodes, separated by the given separator.
    * @param prefix the prefix to be printed if the list is not empty
@@ -13117,6 +15050,7 @@
     }
   }
 }
+
 /**
  * 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
@@ -13258,6 +15192,146 @@
     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
+ * first name seen is the most specific one so names are not redefined.
+ * <p>
+ * Completion test code coverage is 95%. The two basic blocks that are not executed cannot be
+ * executed. They are included for future reference.
+ * @coverage com.google.dart.engine.services.completion
+ */
+class ScopedNameFinder extends GeneralizingASTVisitor<Object> {
+  Declaration _declarationNode;
+  ASTNode _immediateChild;
+  Map<String, SimpleIdentifier> _locals = new Map<String, SimpleIdentifier>();
+  int _position = 0;
+  bool _referenceIsWithinLocalFunction = false;
+  ScopedNameFinder(int position) {
+    this._position = position;
+  }
+  Declaration get declaration => _declarationNode;
+  Map<String, SimpleIdentifier> get locals => _locals;
+  Object visitBlock(Block node) {
+    checkStatements(node.statements);
+    return super.visitBlock(node);
+  }
+  Object visitCatchClause(CatchClause node) {
+    addToScope(node.exceptionParameter);
+    addToScope(node.stackTraceParameter);
+    return super.visitCatchClause(node);
+  }
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    if (_immediateChild != node.parameters) {
+      addParameters(node.parameters.parameters);
+    }
+    _declarationNode = node;
+    return null;
+  }
+  Object visitFieldDeclaration(FieldDeclaration node) {
+    _declarationNode = node;
+    return null;
+  }
+  Object visitForEachStatement(ForEachStatement node) {
+    addToScope(node.loopVariable.identifier);
+    return super.visitForEachStatement(node);
+  }
+  Object visitForStatement(ForStatement node) {
+    if (_immediateChild != node.variables && node.variables != null) {
+      addVariables(node.variables.variables);
+    }
+    return super.visitForStatement(node);
+  }
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    if (node.parent is! FunctionDeclarationStatement) {
+      _declarationNode = node;
+      return null;
+    }
+    return super.visitFunctionDeclaration(node);
+  }
+  Object visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+    _referenceIsWithinLocalFunction = true;
+    return super.visitFunctionDeclarationStatement(node);
+  }
+  Object visitFunctionExpression(FunctionExpression node) {
+    if (_immediateChild != node.parameters) {
+      addParameters(node.parameters.parameters);
+    }
+    return super.visitFunctionExpression(node);
+  }
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    if (node.parameters == null) {
+      return null;
+    }
+    if (_immediateChild != node.parameters) {
+      addParameters(node.parameters.parameters);
+    }
+    _declarationNode = node;
+    return null;
+  }
+  Object visitNode(ASTNode node) {
+    _immediateChild = node;
+    ASTNode parent2 = node.parent;
+    if (parent2 != null) {
+      parent2.accept(this);
+    }
+    return null;
+  }
+  Object visitSwitchMember(SwitchMember node) {
+    checkStatements(node.statements);
+    return super.visitSwitchMember(node);
+  }
+  Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    _declarationNode = node;
+    return null;
+  }
+  Object visitTypeAlias(TypeAlias node) {
+    _declarationNode = node;
+    return null;
+  }
+  void addParameters(NodeList<FormalParameter> vars) {
+    for (FormalParameter var2 in vars) {
+      addToScope(var2.identifier);
+    }
+  }
+  void addToScope(SimpleIdentifier identifier) {
+    if (identifier != null && isInRange(identifier)) {
+      String name2 = identifier.name;
+      if (!_locals.containsKey(name2)) {
+        _locals[name2] = identifier;
+      }
+    }
+  }
+  void addVariables(NodeList<VariableDeclaration> vars) {
+    for (VariableDeclaration var2 in vars) {
+      addToScope(var2.name);
+    }
+  }
+  
+  /**
+   * Some statements define names that are visible downstream. There aren't many of these.
+   * @param statements the list of statements to check for name definitions
+   */
+  void checkStatements(List<Statement> statements) {
+    for (Statement stmt in statements) {
+      if (identical(stmt, _immediateChild)) {
+        return;
+      }
+      if (stmt is VariableDeclarationStatement) {
+        addVariables(((stmt as VariableDeclarationStatement)).variables.variables);
+      } else if (stmt is FunctionDeclarationStatement && !_referenceIsWithinLocalFunction) {
+        addToScope(((stmt as FunctionDeclarationStatement)).functionDeclaration.name);
+      }
+    }
+  }
+  bool isInRange(ASTNode node) {
+    if (_position < 0) {
+      return true;
+    }
+    return node.end < _position;
+  }
+}
 /**
  * Instances of the class {@code NodeList} represent a list of AST nodes that have a common parent.
  */
diff --git a/pkg/analyzer_experimental/lib/src/generated/constant.dart b/pkg/analyzer_experimental/lib/src/generated/constant.dart
index 8d86663..0f49924 100644
--- a/pkg/analyzer_experimental/lib/src/generated/constant.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/constant.dart
@@ -11,6 +11,7 @@
 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
@@ -43,10 +44,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
@@ -67,11 +70,13 @@
     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.
@@ -79,6 +84,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.
@@ -86,14 +92,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)}.
@@ -104,6 +113,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
@@ -111,12 +121,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.
@@ -124,21 +136,19 @@
    */
   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>();
-  /**
-   * Initialize a newly created constant finder.
-   */
-  ConstantFinder() : super() {
-  }
+  
   /**
    * 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
@@ -156,6 +166,7 @@
     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
@@ -163,24 +174,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;
-  /**
-   * Initialize a newly created constant value computer.
-   */
-  ConstantValueComputer() : super() {
-  }
+  
   /**
    * Add the constant variables in the given compilation unit to the list of constant variables
    * whose value needs to be computed.
@@ -189,6 +199,7 @@
   void add(CompilationUnit unit) {
     unit.accept(_constantFinder);
   }
+  
   /**
    * Compute values for all of the constant variables in the compilation units that were added.
    */
@@ -219,6 +230,7 @@
       }
     }
   }
+  
   /**
    * Compute a value for the given variable.
    * @param variable the variable for which a value is to be computed
@@ -239,6 +251,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
@@ -249,6 +262,7 @@
   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
@@ -276,11 +290,6 @@
  * </blockquote>
  */
 class ConstantVisitor extends GeneralizingASTVisitor<EvaluationResultImpl> {
-  /**
-   * Initialize a newly created constant visitor.
-   */
-  ConstantVisitor() : super() {
-  }
   EvaluationResultImpl visitAdjacentStrings(AdjacentStrings node) {
     EvaluationResultImpl result = null;
     for (StringLiteral string in node.strings) {
@@ -295,44 +304,50 @@
   EvaluationResultImpl visitBinaryExpression(BinaryExpression node) {
     EvaluationResultImpl leftResult = node.leftOperand.accept(this);
     EvaluationResultImpl rightResult = node.rightOperand.accept(this);
+    TokenType operatorType = node.operator.type;
+    if (operatorType != TokenType.BANG_EQ && operatorType != TokenType.EQ_EQ) {
+      if (leftResult is ValidResult && ((leftResult as ValidResult)).isNull() || rightResult is ValidResult && ((rightResult as ValidResult)).isNull()) {
+        return error(node, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+      }
+    }
     while (true) {
-      if (node.operator.type == TokenType.AMPERSAND) {
+      if (operatorType == TokenType.AMPERSAND) {
         return leftResult.bitAnd(node, rightResult);
-      } else if (node.operator.type == TokenType.AMPERSAND_AMPERSAND) {
+      } else if (operatorType == TokenType.AMPERSAND_AMPERSAND) {
         return leftResult.logicalAnd(node, rightResult);
-      } else if (node.operator.type == TokenType.BANG_EQ) {
+      } else if (operatorType == TokenType.BANG_EQ) {
         return leftResult.notEqual(node, rightResult);
-      } else if (node.operator.type == TokenType.BAR) {
+      } else if (operatorType == TokenType.BAR) {
         return leftResult.bitOr(node, rightResult);
-      } else if (node.operator.type == TokenType.BAR_BAR) {
+      } else if (operatorType == TokenType.BAR_BAR) {
         return leftResult.logicalOr(node, rightResult);
-      } else if (node.operator.type == TokenType.CARET) {
+      } else if (operatorType == TokenType.CARET) {
         return leftResult.bitXor(node, rightResult);
-      } else if (node.operator.type == TokenType.EQ_EQ) {
+      } else if (operatorType == TokenType.EQ_EQ) {
         return leftResult.equalEqual(node, rightResult);
-      } else if (node.operator.type == TokenType.GT) {
+      } else if (operatorType == TokenType.GT) {
         return leftResult.greaterThan(node, rightResult);
-      } else if (node.operator.type == TokenType.GT_EQ) {
+      } else if (operatorType == TokenType.GT_EQ) {
         return leftResult.greaterThanOrEqual(node, rightResult);
-      } else if (node.operator.type == TokenType.GT_GT) {
+      } else if (operatorType == TokenType.GT_GT) {
         return leftResult.shiftRight(node, rightResult);
-      } else if (node.operator.type == TokenType.LT) {
+      } else if (operatorType == TokenType.LT) {
         return leftResult.lessThan(node, rightResult);
-      } else if (node.operator.type == TokenType.LT_EQ) {
+      } else if (operatorType == TokenType.LT_EQ) {
         return leftResult.lessThanOrEqual(node, rightResult);
-      } else if (node.operator.type == TokenType.LT_LT) {
+      } else if (operatorType == TokenType.LT_LT) {
         return leftResult.shiftLeft(node, rightResult);
-      } else if (node.operator.type == TokenType.MINUS) {
+      } else if (operatorType == TokenType.MINUS) {
         return leftResult.minus(node, rightResult);
-      } else if (node.operator.type == TokenType.PERCENT) {
+      } else if (operatorType == TokenType.PERCENT) {
         return leftResult.remainder(node, rightResult);
-      } else if (node.operator.type == TokenType.PLUS) {
+      } else if (operatorType == TokenType.PLUS) {
         return leftResult.add(node, rightResult);
-      } else if (node.operator.type == TokenType.STAR) {
+      } else if (operatorType == TokenType.STAR) {
         return leftResult.times(node, rightResult);
-      } else if (node.operator.type == TokenType.SLASH) {
+      } else if (operatorType == TokenType.SLASH) {
         return leftResult.divide(node, rightResult);
-      } else if (node.operator.type == TokenType.TILDE_SLASH) {
+      } else if (operatorType == TokenType.TILDE_SLASH) {
         return leftResult.integerDivide(node, rightResult);
       }
       break;
@@ -398,11 +413,14 @@
     return error(node, null);
   }
   EvaluationResultImpl visitNode(ASTNode node) => error(node, null);
-  EvaluationResultImpl visitNullLiteral(NullLiteral node) => new ValidResult(null);
+  EvaluationResultImpl visitNullLiteral(NullLiteral node) => ValidResult.RESULT_NULL;
   EvaluationResultImpl visitParenthesizedExpression(ParenthesizedExpression node) => node.expression.accept(this);
   EvaluationResultImpl visitPrefixedIdentifier(PrefixedIdentifier node) => getConstantValue(node, node.element);
   EvaluationResultImpl visitPrefixExpression(PrefixExpression node) {
     EvaluationResultImpl operand2 = node.operand.accept(this);
+    if (operand2 is ValidResult && ((operand2 as ValidResult)).isNull()) {
+      return error(node, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+    }
     while (true) {
       if (node.operator.type == TokenType.BANG) {
         return operand2.logicalNot(node);
@@ -429,6 +447,7 @@
     }
     return result;
   }
+  
   /**
    * Return a result object representing an error associated with the given node.
    * @param node the AST node associated with the error
@@ -436,6 +455,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
@@ -453,9 +473,12 @@
       }
     } else if (element is ExecutableElement) {
       return new ValidResult(element);
+    } else if (element is ClassElement) {
+      return ValidResult.RESULT_OBJECT;
     }
     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
@@ -475,6 +498,7 @@
     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
@@ -483,17 +507,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>>();
-  /**
-   * Initialize a newly create directed graph to be empty.
-   */
-  DirectedGraph() : super() {
-  }
+  
   /**
    * 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.
@@ -512,6 +533,7 @@
     }
     javaSetAdd(tails, tail);
   }
+  
   /**
    * Add the given node to the set of nodes in the graph.
    * @param node the node to be added
@@ -522,16 +544,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
@@ -546,11 +571,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.
@@ -561,6 +588,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
@@ -575,6 +603,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.
@@ -586,6 +615,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
@@ -602,6 +632,7 @@
     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.
@@ -616,15 +647,18 @@
     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.
@@ -632,11 +666,12 @@
    * @param errorCode the error code for the error to be generated
    */
   ErrorResult.con1(ASTNode node, ErrorCode errorCode) {
-    _jtd_constructor_168_impl(node, errorCode);
+    _jtd_constructor_171_impl(node, errorCode);
   }
-  _jtd_constructor_168_impl(ASTNode node, ErrorCode errorCode) {
+  _jtd_constructor_171_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.
@@ -644,9 +679,9 @@
    * @param secondResult the second set of results being merged
    */
   ErrorResult.con2(ErrorResult firstResult, ErrorResult secondResult) {
-    _jtd_constructor_169_impl(firstResult, secondResult);
+    _jtd_constructor_172_impl(firstResult, secondResult);
   }
-  _jtd_constructor_169_impl(ErrorResult firstResult, ErrorResult secondResult) {
+  _jtd_constructor_172_impl(ErrorResult firstResult, ErrorResult secondResult) {
     _errors.addAll(firstResult._errors);
     _errors.addAll(secondResult._errors);
   }
@@ -717,14 +752,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.
@@ -735,17 +773,20 @@
     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.
@@ -816,20 +857,24 @@
   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.
@@ -855,28 +900,69 @@
     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
@@ -887,6 +973,9 @@
   EvaluationResultImpl add(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.addToValid(node, this);
   EvaluationResultImpl bitAnd(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitAndValid(node, this);
   EvaluationResultImpl bitNot(Expression node) {
+    if (isSomeInt()) {
+      return RESULT_INT;
+    }
     if (_value == null) {
       return error(node);
     } else if (_value is int) {
@@ -907,6 +996,9 @@
   EvaluationResultImpl lessThanOrEqual(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.lessThanOrEqualValid(node, this);
   EvaluationResultImpl logicalAnd(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.logicalAndValid(node, this);
   EvaluationResultImpl logicalNot(Expression node) {
+    if (isSomeBool()) {
+      return RESULT_BOOL;
+    }
     if (_value == null) {
       return RESULT_TRUE;
     } else if (_value is bool) {
@@ -917,6 +1009,9 @@
   EvaluationResultImpl logicalOr(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.logicalOrValid(node, this);
   EvaluationResultImpl minus(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.minusValid(node, this);
   EvaluationResultImpl negated(Expression node) {
+    if (isSomeNum()) {
+      return RESULT_INT;
+    }
     if (_value == null) {
       return error(node);
     } else if (_value is int) {
@@ -953,6 +1048,12 @@
   }
   EvaluationResultImpl addToError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl addToValid(BinaryExpression node, ValidResult leftOperand2) {
+    if (isSomeNum() || leftOperand2.isSomeNum()) {
+      if (isAnyNum() && leftOperand2.isAnyNum()) {
+        return RESULT_NUM;
+      }
+      return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
+    }
     Object leftValue = leftOperand2.value;
     if (leftValue == null) {
       return error(node.leftOperand);
@@ -979,6 +1080,12 @@
   }
   EvaluationResultImpl bitAndError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl bitAndValid(BinaryExpression node, ValidResult leftOperand2) {
+    if (isSomeInt() || leftOperand2.isSomeInt()) {
+      if (isAnyInt() && leftOperand2.isAnyInt()) {
+        return RESULT_INT;
+      }
+      return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_INT);
+    }
     Object leftValue = leftOperand2.value;
     if (leftValue == null) {
       return error(node.leftOperand);
@@ -997,6 +1104,12 @@
   }
   EvaluationResultImpl bitOrError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl bitOrValid(BinaryExpression node, ValidResult leftOperand2) {
+    if (isSomeInt() || leftOperand2.isSomeInt()) {
+      if (isAnyInt() && leftOperand2.isAnyInt()) {
+        return RESULT_INT;
+      }
+      return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_INT);
+    }
     Object leftValue = leftOperand2.value;
     if (leftValue == null) {
       return error(node.leftOperand);
@@ -1015,6 +1128,12 @@
   }
   EvaluationResultImpl bitXorError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl bitXorValid(BinaryExpression node, ValidResult leftOperand2) {
+    if (isSomeInt() || leftOperand2.isSomeInt()) {
+      if (isAnyInt() && leftOperand2.isAnyInt()) {
+        return RESULT_INT;
+      }
+      return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_INT);
+    }
     Object leftValue = leftOperand2.value;
     if (leftValue == null) {
       return error(node.leftOperand);
@@ -1041,6 +1160,12 @@
   }
   EvaluationResultImpl divideError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl divideValid(BinaryExpression node, ValidResult leftOperand2) {
+    if (isSomeNum() || leftOperand2.isSomeNum()) {
+      if (isAnyNum() && leftOperand2.isAnyNum()) {
+        return RESULT_NUM;
+      }
+      return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
+    }
     Object leftValue = leftOperand2.value;
     if (leftValue == null) {
       return error(node.leftOperand);
@@ -1066,6 +1191,11 @@
   }
   EvaluationResultImpl equalEqualError(Expression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl equalEqualValid(Expression node, ValidResult leftOperand) {
+    if (node is BinaryExpression) {
+      if (!isAnyNullBoolNumString() || !leftOperand.isAnyNullBoolNumString()) {
+        return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING);
+      }
+    }
     Object leftValue = leftOperand.value;
     if (leftValue == null) {
       return valueOf2(_value == null);
@@ -1099,6 +1229,12 @@
   EvaluationResultImpl greaterThanError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl greaterThanOrEqualError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl greaterThanOrEqualValid(BinaryExpression node, ValidResult leftOperand2) {
+    if (isSomeNum() || leftOperand2.isSomeNum()) {
+      if (isAnyNum() && leftOperand2.isAnyNum()) {
+        return RESULT_BOOL;
+      }
+      return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
+    }
     Object leftValue = leftOperand2.value;
     if (leftValue == null) {
       return error(node.leftOperand);
@@ -1120,6 +1256,12 @@
     return error(node);
   }
   EvaluationResultImpl greaterThanValid(BinaryExpression node, ValidResult leftOperand2) {
+    if (isSomeNum() || leftOperand2.isSomeNum()) {
+      if (isAnyNum() && leftOperand2.isAnyNum()) {
+        return RESULT_BOOL;
+      }
+      return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
+    }
     Object leftValue = leftOperand2.value;
     if (leftValue == null) {
       return error(node.leftOperand);
@@ -1142,6 +1284,12 @@
   }
   EvaluationResultImpl integerDivideError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl integerDivideValid(BinaryExpression node, ValidResult leftOperand2) {
+    if (isSomeNum() || leftOperand2.isSomeNum()) {
+      if (isAnyNum() && leftOperand2.isAnyNum()) {
+        return RESULT_INT;
+      }
+      return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
+    }
     Object leftValue = leftOperand2.value;
     if (leftValue == null) {
       return error(node.leftOperand);
@@ -1171,6 +1319,12 @@
   EvaluationResultImpl lessThanError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl lessThanOrEqualError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl lessThanOrEqualValid(BinaryExpression node, ValidResult leftOperand2) {
+    if (isSomeNum() || leftOperand2.isSomeNum()) {
+      if (isAnyNum() && leftOperand2.isAnyNum()) {
+        return RESULT_BOOL;
+      }
+      return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
+    }
     Object leftValue = leftOperand2.value;
     if (leftValue == null) {
       return error(node.leftOperand);
@@ -1192,6 +1346,12 @@
     return error(node);
   }
   EvaluationResultImpl lessThanValid(BinaryExpression node, ValidResult leftOperand2) {
+    if (isSomeNum() || leftOperand2.isSomeNum()) {
+      if (isAnyNum() && leftOperand2.isAnyNum()) {
+        return RESULT_BOOL;
+      }
+      return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
+    }
     Object leftValue = leftOperand2.value;
     if (leftValue == null) {
       return error(node.leftOperand);
@@ -1214,14 +1374,29 @@
   }
   EvaluationResultImpl logicalAndError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl logicalAndValid(BinaryExpression node, ValidResult leftOperand) {
-    Object leftValue = leftOperand.value;
-    if (leftValue is bool && ((leftValue as bool))) {
-      return booleanConversion(node.rightOperand, _value);
+    if (isSomeBool() || leftOperand.isSomeBool()) {
+      if (isAnyBool() && leftOperand.isAnyBool()) {
+        return RESULT_BOOL;
+      }
+      return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL);
     }
-    return RESULT_FALSE;
+    Object leftValue = leftOperand.value;
+    if (leftValue is bool) {
+      if (((leftValue as bool))) {
+        return booleanConversion(node.rightOperand, _value);
+      }
+      return RESULT_FALSE;
+    }
+    return error(node);
   }
   EvaluationResultImpl logicalOrError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl logicalOrValid(BinaryExpression node, ValidResult leftOperand) {
+    if (isSomeBool() || leftOperand.isSomeBool()) {
+      if (isAnyBool() && leftOperand.isAnyBool()) {
+        return RESULT_BOOL;
+      }
+      return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL);
+    }
     Object leftValue = leftOperand.value;
     if (leftValue is bool && ((leftValue as bool))) {
       return RESULT_TRUE;
@@ -1230,6 +1405,12 @@
   }
   EvaluationResultImpl minusError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl minusValid(BinaryExpression node, ValidResult leftOperand2) {
+    if (isSomeNum() || leftOperand2.isSomeNum()) {
+      if (isAnyNum() && leftOperand2.isAnyNum()) {
+        return RESULT_NUM;
+      }
+      return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
+    }
     Object leftValue = leftOperand2.value;
     if (leftValue == null) {
       return error(node.leftOperand);
@@ -1252,6 +1433,9 @@
   }
   EvaluationResultImpl notEqualError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl notEqualValid(BinaryExpression node, ValidResult leftOperand) {
+    if (!isAnyNullBoolNumString() || !leftOperand.isAnyNullBoolNumString()) {
+      return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING);
+    }
     Object leftValue = leftOperand.value;
     if (leftValue == null) {
       return valueOf2(_value != null);
@@ -1284,6 +1468,12 @@
   }
   EvaluationResultImpl remainderError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl remainderValid(BinaryExpression node, ValidResult leftOperand2) {
+    if (isSomeNum() || leftOperand2.isSomeNum()) {
+      if (isAnyNum() && leftOperand2.isAnyNum()) {
+        return RESULT_NUM;
+      }
+      return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
+    }
     Object leftValue = leftOperand2.value;
     if (leftValue == null) {
       return error(node.leftOperand);
@@ -1309,6 +1499,12 @@
   }
   EvaluationResultImpl shiftLeftError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl shiftLeftValid(BinaryExpression node, ValidResult leftOperand2) {
+    if (isSomeInt() || leftOperand2.isSomeInt()) {
+      if (isAnyInt() && leftOperand2.isAnyInt()) {
+        return RESULT_INT;
+      }
+      return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_INT);
+    }
     Object leftValue = leftOperand2.value;
     if (leftValue == null) {
       return error(node.leftOperand);
@@ -1327,6 +1523,12 @@
   }
   EvaluationResultImpl shiftRightError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl shiftRightValid(BinaryExpression node, ValidResult leftOperand2) {
+    if (isSomeInt() || leftOperand2.isSomeInt()) {
+      if (isAnyInt() && leftOperand2.isAnyInt()) {
+        return RESULT_INT;
+      }
+      return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_INT);
+    }
     Object leftValue = leftOperand2.value;
     if (leftValue == null) {
       return error(node.leftOperand);
@@ -1345,6 +1547,12 @@
   }
   EvaluationResultImpl timesError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
   EvaluationResultImpl timesValid(BinaryExpression node, ValidResult leftOperand2) {
+    if (isSomeNum() || leftOperand2.isSomeNum()) {
+      if (isAnyNum() && leftOperand2.isAnyNum()) {
+        return RESULT_NUM;
+      }
+      return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
+    }
     Object leftValue = leftOperand2.value;
     if (leftValue == null) {
       return error(node.leftOperand);
@@ -1365,6 +1573,8 @@
     }
     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
@@ -1372,14 +1582,17 @@
    * @return the result of applying boolean conversion to the given value
    */
   EvaluationResultImpl booleanConversion(ASTNode node, Object value) {
-    if (value == null) {
-      return error(node);
-    } else if (value is bool && ((value as bool))) {
-      return RESULT_TRUE;
+    if (value is bool) {
+      if (((value as bool))) {
+        return RESULT_TRUE;
+      } else {
+        return RESULT_FALSE;
+      }
     }
-    return RESULT_FALSE;
+    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
@@ -1387,7 +1600,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
@@ -1395,24 +1644,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 3f0a671..3ed952a 100644
--- a/pkg/analyzer_experimental/lib/src/generated/element.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/element.dart
@@ -15,12 +15,14 @@
 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.
@@ -28,47 +30,83 @@
    */
   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.
+   * 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.
+   * @param getterName the name of the getter to be returned
+   * @return the getter declared in this class with the given name
+   */
+  PropertyAccessorElement getGetter(String getterName);
+  
   /**
    * Return an array containing all of the interfaces that are implemented by this class.
+   * <p>
+   * <b>Note:</b> Because the element model represents the state of the code, it is possible for it
+   * to be semantically invalid. In particular, it is not safe to assume that the inheritance
+   * structure of a class does not contain a cycle. Clients that traverse the inheritance structure
+   * must explicitly guard against infinite loops.
    * @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.
+   * @param methodName the name of the method to be returned
+   * @return the method declared in this class with the given name
+   */
+  MethodElement getMethod(String methodName);
+  
   /**
    * Return an array containing all of the methods declared in this 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.
+   * <p>
+   * <b>Note:</b> Because the element model represents the state of the code, it is possible for it
+   * to be semantically invalid. In particular, it is not safe to assume that the inheritance
+   * structure of a class does not contain a cycle. Clients that traverse the inheritance structure
+   * must explicitly guard against infinite loops.
    * @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.
@@ -76,23 +114,40 @@
    * @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.
+   * @param setterName the name of the getter to be returned
+   * @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
    * explicitly declared then the implicit superclass 'Object' will be returned.
+   * <p>
+   * <b>Note:</b> Because the element model represents the state of the code, it is possible for it
+   * to be semantically invalid. In particular, it is not safe to assume that the inheritance
+   * structure of a class does not contain a cycle. Clients that traverse the inheritance structure
+   * must explicitly guard against infinite loops.
    * @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
@@ -101,17 +156,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:
@@ -122,22 +193,7 @@
    * @return {@code true} if this class can validly be used as a mixin
    */
   bool isValidMixin();
-  /**
-   * Return the executable element representing the method, getter or setter that results from
-   * looking up the given member in this class with respect to the given library, or {@code null} if
-   * the look up fails. This method is used to determine what member the passed name is inherited
-   * from. The behavior of this method is defined by the Dart Language Specification in section
-   * 8.1.1: Let <i>C</i> be a class declared in library <i>L</i> with superclass <i>S</i> and let
-   * <i>C</i> declare an instance member <i>m</i>, and assume <i>S</i> declares an instance member
-   * </i>m'</i> with the same name as m. Then <i>m</i> overrides m'</i> iff <i>m'</i> is accessible
-   * to <i>L</i>, <i>m</i> has the same name as <i>m'</i> and neither <i>m</i> nor <i>m'</i> are
-   * fields.
-   * @param memberName the name of the member being looked up
-   * @param library the library with respect to which the lookup is being performed
-   * @return the result of looking up the given member in this class with respect to the given
-   * library
-   */
-  ExecutableElement lookUpExecutable(String memberName, 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
@@ -158,6 +214,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
@@ -177,6 +234,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
@@ -198,38 +256,45 @@
    */
   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 {
+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.
@@ -237,34 +302,46 @@
    * @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
@@ -287,17 +364,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;
+  
   /**
    * 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
@@ -308,28 +388,42 @@
    * 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>
+   * In most cases the name and the display name are the same. Differences though are cases such as
+   * setters where the name of some setter {@code set f(x)} is {@code f=}, instead of {@code f}.
+   * @return the display name of this element
+   */
+  String get displayName;
+  
   /**
    * Return the element that either physically or logically encloses this element. This will be{@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
@@ -337,22 +431,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
@@ -360,12 +458,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:
@@ -375,6 +475,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
@@ -382,6 +483,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.
@@ -389,6 +491,7 @@
    */
   void visitChildren(ElementVisitor<Object> visitor);
 }
+
 /**
  * The enumeration {@code ElementKind} defines the various kinds of elements in the element model.
  * @coverage dart.engine.element
@@ -420,9 +523,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];
-  final String __name;
-  final int __ordinal;
-  int get ordinal => __ordinal;
+  
+  /// 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.
@@ -435,31 +542,36 @@
     }
     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
    */
-  ElementKind(this.__name, this.__ordinal, String displayName) {
+  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.
    */
   String get displayName => _displayName;
-  int compareTo(ElementKind other) => __ordinal - other.__ordinal;
-  String toString() => __name;
+  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.
@@ -467,6 +579,7 @@
    */
   String get encoding;
 }
+
 /**
  * The interface {@code ElementVisitor} defines the behavior of objects that can be used to visit an
  * element structure.
@@ -496,49 +609,58 @@
   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
@@ -546,6 +668,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.
@@ -553,28 +676,33 @@
    */
   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 {
+abstract class ExportElement implements Element, UriReferencedElement {
+  
   /**
    * An empty array of export elements.
    */
   static 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
@@ -582,6 +710,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.
@@ -589,23 +718,27 @@
    */
   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.
@@ -613,45 +746,53 @@
    */
   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.
@@ -659,11 +800,13 @@
    */
   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
@@ -672,6 +815,7 @@
    */
   List<HtmlScriptElement> get scripts;
 }
+
 /**
  * The interface {@code HtmlScriptElement} defines the behavior of elements representing a script
  * tag in an HTML file.
@@ -681,27 +825,32 @@
  */
 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 {
+abstract class ImportElement implements Element, UriReferencedElement {
+  
   /**
    * An empty array of import elements.
    */
   static 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.
@@ -709,44 +858,52 @@
    */
   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
@@ -754,23 +911,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.
@@ -778,16 +939,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.
@@ -796,12 +960,14 @@
    */
   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
@@ -820,6 +986,7 @@
    */
   SourceRange get visibleRange;
 }
+
 /**
  * The interface {@code LocalVariableElement} defines the behavior common to elements that represent
  * a local variable.
@@ -827,17 +994,20 @@
  */
 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.
@@ -845,6 +1015,7 @@
    */
   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
@@ -854,6 +1025,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.
@@ -861,57 +1033,67 @@
    */
   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);
 }
+
 /**
  * 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
@@ -928,23 +1110,50 @@
  * @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
+   * getter.
+   * @return the getter that corresponds to this setter
+   */
+  PropertyAccessorElement get correspondingGetter;
+  
+  /**
+   * Return the accessor representing the setter that corresponds to (has the same name as) this
+   * getter, or {@code null} if this accessor is not a getter or if there is no corresponding
+   * setter.
+   * @return the setter that corresponds to this getter
+   */
+  PropertyAccessorElement get correspondingSetter;
+  
   /**
    * Return the field or top-level variable associated with this accessor. If this accessor was
    * explicitly defined (is not synthetic) then the variable associated with it will be synthetic.
    * @return the variable associated with this accessor
    */
   PropertyInducingElement get variable;
+  
+  /**
+   * Return {@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
@@ -962,12 +1171,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
@@ -976,6 +1187,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.
@@ -983,12 +1195,14 @@
    */
   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.
@@ -996,6 +1210,7 @@
    */
   List<String> get shownNames;
 }
+
 /**
  * The interface {@code TopLevelVariableElement} defines the behavior of elements representing a
  * top-level variable.
@@ -1003,24 +1218,28 @@
  */
 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
@@ -1030,12 +1249,28 @@
  */
 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
@@ -1043,17 +1278,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
@@ -1062,6 +1300,7 @@
    */
   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
@@ -1155,6 +1394,7 @@
   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
@@ -1256,6 +1496,7 @@
     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
@@ -1287,19 +1528,23 @@
   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
@@ -1311,52 +1556,64 @@
   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
@@ -1366,7 +1623,7 @@
   accept(ElementVisitor visitor) => visitor.visitClassElement(this);
   List<PropertyAccessorElement> get accessors => _accessors;
   List<InterfaceType> get allSupertypes {
-    Set<InterfaceType> list = new Set<InterfaceType>();
+    List<InterfaceType> list = new List<InterfaceType>();
     collectAllSupertypes(list);
     return new List.from(list);
   }
@@ -1399,21 +1656,7 @@
     return null;
   }
   List<ConstructorElement> get constructors => _constructors;
-  /**
-   * Return the executable elemement representing the getter, setter or method with the given name
-   * that is declared in this class, or {@code null} if this class does not declare a member with
-   * the given name.
-   * @param memberName the name of the getter to be returned
-   * @return the member declared in this class with the given name
-   */
-  ExecutableElement getExecutable(String memberName) {
-    for (PropertyAccessorElement accessor in _accessors) {
-      if (accessor.name == memberName) {
-        return accessor;
-      }
-    }
-    return getMethod(memberName);
-  }
+  
   /**
    * Given some name, this returns the {@link FieldElement} with the matching name, if there is no
    * such field, then {@code null} is returned.
@@ -1429,12 +1672,6 @@
     return null;
   }
   List<FieldElement> get fields => _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.
-   * @param getterName the name of the getter to be returned
-   * @return the getter declared in this class with the given name
-   */
   PropertyAccessorElement getGetter(String getterName) {
     for (PropertyAccessorElement accessor in _accessors) {
       if (accessor.isGetter() && accessor.name == getterName) {
@@ -1445,12 +1682,6 @@
   }
   List<InterfaceType> get interfaces => _interfaces;
   ElementKind get kind => ElementKind.CLASS;
-  /**
-   * 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.
-   * @param methodName the name of the method to be returned
-   * @return the method declared in this class with the given name
-   */
   MethodElement getMethod(String methodName) {
     for (MethodElement method in _methods) {
       if (method.name == methodName) {
@@ -1470,13 +1701,10 @@
     }
     return null;
   }
-  /**
-   * 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.
-   * @param setterName the name of the getter to be returned
-   * @return the setter declared in this class with the given name
-   */
   PropertyAccessorElement getSetter(String setterName) {
+    if (!setterName.endsWith("=")) {
+      setterName += '=';
+    }
     for (PropertyAccessorElement accessor in _accessors) {
       if (accessor.isSetter() && accessor.name == setterName) {
         return accessor;
@@ -1489,105 +1717,123 @@
   List<TypeVariableElement> get typeVariables => _typeVariables;
   ConstructorElement get unnamedConstructor {
     for (ConstructorElement element in constructors) {
-      String name2 = element.name;
-      if (name2 == null || name2.isEmpty) {
+      String name = element.displayName;
+      if (name == null || name.isEmpty) {
         return element;
       }
     }
     return null;
   }
+  bool hasNonFinalField() {
+    List<ClassElement> classesToVisit = new List<ClassElement>();
+    Set<ClassElement> visitedClasses = new Set<ClassElement>();
+    classesToVisit.add(this);
+    while (!classesToVisit.isEmpty) {
+      ClassElement currentElement = classesToVisit.removeAt(0);
+      if (javaSetAdd(visitedClasses, currentElement)) {
+        for (FieldElement field in currentElement.fields) {
+          if (!field.isFinal() && !field.isConst() && !field.isStatic() && !field.isSynthetic()) {
+            return true;
+          }
+        }
+        for (InterfaceType mixinType in currentElement.mixins) {
+          ClassElement mixinElement = mixinType.element;
+          classesToVisit.add(mixinElement);
+        }
+        InterfaceType supertype2 = currentElement.supertype;
+        if (supertype2 != null) {
+          ClassElement superElement = supertype2.element;
+          if (superElement != null) {
+            classesToVisit.add(superElement);
+          }
+        }
+      }
+    }
+    return false;
+  }
+  bool hasReferenceToSuper() => hasModifier(Modifier.REFERENCES_SUPER);
   bool isAbstract() => hasModifier(Modifier.ABSTRACT);
   bool isTypedef() => hasModifier(Modifier.TYPEDEF);
   bool isValidMixin() => hasModifier(Modifier.MIXIN);
-  ExecutableElement lookUpExecutable(String memberName, LibraryElement library) {
-    ExecutableElement element = getExecutable(memberName);
-    if (element != null && element.isAccessibleIn(library)) {
-      return element;
-    }
-    for (InterfaceType mixin in _mixins) {
-      ClassElement mixinElement = mixin.element;
-      if (mixinElement != null) {
-        ClassElementImpl mixinElementImpl = mixinElement as ClassElementImpl;
-        element = mixinElementImpl.getExecutable(memberName);
-        if (element != null && element.isAccessibleIn(library)) {
-          return element;
-        }
-      }
-    }
-    if (_supertype != null) {
-      ClassElement supertypeElement = _supertype.element;
-      if (supertypeElement != null) {
-        return supertypeElement.lookUpExecutable(memberName, library);
-      }
-    }
-    return null;
-  }
   PropertyAccessorElement lookUpGetter(String getterName, LibraryElement library) {
-    PropertyAccessorElement element = getGetter(getterName);
-    if (element != null && element.isAccessibleIn(library)) {
-      return element;
-    }
-    for (InterfaceType mixin in _mixins) {
-      ClassElement mixinElement = mixin.element;
-      if (mixinElement != null) {
-        element = ((mixinElement as ClassElementImpl)).getGetter(getterName);
-        if (element != null && element.isAccessibleIn(library)) {
-          return element;
+    Set<ClassElement> visitedClasses = new Set<ClassElement>();
+    ClassElement currentElement = this;
+    while (currentElement != null && !visitedClasses.contains(currentElement)) {
+      javaSetAdd(visitedClasses, currentElement);
+      PropertyAccessorElement element = currentElement.getGetter(getterName);
+      if (element != null && element.isAccessibleIn(library)) {
+        return element;
+      }
+      for (InterfaceType mixin in currentElement.mixins) {
+        ClassElement mixinElement = mixin.element;
+        if (mixinElement != null) {
+          element = mixinElement.getGetter(getterName);
+          if (element != null && element.isAccessibleIn(library)) {
+            return element;
+          }
         }
       }
-    }
-    if (_supertype != null) {
-      ClassElement supertypeElement = _supertype.element;
-      if (supertypeElement != null) {
-        return supertypeElement.lookUpGetter(getterName, library);
+      InterfaceType supertype2 = currentElement.supertype;
+      if (supertype2 == null) {
+        return null;
       }
+      currentElement = supertype2.element;
     }
     return null;
   }
   MethodElement lookUpMethod(String methodName, LibraryElement library) {
-    MethodElement element = getMethod(methodName);
-    if (element != null && element.isAccessibleIn(library)) {
-      return element;
-    }
-    for (InterfaceType mixin in _mixins) {
-      ClassElement mixinElement = mixin.element;
-      if (mixinElement != null) {
-        element = ((mixinElement as ClassElementImpl)).getMethod(methodName);
-        if (element != null && element.isAccessibleIn(library)) {
-          return element;
+    Set<ClassElement> visitedClasses = new Set<ClassElement>();
+    ClassElement currentElement = this;
+    while (currentElement != null && !visitedClasses.contains(currentElement)) {
+      javaSetAdd(visitedClasses, currentElement);
+      MethodElement element = currentElement.getMethod(methodName);
+      if (element != null && element.isAccessibleIn(library)) {
+        return element;
+      }
+      for (InterfaceType mixin in currentElement.mixins) {
+        ClassElement mixinElement = mixin.element;
+        if (mixinElement != null) {
+          element = mixinElement.getMethod(methodName);
+          if (element != null && element.isAccessibleIn(library)) {
+            return element;
+          }
         }
       }
-    }
-    if (_supertype != null) {
-      ClassElement supertypeElement = _supertype.element;
-      if (supertypeElement != null) {
-        return supertypeElement.lookUpMethod(methodName, library);
+      InterfaceType supertype2 = currentElement.supertype;
+      if (supertype2 == null) {
+        return null;
       }
+      currentElement = supertype2.element;
     }
     return null;
   }
   PropertyAccessorElement lookUpSetter(String setterName, LibraryElement library) {
-    PropertyAccessorElement element = getSetter(setterName);
-    if (element != null && element.isAccessibleIn(library)) {
-      return element;
-    }
-    for (InterfaceType mixin in _mixins) {
-      ClassElement mixinElement = mixin.element;
-      if (mixinElement != null) {
-        element = ((mixinElement as ClassElementImpl)).getSetter(setterName);
-        if (element != null && element.isAccessibleIn(library)) {
-          return element;
+    Set<ClassElement> visitedClasses = new Set<ClassElement>();
+    ClassElement currentElement = this;
+    while (currentElement != null && !visitedClasses.contains(currentElement)) {
+      javaSetAdd(visitedClasses, currentElement);
+      PropertyAccessorElement element = currentElement.getSetter(setterName);
+      if (element != null && element.isAccessibleIn(library)) {
+        return element;
+      }
+      for (InterfaceType mixin in currentElement.mixins) {
+        ClassElement mixinElement = mixin.element;
+        if (mixinElement != null) {
+          element = mixinElement.getSetter(setterName);
+          if (element != null && element.isAccessibleIn(library)) {
+            return element;
+          }
         }
       }
-    }
-    if (_supertype != null) {
-      ClassElement supertypeElement = _supertype.element;
-      if (supertypeElement != null) {
-        return supertypeElement.lookUpSetter(setterName, library);
+      InterfaceType supertype2 = currentElement.supertype;
+      if (supertype2 == null) {
+        return null;
       }
+      currentElement = supertype2.element;
     }
     return null;
   }
+  
   /**
    * Set whether this class is abstract to correspond to the given value.
    * @param isAbstract {@code true} if the class is abstract
@@ -1595,6 +1841,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
@@ -1605,6 +1852,7 @@
     }
     this._accessors = accessors2;
   }
+  
   /**
    * Set the constructors contained in this class to the given constructors.
    * @param constructors the constructors contained in this class
@@ -1615,6 +1863,7 @@
     }
     this._constructors = constructors2;
   }
+  
   /**
    * Set the fields contained in this class to the given fields.
    * @param fields the fields contained in this class
@@ -1625,6 +1874,15 @@
     }
     this._fields = fields2;
   }
+  
+  /**
+   * Set whether this class references 'super' to the given value.
+   * @param isReferencedSuper {@code true} references 'super'
+   */
+  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
@@ -1632,6 +1890,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
@@ -1642,6 +1901,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.
@@ -1650,6 +1910,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
@@ -1657,6 +1918,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
@@ -1664,6 +1926,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
@@ -1671,6 +1934,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
@@ -1681,6 +1945,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
@@ -1697,11 +1962,11 @@
     safelyVisitChildren(_typeVariables, visitor);
   }
   void appendTo(JavaStringBuilder builder) {
-    String name2 = name;
-    if (name2 == null) {
+    String name = displayName;
+    if (name == null) {
       builder.append("{unnamed class}");
     } else {
-      builder.append(name2);
+      builder.append(name);
     }
     int variableCount = _typeVariables.length;
     if (variableCount > 0) {
@@ -1715,59 +1980,84 @@
       builder.append(">");
     }
   }
-  void collectAllSupertypes(Set<InterfaceType> list) {
-    if (_supertype == null || list.contains(_supertype)) {
-      return;
-    }
-    javaSetAdd(list, _supertype);
-    ((_supertype.element as ClassElementImpl)).collectAllSupertypes(list);
-    for (InterfaceType type in interfaces) {
-      if (!list.contains(type)) {
-        javaSetAdd(list, type);
-        ((type.element as ClassElementImpl)).collectAllSupertypes(list);
-      }
-    }
-    for (InterfaceType type in mixins) {
-      if (!list.contains(type)) {
-        javaSetAdd(list, type);
+  void collectAllSupertypes(List<InterfaceType> supertypes) {
+    List<InterfaceType> typesToVisit = new List<InterfaceType>();
+    List<ClassElement> visitedClasses = new List<ClassElement>();
+    typesToVisit.add(this.type);
+    while (!typesToVisit.isEmpty) {
+      InterfaceType currentType = typesToVisit.removeAt(0);
+      ClassElement currentElement = currentType.element;
+      if (!visitedClasses.contains(currentElement)) {
+        visitedClasses.add(currentElement);
+        if (currentType != this.type) {
+          supertypes.add(currentType);
+        }
+        InterfaceType supertype = currentType.superclass;
+        if (supertype != null) {
+          typesToVisit.add(supertype);
+        }
+        for (InterfaceType type in currentElement.interfaces) {
+          typesToVisit.add(type);
+        }
+        for (InterfaceType type in currentElement.mixins) {
+          ClassElement element2 = type.element;
+          if (!visitedClasses.contains(element2)) {
+            supertypes.add(type);
+          }
+        }
       }
     }
   }
 }
+
 /**
  * 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;
+  
   /**
-   * An empty array of compilation unit elements.
+   * 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.
    */
-  static List<CompilationUnitElement> EMPTY_ARRAY = new List<CompilationUnitElement>(0);
+  String _uri;
+  
   /**
    * Initialize a newly created compilation unit element to have the given name.
    * @param name the name of this element
@@ -1821,7 +2111,9 @@
     return null;
   }
   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.
@@ -1833,6 +2125,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
@@ -1843,6 +2136,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
@@ -1850,6 +2144,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
@@ -1860,6 +2155,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
@@ -1870,6 +2166,7 @@
     }
     this._typeAliases = typeAliases2;
   }
+  
   /**
    * Set the types contained in this compilation unit to the given types.
    * @param types types contained in this compilation unit
@@ -1880,6 +2177,14 @@
     }
     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.
+   */
+  void set uri(String uri2) {
+    this._uri = uri2;
+  }
   void visitChildren(ElementVisitor<Object> visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(_accessors, visitor);
@@ -1896,15 +2201,18 @@
     }
   }
 }
+
 /**
  * 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
@@ -1916,15 +2224,18 @@
     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
@@ -1936,16 +2247,19 @@
     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
@@ -1957,14 +2271,17 @@
     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
@@ -1976,15 +2293,23 @@
     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
@@ -1994,9 +2319,11 @@
   accept(ElementVisitor visitor) => visitor.visitConstructorElement(this);
   ClassElement get enclosingElement => super.enclosingElement as ClassElement;
   ElementKind get kind => ElementKind.CONSTRUCTOR;
+  ConstructorElement get redirectedConstructor => _redirectedConstructor;
   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
@@ -2004,6 +2331,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
@@ -2011,31 +2339,43 @@
   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
+   */
+  void set redirectedConstructor(ConstructorElement redirectedConstructor2) {
+    this._redirectedConstructor = redirectedConstructor2;
+  }
   void appendTo(JavaStringBuilder builder) {
-    builder.append(enclosingElement.name);
-    String name2 = name;
-    if (name2 != null && !name2.isEmpty) {
+    builder.append(enclosingElement.displayName);
+    String name = displayName;
+    if (name != null && !name.isEmpty) {
       builder.append(".");
-      builder.append(name2);
+      builder.append(name);
     }
     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
@@ -2046,11 +2386,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
@@ -2059,48 +2401,57 @@
     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_189_impl(name2);
+    _jtd_constructor_193_impl(name2);
   }
-  _jtd_constructor_189_impl(Identifier name2) {
-    _jtd_constructor_190_impl(name2 == null ? "" : name2.name, name2 == null ? -1 : name2.offset);
+  _jtd_constructor_193_impl(Identifier name2) {
+    _jtd_constructor_194_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
@@ -2108,9 +2459,9 @@
    * declaration of this element
    */
   ElementImpl.con2(String name2, int nameOffset2) {
-    _jtd_constructor_190_impl(name2, nameOffset2);
+    _jtd_constructor_194_impl(name2, nameOffset2);
   }
-  _jtd_constructor_190_impl(String name2, int nameOffset2) {
+  _jtd_constructor_194_impl(String name2, int nameOffset2) {
     this._name = StringUtilities.intern(name2);
     this._nameOffset = nameOffset2;
   }
@@ -2129,6 +2480,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
@@ -2141,6 +2493,7 @@
     }
     return _enclosingElement.context;
   }
+  String get displayName => _name;
   Element get enclosingElement => _enclosingElement;
   LibraryElement get library => getAncestor(LibraryElement);
   ElementLocation get location => new ElementLocationImpl.con1(this);
@@ -2166,6 +2519,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
@@ -2173,6 +2527,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
@@ -2182,6 +2537,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
@@ -2196,6 +2552,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
@@ -2209,18 +2566,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
@@ -2231,6 +2591,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
@@ -2243,6 +2604,7 @@
       }
     }
   }
+  
   /**
    * Set the enclosing element of this element to the given element.
    * @param element the enclosing element of this element
@@ -2250,6 +2612,7 @@
   void set enclosingElement(ElementImpl element) {
     _enclosingElement = element;
   }
+  
   /**
    * Set whether the given modifier is associated with this element to correspond to the given
    * value.
@@ -2272,27 +2635,31 @@
     }
   }
 }
+
 /**
  * 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_191_impl(element);
+    _jtd_constructor_195_impl(element);
   }
-  _jtd_constructor_191_impl(Element element) {
+  _jtd_constructor_195_impl(Element element) {
     List<String> components = new List<String>();
     Element ancestor = element;
     while (ancestor != null) {
@@ -2301,14 +2668,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_192_impl(encoding);
+    _jtd_constructor_196_impl(encoding);
   }
-  _jtd_constructor_192_impl(String encoding) {
+  _jtd_constructor_196_impl(String encoding) {
     this._components = decode(encoding);
   }
   bool operator ==(Object object) {
@@ -2318,6 +2686,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
@@ -2336,6 +2705,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
@@ -2367,6 +2737,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
@@ -2383,15 +2754,18 @@
     }
   }
 }
+
 /**
  * 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})
@@ -2401,6 +2775,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
@@ -2413,44 +2788,53 @@
     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_194_impl(name);
+    _jtd_constructor_198_impl(name);
   }
-  _jtd_constructor_194_impl(Identifier name) {
+  _jtd_constructor_198_impl(Identifier name) {
   }
+  
   /**
    * Initialize a newly created executable element to have the given name.
    * @param name the name of this element
@@ -2458,9 +2842,9 @@
    * declaration of this element
    */
   ExecutableElementImpl.con2(String name, int nameOffset) : super.con2(name, nameOffset) {
-    _jtd_constructor_195_impl(name, nameOffset);
+    _jtd_constructor_199_impl(name, nameOffset);
   }
-  _jtd_constructor_195_impl(String name, int nameOffset) {
+  _jtd_constructor_199_impl(String name, int nameOffset) {
   }
   ElementImpl getChild(String identifier2) {
     for (ExecutableElement function in _functions) {
@@ -2491,6 +2875,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
@@ -2501,6 +2886,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
@@ -2511,6 +2897,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
@@ -2521,6 +2908,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
@@ -2531,6 +2919,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
@@ -2561,20 +2950,29 @@
     }
   }
 }
+
 /**
  * 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.
    */
@@ -2584,6 +2982,8 @@
   List<NamespaceCombinator> get combinators => _combinators;
   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.
@@ -2592,6 +2992,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.
@@ -2600,21 +3001,32 @@
   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.
+   */
+  void set uri(String uri2) {
+    this._uri = uri2;
+  }
   void appendTo(JavaStringBuilder builder) {
     builder.append("export ");
     ((_exportedLibrary as LibraryElementImpl)).appendTo(builder);
   }
   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})
@@ -2624,6 +3036,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
@@ -2632,37 +3045,42 @@
     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_198_impl(name);
+    _jtd_constructor_202_impl(name);
   }
-  _jtd_constructor_198_impl(Identifier name) {
+  _jtd_constructor_202_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_199_impl(name);
+    _jtd_constructor_203_impl(name);
   }
-  _jtd_constructor_199_impl(String name) {
+  _jtd_constructor_203_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
@@ -2671,15 +3089,18 @@
     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
@@ -2688,6 +3109,8 @@
   }
   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
@@ -2696,42 +3119,49 @@
     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_201_impl();
+    _jtd_constructor_205_impl();
   }
-  _jtd_constructor_201_impl() {
+  _jtd_constructor_205_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_202_impl(name);
+    _jtd_constructor_206_impl(name);
   }
-  _jtd_constructor_202_impl(Identifier name) {
+  _jtd_constructor_206_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.
@@ -2739,9 +3169,9 @@
    * declaration of this element
    */
   FunctionElementImpl.con2(int nameOffset) : super.con2("", nameOffset) {
-    _jtd_constructor_203_impl(nameOffset);
+    _jtd_constructor_207_impl(nameOffset);
   }
-  _jtd_constructor_203_impl(int nameOffset) {
+  _jtd_constructor_207_impl(int nameOffset) {
   }
   accept(ElementVisitor visitor) => visitor.visitFunctionElement(this);
   String get identifier => name;
@@ -2753,6 +3183,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.
@@ -2765,34 +3196,40 @@
     _visibleRangeLength = length;
   }
   void appendTo(JavaStringBuilder builder) {
-    String name2 = name;
-    if (name2 != null) {
-      builder.append(name2);
+    String name = displayName;
+    if (name != null) {
+      builder.append(name);
     }
     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
@@ -2818,6 +3255,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
@@ -2830,6 +3268,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
@@ -2837,6 +3276,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
@@ -2854,7 +3294,7 @@
   }
   void appendTo(JavaStringBuilder builder) {
     builder.append("typedef ");
-    builder.append(name);
+    builder.append(displayName);
     int variableCount = _typeVariables.length;
     if (variableCount > 0) {
       builder.append("<");
@@ -2881,22 +3321,20 @@
     }
   }
 }
+
 /**
  * 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;
-  /**
-   * Initialize a newly created combinator.
-   */
-  HideCombinatorImpl() : super() {
-  }
   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.
@@ -2918,27 +3356,33 @@
     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
@@ -2954,6 +3398,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
@@ -2967,6 +3412,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
@@ -2986,15 +3432,18 @@
     }
   }
 }
+
 /**
  * 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})
@@ -3002,25 +3451,35 @@
   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.
    */
@@ -3031,6 +3490,8 @@
   LibraryElement get importedLibrary => _importedLibrary;
   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.
@@ -3039,6 +3500,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.
@@ -3047,6 +3509,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
@@ -3054,6 +3517,14 @@
   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.
+   */
+  void set uri(String uri2) {
+    this._uri = uri2;
+  }
   void visitChildren(ElementVisitor<Object> visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_prefix, visitor);
@@ -3062,25 +3533,30 @@
     builder.append("import ");
     ((_importedLibrary as LibraryElementImpl)).appendTo(builder);
   }
-  String get identifier => "${_importedLibrary.name}:${(_prefix == null ? "" : _prefix.name)}";
+  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
@@ -3094,26 +3570,31 @@
   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
@@ -3144,30 +3625,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
@@ -3264,6 +3752,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
@@ -3272,6 +3761,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
@@ -3279,6 +3769,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
@@ -3289,6 +3780,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
@@ -3303,6 +3795,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
@@ -3320,6 +3813,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
@@ -3348,24 +3842,29 @@
     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
@@ -3380,6 +3879,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.
@@ -3394,27 +3894,31 @@
   void appendTo(JavaStringBuilder builder) {
     builder.append(type);
     builder.append(" ");
-    builder.append(name);
+    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_212_impl(name);
+    _jtd_constructor_216_impl(name);
   }
-  _jtd_constructor_212_impl(Identifier name) {
+  _jtd_constructor_216_impl(Identifier name) {
   }
+  
   /**
    * Initialize a newly created method element to have the given name.
    * @param name the name of this element
@@ -3422,23 +3926,33 @@
    * declaration of this element
    */
   MethodElementImpl.con2(String name, int nameOffset) : super.con2(name, nameOffset) {
-    _jtd_constructor_213_impl(name, nameOffset);
+    _jtd_constructor_217_impl(name, nameOffset);
   }
-  _jtd_constructor_213_impl(String name, int nameOffset) {
+  _jtd_constructor_217_impl(String name, int nameOffset) {
   }
   accept(ElementVisitor visitor) => visitor.visitMethodElement(this);
   ClassElement get enclosingElement => super.enclosingElement as ClassElement;
   ElementKind get kind => ElementKind.METHOD;
+  String get name {
+    String name2 = super.name;
+    if (isOperator() && name2 == "-") {
+      if (parameters.length == 0) {
+        return "unary-";
+      }
+    }
+    return super.name;
+  }
   bool isAbstract() => hasModifier(Modifier.ABSTRACT);
   bool isOperator() {
-    String name2 = name;
-    if (name2.isEmpty) {
+    String name = displayName;
+    if (name.isEmpty) {
       return false;
     }
-    int first = name2.codeUnitAt(0);
+    int first = name.codeUnitAt(0);
     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
@@ -3446,6 +3960,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
@@ -3454,12 +3969,13 @@
     setModifier(Modifier.STATIC, isStatic);
   }
   void appendTo(JavaStringBuilder builder) {
-    builder.append(enclosingElement.name);
+    builder.append(enclosingElement.displayName);
     builder.append(".");
-    builder.append(name);
+    builder.append(displayName);
     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.
@@ -3471,39 +3987,47 @@
   static final Modifier FACTORY = new Modifier('FACTORY', 2);
   static final Modifier FINAL = new Modifier('FINAL', 3);
   static final Modifier GETTER = new Modifier('GETTER', 4);
-  static final Modifier INITIALIZING_FORMAL = new Modifier('INITIALIZING_FORMAL', 5);
-  static final Modifier MIXIN = new Modifier('MIXIN', 6);
+  static final Modifier MIXIN = new Modifier('MIXIN', 5);
+  static final Modifier REFERENCES_SUPER = new Modifier('REFERENCES_SUPER', 6);
   static final Modifier SETTER = new Modifier('SETTER', 7);
   static final Modifier STATIC = new Modifier('STATIC', 8);
   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, INITIALIZING_FORMAL, MIXIN, SETTER, STATIC, SYNTHETIC, TYPEDEF];
-  final String __name;
-  final int __ordinal;
-  int get ordinal => __ordinal;
-  Modifier(this.__name, this.__ordinal) {
+  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) {
   }
-  int compareTo(Modifier other) => __ordinal - other.__ordinal;
-  String toString() => __name;
+  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
@@ -3519,6 +4043,7 @@
   Element getAncestor(Type elementClass) => null;
   List<Element> get conflictingElements => _conflictingElements;
   AnalysisContext get context => _context;
+  String get displayName => _name;
   Element get enclosingElement => null;
   ElementKind get kind => ElementKind.ERROR;
   LibraryElement get library => null;
@@ -3551,6 +4076,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.
@@ -3566,6 +4092,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
@@ -3581,33 +4108,40 @@
     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
@@ -3624,14 +4158,8 @@
     }
     return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
   }
-  bool isInitializingFormal() => hasModifier(Modifier.INITIALIZING_FORMAL);
-  /**
-   * Set whether this parameter is an initializing formal parameter to match the given value.
-   * @param isInitializingFormal {@code true} if this parameter is an initializing formal parameter
-   */
-  void set initializingFormal(bool isInitializingFormal) {
-    setModifier(Modifier.INITIALIZING_FORMAL, isInitializingFormal);
-  }
+  bool isInitializingFormal() => false;
+  
   /**
    * Set the kind of this parameter to the given kind.
    * @param parameterKind the new kind of this parameter
@@ -3639,6 +4167,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
@@ -3649,6 +4178,7 @@
     }
     this._parameters = parameters2;
   }
+  
   /**
    * Set the visible range for this element to the range starting at the given offset with the given
    * length.
@@ -3680,23 +4210,27 @@
     builder.append(left);
     builder.append(type);
     builder.append(" ");
-    builder.append(name);
+    builder.append(displayName);
     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
@@ -3707,6 +4241,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
@@ -3722,52 +4257,85 @@
     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_218_impl(name);
+    _jtd_constructor_222_impl(name);
   }
-  _jtd_constructor_218_impl(Identifier name) {
+  _jtd_constructor_222_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, -1) {
-    _jtd_constructor_219_impl(variable2);
+  PropertyAccessorElementImpl.con2(PropertyInducingElementImpl variable2) : super.con2(variable2.name, variable2.nameOffset) {
+    _jtd_constructor_223_impl(variable2);
   }
-  _jtd_constructor_219_impl(PropertyInducingElementImpl variable2) {
+  _jtd_constructor_223_impl(PropertyInducingElementImpl variable2) {
     this._variable = variable2;
     synthetic = true;
   }
   accept(ElementVisitor visitor) => visitor.visitPropertyAccessorElement(this);
   bool operator ==(Object object) => super == object && identical(isGetter(), ((object as PropertyAccessorElement)).isGetter());
+  PropertyAccessorElement get correspondingGetter {
+    if (isGetter() || _variable == null) {
+      return null;
+    }
+    return _variable.getter;
+  }
+  PropertyAccessorElement get correspondingSetter {
+    if (isSetter() || _variable == null) {
+      return null;
+    }
+    return _variable.setter;
+  }
   ElementKind get kind {
     if (isGetter()) {
       return ElementKind.GETTER;
     }
     return ElementKind.SETTER;
   }
+  String get name {
+    if (isSetter()) {
+      return "${super.name}=";
+    }
+    return super.name;
+  }
   PropertyInducingElement get variable => _variable;
+  bool isAbstract() => hasModifier(Modifier.ABSTRACT);
   bool isGetter() => hasModifier(Modifier.GETTER);
   bool isSetter() => hasModifier(Modifier.SETTER);
-  bool isStatic() => variable.isStatic();
+  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
+   */
+  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
@@ -3775,6 +4343,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
@@ -3782,6 +4351,15 @@
   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
+   */
+  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
@@ -3791,48 +4369,55 @@
   }
   void appendTo(JavaStringBuilder builder) {
     builder.append(isGetter() ? "get " : "set ");
-    builder.append(variable.name);
+    builder.append(variable.displayName);
     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_220_impl(name);
+    _jtd_constructor_224_impl(name);
   }
-  _jtd_constructor_220_impl(Identifier name) {
+  _jtd_constructor_224_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_221_impl(name);
+    _jtd_constructor_225_impl(name);
   }
-  _jtd_constructor_221_impl(String name) {
+  _jtd_constructor_225_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
@@ -3840,6 +4425,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
@@ -3848,22 +4434,20 @@
     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;
-  /**
-   * Initialize a newly created combinator.
-   */
-  ShowCombinatorImpl() : super() {
-  }
   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.
@@ -3885,55 +4469,64 @@
     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_223_impl(name);
+    _jtd_constructor_227_impl(name);
   }
-  _jtd_constructor_223_impl(Identifier name) {
+  _jtd_constructor_227_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_224_impl(name);
+    _jtd_constructor_228_impl(name);
   }
-  _jtd_constructor_224_impl(String name) {
+  _jtd_constructor_228_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
@@ -3944,6 +4537,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
@@ -3951,6 +4545,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
@@ -3959,40 +4554,46 @@
     this._type = type2;
   }
   void appendTo(JavaStringBuilder builder) {
-    builder.append(name);
+    builder.append(displayName);
     if (_bound != null) {
       builder.append(" extends ");
       builder.append(_bound);
     }
   }
 }
+
 /**
  * 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_226_impl(name);
+    _jtd_constructor_230_impl(name);
   }
-  _jtd_constructor_226_impl(Identifier name) {
+  _jtd_constructor_230_impl(Identifier name) {
   }
+  
   /**
    * Initialize a newly created variable element to have the given name.
    * @param name the name of this element
@@ -4000,10 +4601,11 @@
    * declaration of this element
    */
   VariableElementImpl.con2(String name, int nameOffset) : super.con2(name, nameOffset) {
-    _jtd_constructor_227_impl(name, nameOffset);
+    _jtd_constructor_231_impl(name, nameOffset);
   }
-  _jtd_constructor_227_impl(String name, int nameOffset) {
+  _jtd_constructor_231_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
@@ -4015,6 +4617,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
@@ -4022,6 +4625,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.
@@ -4030,6 +4634,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
@@ -4037,6 +4642,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
@@ -4047,6 +4653,7 @@
     }
     this._initializer = initializer2;
   }
+  
   /**
    * Set the declared type of this variable to the given type.
    * @param type the declared type of this variable
@@ -4061,15 +4668,89 @@
   void appendTo(JavaStringBuilder builder) {
     builder.append(type);
     builder.append(" ");
-    builder.append(name);
+    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
+   * constructor member representing the given constructor. Return the member that was created, or
+   * the base constructor if no member was created.
+   * @param baseConstructor the base constructor for which a member might be created
+   * @param definingType the type defining the parameters and arguments to be used in the
+   * substitution
+   * @return the constructor element that will return the correctly substituted types
+   */
+  static ConstructorElement from(ConstructorElement baseConstructor, InterfaceType definingType) {
+    if (baseConstructor == null || definingType.typeArguments.length == 0) {
+      return baseConstructor;
+    }
+    FunctionType baseType = baseConstructor.type;
+    List<Type2> argumentTypes = definingType.typeArguments;
+    List<Type2> parameterTypes = TypeVariableTypeImpl.getTypes(definingType.element.typeVariables);
+    FunctionType substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
+    if (baseType == substitutedType) {
+      return baseConstructor;
+    }
+    return new ConstructorMember(baseConstructor, definingType);
+  }
+  
+  /**
+   * Initialize a newly created element to represent a constructor of the given parameterized type.
+   * @param baseElement the element on which the parameterized element was created
+   * @param definingType the type in which the element is defined
+   */
+  ConstructorMember(ConstructorElement baseElement, InterfaceType definingType) : super(baseElement, definingType) {
+  }
+  accept(ElementVisitor visitor) => visitor.visitConstructorElement(this);
+  ConstructorElement get baseElement => super.baseElement as ConstructorElement;
+  ClassElement get enclosingElement => baseElement.enclosingElement;
+  ConstructorElement get redirectedConstructor => from(baseElement.redirectedConstructor, definingType);
+  bool isConst() => baseElement.isConst();
+  bool isFactory() => baseElement.isFactory();
+  String toString() {
+    ConstructorElement baseElement2 = baseElement;
+    List<ParameterElement> parameters2 = parameters;
+    FunctionType type2 = type;
+    JavaStringBuilder builder = new JavaStringBuilder();
+    builder.append(baseElement2.enclosingElement.displayName);
+    String name = displayName;
+    if (name != null && !name.isEmpty) {
+      builder.append(".");
+      builder.append(name);
+    }
+    builder.append("(");
+    int parameterCount = parameters2.length;
+    for (int i = 0; i < parameterCount; i++) {
+      if (i > 0) {
+        builder.append(", ");
+      }
+      builder.append(parameters2[i]).toString();
+    }
+    builder.append(")");
+    if (type2 != null) {
+      builder.append(" -> ");
+      builder.append(type2.returnType);
+    }
+    return builder.toString();
+  }
+  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.
@@ -4109,11 +4790,13 @@
     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
@@ -4140,6 +4823,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
@@ -4153,43 +4837,48 @@
   PropertyAccessorElement get getter => PropertyAccessorMember.from(baseElement.getter, definingType);
   PropertyAccessorElement get setter => PropertyAccessorMember.from(baseElement.setter, definingType);
   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.
    */
-  InterfaceType _definingType;
+  ParameterizedType _definingType;
+  
   /**
    * Initialize a newly created element to represent the member of the given parameterized type.
    * @param baseElement the element on which the parameterized element was created
    * @param definingType the type in which the element is defined
    */
-  Member(Element baseElement, InterfaceType definingType) {
+  Member(Element baseElement, ParameterizedType definingType) {
     this._baseElement = baseElement;
     this._definingType = definingType;
   }
   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
    */
   Element get baseElement => _baseElement;
   AnalysisContext get context => _baseElement.context;
+  String get displayName => _baseElement.displayName;
   ElementKind get kind => _baseElement.kind;
   LibraryElement get library => _baseElement.library;
   ElementLocation get location => _baseElement.location;
-  List<Annotation> get metadata {
-    throw new UnsupportedOperationException();
-  }
+  List<Annotation> get metadata => _baseElement.metadata;
   String get name => _baseElement.name;
   int get nameOffset => _baseElement.nameOffset;
   Source get source => _baseElement.source;
@@ -4197,11 +4886,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
    */
-  InterfaceType get definingType => _definingType;
+  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
@@ -4212,6 +4903,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
@@ -4224,6 +4916,7 @@
       }
     }
   }
+  
   /**
    * Return the type that results from replacing the type parameters in the given type with the type
    * arguments.
@@ -4232,9 +4925,10 @@
    */
   Type2 substituteFor(Type2 type) {
     List<Type2> argumentTypes = _definingType.typeArguments;
-    List<Type2> parameterTypes = TypeVariableTypeImpl.getTypes(_definingType.element.typeVariables);
+    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.
@@ -4250,11 +4944,13 @@
     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
@@ -4278,6 +4974,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
@@ -4294,9 +4991,9 @@
     List<ParameterElement> parameters2 = parameters;
     FunctionType type2 = type;
     JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append(baseElement2.enclosingElement.name);
+    builder.append(baseElement2.enclosingElement.displayName);
     builder.append(".");
-    builder.append(baseElement2.name);
+    builder.append(baseElement2.displayName);
     builder.append("(");
     int parameterCount = parameters2.length;
     for (int i = 0; i < parameterCount; i++) {
@@ -4313,11 +5010,13 @@
     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
@@ -4328,33 +5027,40 @@
    * substitution
    * @return the parameter element that will return the correctly substituted types
    */
-  static ParameterElement from(ParameterElement baseParameter, InterfaceType definingType) {
+  static ParameterElement from(ParameterElement baseParameter, ParameterizedType definingType) {
     if (baseParameter == null || definingType.typeArguments.length == 0) {
       return baseParameter;
     }
     Type2 baseType = baseParameter.type;
     List<Type2> argumentTypes = definingType.typeArguments;
-    List<Type2> parameterTypes = TypeVariableTypeImpl.getTypes(definingType.element.typeVariables);
+    List<Type2> parameterTypes = TypeVariableTypeImpl.getTypes(definingType.typeVariables);
     Type2 substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
     if (baseType == substitutedType) {
       return baseParameter;
     }
     return new ParameterMember(baseParameter, definingType);
   }
+  
   /**
    * Initialize a newly created element to represent a parameter of the given parameterized type.
    * @param baseElement the element on which the parameterized element was created
    * @param definingType the type in which the element is defined
    */
-  ParameterMember(ParameterElement baseElement, InterfaceType definingType) : super(baseElement, definingType) {
+  ParameterMember(ParameterElement baseElement, ParameterizedType definingType) : super(baseElement, definingType) {
   }
   accept(ElementVisitor visitor) => visitor.visitParameterElement(this);
   Element getAncestor(Type elementClass) {
     Element element = baseElement.getAncestor(elementClass);
-    if (element is MethodElement) {
-      return MethodMember.from((element as MethodElement), definingType) as Element;
-    } else if (element is PropertyAccessorElement) {
-      return PropertyAccessorMember.from((element as PropertyAccessorElement), definingType) as Element;
+    ParameterizedType definingType2 = definingType;
+    if (definingType2 is InterfaceType) {
+      InterfaceType definingInterfaceType = definingType2 as InterfaceType;
+      if (element is ConstructorElement) {
+        return ConstructorMember.from((element as ConstructorElement), definingInterfaceType) as Element;
+      } else if (element is MethodElement) {
+        return MethodMember.from((element as MethodElement), definingInterfaceType) as Element;
+      } else if (element is PropertyAccessorElement) {
+        return PropertyAccessorMember.from((element as PropertyAccessorElement), definingInterfaceType) as Element;
+      }
     }
     return element;
   }
@@ -4393,7 +5099,7 @@
     builder.append(left);
     builder.append(type);
     builder.append(" ");
-    builder.append(baseElement2.name);
+    builder.append(baseElement2.displayName);
     builder.append(right);
     return builder.toString();
   }
@@ -4402,11 +5108,13 @@
     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
@@ -4430,6 +5138,7 @@
     }
     return new PropertyAccessorMember(baseAccessor, definingType);
   }
+  
   /**
    * Initialize a newly created element to represent a property accessor of the given parameterized
    * type.
@@ -4440,6 +5149,8 @@
   }
   accept(ElementVisitor visitor) => visitor.visitPropertyAccessorElement(this);
   PropertyAccessorElement get baseElement => super.baseElement as PropertyAccessorElement;
+  PropertyAccessorElement get correspondingGetter => from(baseElement.correspondingGetter, definingType);
+  PropertyAccessorElement get correspondingSetter => from(baseElement.correspondingSetter, definingType);
   Element get enclosingElement => baseElement.enclosingElement;
   PropertyInducingElement get variable {
     PropertyInducingElement variable2 = baseElement.variable;
@@ -4448,22 +5159,26 @@
     }
     return variable2;
   }
+  bool isAbstract() => baseElement.isAbstract();
   bool isGetter() => baseElement.isGetter();
   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.
    * @param baseElement the element on which the parameterized element was created
    * @param definingType the type in which the element is defined
    */
-  VariableMember(VariableElement baseElement, InterfaceType definingType) : super(baseElement, definingType) {
+  VariableMember(VariableElement baseElement, ParameterizedType definingType) : super(baseElement, definingType) {
   }
   VariableElement get baseElement => super.baseElement as VariableElement;
   FunctionElement get initializer {
@@ -4477,20 +5192,48 @@
     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
+   */
+  void set baseParameters(List<ParameterElement> parameters) {
+    this._baseParameters = parameters;
+  }
+  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.
    */
@@ -4502,20 +5245,24 @@
   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.
    */
@@ -4529,12 +5276,14 @@
   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
@@ -4559,6 +5308,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
@@ -4578,49 +5328,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_291_impl(element);
+    _jtd_constructor_298_impl(element);
   }
-  _jtd_constructor_291_impl(ExecutableElement element) {
+  _jtd_constructor_298_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_292_impl(element);
+    _jtd_constructor_299_impl(element);
   }
-  _jtd_constructor_292_impl(FunctionTypeAliasElement element) {
+  _jtd_constructor_299_impl(FunctionTypeAliasElement element) {
   }
   bool operator ==(Object object) {
     if (object is! FunctionTypeImpl) {
@@ -4629,11 +5386,92 @@
     FunctionTypeImpl otherType = object as FunctionTypeImpl;
     return element == otherType.element && JavaArrays.equals(_normalParameterTypes, otherType._normalParameterTypes) && JavaArrays.equals(_optionalParameterTypes, otherType._optionalParameterTypes) && equals2(_namedParameterTypes, otherType._namedParameterTypes) && _returnType == otherType._returnType;
   }
+  String get displayName {
+    String name2 = name;
+    if (name2 == null) {
+      JavaStringBuilder builder = new JavaStringBuilder();
+      builder.append("(");
+      bool needsComma = false;
+      if (_normalParameterTypes.length > 0) {
+        for (Type2 type in _normalParameterTypes) {
+          if (needsComma) {
+            builder.append(", ");
+          } else {
+            needsComma = true;
+          }
+          builder.append(type.displayName);
+        }
+      }
+      if (_optionalParameterTypes.length > 0) {
+        if (needsComma) {
+          builder.append(", ");
+          needsComma = false;
+        }
+        builder.append("[");
+        for (Type2 type in _optionalParameterTypes) {
+          if (needsComma) {
+            builder.append(", ");
+          } else {
+            needsComma = true;
+          }
+          builder.append(type.displayName);
+        }
+        builder.append("]");
+        needsComma = true;
+      }
+      if (_namedParameterTypes.length > 0) {
+        if (needsComma) {
+          builder.append(", ");
+          needsComma = false;
+        }
+        builder.append("{");
+        for (MapEntry<String, Type2> entry in getMapEntrySet(_namedParameterTypes)) {
+          if (needsComma) {
+            builder.append(", ");
+          } else {
+            needsComma = true;
+          }
+          builder.append(entry.getKey());
+          builder.append(": ");
+          builder.append(entry.getValue().displayName);
+        }
+        builder.append("}");
+        needsComma = true;
+      }
+      builder.append(") -> ");
+      if (_returnType == null) {
+        builder.append("null");
+      } else {
+        builder.append(_returnType.displayName);
+      }
+      name2 = builder.toString();
+    }
+    return name2;
+  }
   Map<String, Type2> get namedParameterTypes => _namedParameterTypes;
   List<Type2> get normalParameterTypes => _normalParameterTypes;
   List<Type2> get optionalParameterTypes => _optionalParameterTypes;
+  List<ParameterElement> get parameters {
+    List<ParameterElement> baseParameters2 = baseParameters;
+    int parameterCount = baseParameters2.length;
+    if (parameterCount == 0) {
+      return baseParameters2;
+    }
+    List<ParameterElement> specializedParameters = new List<ParameterElement>(parameterCount);
+    for (int i = 0; i < parameterCount; i++) {
+      specializedParameters[i] = ParameterMember.from(baseParameters2[i], this);
+    }
+    return specializedParameters;
+  }
   Type2 get returnType => _returnType;
   List<Type2> get typeArguments => _typeArguments;
+  List<TypeVariableElement> get typeVariables {
+    Element element2 = element;
+    if (element2 is FunctionTypeAliasElement) {
+      return ((element2 as FunctionTypeAliasElement)).typeVariables;
+    }
+    return TypeVariableElementImpl.EMPTY_ARRAY;
+  }
   int get hashCode {
     Element element2 = element;
     if (element2 == null) {
@@ -4644,7 +5482,7 @@
   bool isSubtypeOf(Type2 type) {
     if (type == null) {
       return false;
-    } else if (identical(this, type) || type.isDynamic() || type.isDartCoreFunction()) {
+    } else if (identical(this, type) || type.isDynamic() || type.isDartCoreFunction() || type.isObject()) {
       return true;
     } else if (type is! FunctionType) {
       return false;
@@ -4703,6 +5541,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.
@@ -4712,6 +5551,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.
@@ -4720,6 +5560,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.
@@ -4728,6 +5569,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
@@ -4735,6 +5577,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
@@ -4756,6 +5599,7 @@
     newType.normalParameterTypes = TypeImpl.substitute(_normalParameterTypes, argumentTypes, parameterTypes);
     newType.optionalParameterTypes = TypeImpl.substitute(_optionalParameterTypes, argumentTypes, parameterTypes);
     newType._namedParameterTypes = substitute3(_namedParameterTypes, argumentTypes, parameterTypes);
+    newType.typeArguments = argumentTypes;
     return newType;
   }
   void appendTo(JavaStringBuilder builder) {
@@ -4814,7 +5658,20 @@
       ((_returnType as TypeImpl)).appendTo(builder);
     }
   }
+  
+  /**
+   * @return the base parameter elements of this function element, not {@code null}.
+   */
+  List<ParameterElement> get baseParameters {
+    Element element2 = element;
+    if (element2 is ExecutableElement) {
+      return ((element2 as ExecutableElement)).parameters;
+    } else {
+      return ((element2 as FunctionTypeAliasElement)).parameters;
+    }
+  }
 }
+
 /**
  * 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
@@ -4822,58 +5679,68 @@
  * @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
    * @return the computed longest inheritance path to Object
-   * @see #computeLongestInheritancePathToObject(Type,int)
    * @see InterfaceType#getLeastUpperBound(Type)
    */
-  static int computeLongestInheritancePathToObject(InterfaceType type) => computeLongestInheritancePathToObject2(type, 0);
+  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
    * @return the {@link Set} of superinterfaces of the passed {@link Type}
-   * @see #computeSuperinterfaceSet(Type,HashSet)
    * @see #getLeastUpperBound(Type)
    */
   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)}.
    * @param type the {@link Type} to compute the longest inheritance path of from the passed{@link Type} to Object
    * @param depth a field used recursively
+   * @param visitedClasses the classes that have already been visited
    * @return the computed longest inheritance path to Object
    * @see #computeLongestInheritancePathToObject(Type)
    * @see #getLeastUpperBound(Type)
    */
-  static int computeLongestInheritancePathToObject2(InterfaceType type, int depth) {
+  static int computeLongestInheritancePathToObject2(InterfaceType type, int depth, Set<ClassElement> visitedClasses) {
     ClassElement classElement = type.element;
-    if (classElement.supertype == null) {
+    if (classElement.supertype == null || visitedClasses.contains(classElement)) {
       return depth;
     }
-    List<InterfaceType> superinterfaces = classElement.interfaces;
     int longestPath = 1;
-    int pathLength;
-    if (superinterfaces.length > 0) {
-      for (InterfaceType superinterface in superinterfaces) {
-        pathLength = computeLongestInheritancePathToObject2(superinterface, depth + 1);
-        if (pathLength > longestPath) {
-          longestPath = pathLength;
+    try {
+      javaSetAdd(visitedClasses, classElement);
+      List<InterfaceType> superinterfaces = classElement.interfaces;
+      int pathLength;
+      if (superinterfaces.length > 0) {
+        for (InterfaceType superinterface in superinterfaces) {
+          pathLength = computeLongestInheritancePathToObject2(superinterface, depth + 1, visitedClasses);
+          if (pathLength > longestPath) {
+            longestPath = pathLength;
+          }
         }
       }
-    }
-    InterfaceType supertype2 = classElement.supertype;
-    pathLength = computeLongestInheritancePathToObject2(supertype2, depth + 1);
-    if (pathLength > longestPath) {
-      longestPath = pathLength;
+      InterfaceType supertype2 = classElement.supertype;
+      pathLength = computeLongestInheritancePathToObject2(supertype2, depth + 1, visitedClasses);
+      if (pathLength > longestPath) {
+        longestPath = pathLength;
+      }
+    } finally {
+      visitedClasses.remove(classElement);
     }
     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)}.
@@ -4889,17 +5756,20 @@
       ClassElement classElement = element2 as ClassElement;
       List<InterfaceType> superinterfaces = classElement.interfaces;
       for (InterfaceType superinterface in superinterfaces) {
-        javaSetAdd(set, superinterface);
-        computeSuperinterfaceSet2(superinterface, set);
+        if (javaSetAdd(set, superinterface)) {
+          computeSuperinterfaceSet2(superinterface, set);
+        }
       }
       InterfaceType supertype2 = classElement.supertype;
       if (supertype2 != null) {
-        javaSetAdd(set, supertype2);
-        computeSuperinterfaceSet2(supertype2, set);
+        if (javaSetAdd(set, supertype2)) {
+          computeSuperinterfaceSet2(supertype2, set);
+        }
       }
     }
     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
@@ -4924,10 +5794,12 @@
     }
     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
-   * using the least upper bound of the corresponding type arguments.
+   * comparing the corresponding type arguments, keeping those that are the same, and using
+   * 'dynamic' for those that are different.
    * @param firstType the first type
    * @param secondType the second type
    * @return the "least upper bound" of the given types
@@ -4944,7 +5816,9 @@
     }
     List<Type2> lubArguments = new List<Type2>(argumentCount);
     for (int i = 0; i < argumentCount; i++) {
-      lubArguments[i] = firstArguments[i].getLeastUpperBound(secondArguments[i]);
+      if (firstArguments[i] == secondArguments[i]) {
+        lubArguments[i] = firstArguments[i];
+      }
       if (lubArguments[i] == null) {
         lubArguments[i] = DynamicTypeImpl.instance;
       }
@@ -4953,28 +5827,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.name) {
-    _jtd_constructor_293_impl(element);
+  InterfaceTypeImpl.con1(ClassElement element) : super(element, element.displayName) {
+    _jtd_constructor_300_impl(element);
   }
-  _jtd_constructor_293_impl(ClassElement element) {
+  _jtd_constructor_300_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_294_impl(name);
+    _jtd_constructor_301_impl(name);
   }
-  _jtd_constructor_294_impl(String name) {
+  _jtd_constructor_301_impl(String name) {
   }
   bool operator ==(Object object) {
     if (object is! InterfaceTypeImpl) {
@@ -5105,33 +5982,9 @@
     } else if (type is! InterfaceType) {
       return false;
     }
-    InterfaceType s = type as InterfaceType;
-    if (this == s) {
-      return true;
-    }
-    if (s.isDirectSupertypeOf(this)) {
-      return true;
-    }
-    ClassElement tElement = element;
-    ClassElement sElement = s.element;
-    if (tElement == sElement) {
-      List<Type2> tArguments = typeArguments;
-      List<Type2> sArguments = s.typeArguments;
-      if (tArguments.length != sArguments.length) {
-        return false;
-      }
-      for (int i = 0; i < tArguments.length; i++) {
-        if (!tArguments[i].isMoreSpecificThan(sArguments[i])) {
-          return false;
-        }
-      }
-      return true;
-    }
-    if (element.supertype == null) {
-      return false;
-    }
-    return element.supertype.isMoreSpecificThan(type);
+    return isMoreSpecificThan2((type as InterfaceType), new Set<ClassElement>());
   }
+  bool isObject() => element.supertype == null;
   bool isSubtypeOf(Type2 type) {
     if (identical(type, DynamicTypeImpl.instance)) {
       return true;
@@ -5142,60 +5995,40 @@
     } else if (this == type) {
       return true;
     }
-    InterfaceType typeT = this;
-    InterfaceType typeS = type as InterfaceType;
-    ClassElement elementT = element;
-    if (elementT == null) {
-      return false;
+    return isSubtypeOf2((type as InterfaceType), new Set<ClassElement>());
+  }
+  ConstructorElement lookUpConstructor(String constructorName, LibraryElement library) {
+    ConstructorElement constructorElement;
+    if (constructorName == null) {
+      constructorElement = element.unnamedConstructor;
+    } else {
+      constructorElement = element.getNamedConstructor(constructorName);
     }
-    typeT = substitute2(_typeArguments, TypeVariableTypeImpl.getTypes(elementT.typeVariables));
-    if (typeT == typeS) {
-      return true;
-    } else if (elementT == typeS.element) {
-      List<Type2> typeTArgs = typeT.typeArguments;
-      List<Type2> typeSArgs = typeS.typeArguments;
-      if (typeTArgs.length != typeSArgs.length) {
-        return false;
-      }
-      for (int i = 0; i < typeTArgs.length; i++) {
-        if (!typeTArgs[i].isSubtypeOf(typeSArgs[i])) {
-          return false;
-        }
-      }
-      return true;
+    if (constructorElement == null || !constructorElement.isAccessibleIn(library)) {
+      return null;
     }
-    Type2 supertype2 = elementT.supertype;
-    if (supertype2 == null) {
-      return false;
-    }
-    List<Type2> interfaceTypes = elementT.interfaces;
-    for (Type2 interfaceType in interfaceTypes) {
-      if (interfaceType.isSubtypeOf(typeS)) {
-        return true;
-      }
-    }
-    List<Type2> mixinTypes = elementT.mixins;
-    for (Type2 mixinType in mixinTypes) {
-      if (mixinType == typeS) {
-        return true;
-      }
-    }
-    return supertype2.isSubtypeOf(typeS);
+    return ConstructorMember.from(constructorElement, this);
   }
   PropertyAccessorElement lookUpGetter(String getterName, LibraryElement library) {
     PropertyAccessorElement element = getGetter(getterName);
     if (element != null && element.isAccessibleIn(library)) {
       return element;
     }
+    return lookUpGetterInSuperclass(getterName, library);
+  }
+  PropertyAccessorElement lookUpGetterInSuperclass(String getterName, LibraryElement library) {
     for (InterfaceType mixin in mixins) {
-      element = mixin.getGetter(getterName);
+      PropertyAccessorElement element = mixin.getGetter(getterName);
       if (element != null && element.isAccessibleIn(library)) {
         return element;
       }
     }
+    Set<ClassElement> visitedClasses = new Set<ClassElement>();
     InterfaceType supertype = superclass;
-    while (supertype != null) {
-      element = supertype.getGetter(getterName);
+    ClassElement supertypeElement = supertype == null ? null : supertype.element;
+    while (supertype != null && !visitedClasses.contains(supertypeElement)) {
+      javaSetAdd(visitedClasses, supertypeElement);
+      PropertyAccessorElement element = supertype.getGetter(getterName);
       if (element != null && element.isAccessibleIn(library)) {
         return element;
       }
@@ -5206,6 +6039,7 @@
         }
       }
       supertype = supertype.superclass;
+      supertypeElement = supertype == null ? null : supertype.element;
     }
     return null;
   }
@@ -5214,15 +6048,21 @@
     if (element != null && element.isAccessibleIn(library)) {
       return element;
     }
+    return lookUpMethodInSuperclass(methodName, library);
+  }
+  MethodElement lookUpMethodInSuperclass(String methodName, LibraryElement library) {
     for (InterfaceType mixin in mixins) {
-      element = mixin.getMethod(methodName);
+      MethodElement element = mixin.getMethod(methodName);
       if (element != null && element.isAccessibleIn(library)) {
         return element;
       }
     }
+    Set<ClassElement> visitedClasses = new Set<ClassElement>();
     InterfaceType supertype = superclass;
-    while (supertype != null) {
-      element = supertype.getMethod(methodName);
+    ClassElement supertypeElement = supertype == null ? null : supertype.element;
+    while (supertype != null && !visitedClasses.contains(supertypeElement)) {
+      javaSetAdd(visitedClasses, supertypeElement);
+      MethodElement element = supertype.getMethod(methodName);
       if (element != null && element.isAccessibleIn(library)) {
         return element;
       }
@@ -5233,6 +6073,7 @@
         }
       }
       supertype = supertype.superclass;
+      supertypeElement = supertype == null ? null : supertype.element;
     }
     return null;
   }
@@ -5241,15 +6082,21 @@
     if (element != null && element.isAccessibleIn(library)) {
       return element;
     }
+    return lookUpSetterInSuperclass(setterName, library);
+  }
+  PropertyAccessorElement lookUpSetterInSuperclass(String setterName, LibraryElement library) {
     for (InterfaceType mixin in mixins) {
-      element = mixin.getSetter(setterName);
+      PropertyAccessorElement element = mixin.getSetter(setterName);
       if (element != null && element.isAccessibleIn(library)) {
         return element;
       }
     }
+    Set<ClassElement> visitedClasses = new Set<ClassElement>();
     InterfaceType supertype = superclass;
-    while (supertype != null) {
-      element = supertype.getSetter(setterName);
+    ClassElement supertypeElement = supertype == null ? null : supertype.element;
+    while (supertype != null && !visitedClasses.contains(supertypeElement)) {
+      javaSetAdd(visitedClasses, supertypeElement);
+      PropertyAccessorElement element = supertype.getSetter(setterName);
       if (element != null && element.isAccessibleIn(library)) {
         return element;
       }
@@ -5260,9 +6107,11 @@
         }
       }
       supertype = supertype.superclass;
+      supertypeElement = supertype == null ? null : supertype.element;
     }
     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
@@ -5296,13 +6145,100 @@
       builder.append(">");
     }
   }
+  bool isMoreSpecificThan2(InterfaceType s, Set<ClassElement> visitedClasses) {
+    if (this == s) {
+      return true;
+    }
+    if (s.isDirectSupertypeOf(this)) {
+      return true;
+    }
+    ClassElement tElement = element;
+    ClassElement sElement = s.element;
+    if (tElement == sElement) {
+      List<Type2> tArguments = typeArguments;
+      List<Type2> sArguments = s.typeArguments;
+      if (tArguments.length != sArguments.length) {
+        return false;
+      }
+      for (int i = 0; i < tArguments.length; i++) {
+        if (!tArguments[i].isMoreSpecificThan(sArguments[i])) {
+          return false;
+        }
+      }
+      return true;
+    }
+    ClassElement element2 = element;
+    if (element2 == null || visitedClasses.contains(element2)) {
+      return false;
+    }
+    javaSetAdd(visitedClasses, element2);
+    InterfaceType supertype2 = element2.supertype;
+    if (supertype2 != null && ((supertype2 as InterfaceTypeImpl)).isMoreSpecificThan2(s, visitedClasses)) {
+      return true;
+    }
+    for (InterfaceType interfaceType in element2.interfaces) {
+      if (((interfaceType as InterfaceTypeImpl)).isMoreSpecificThan2(s, visitedClasses)) {
+        return true;
+      }
+    }
+    for (InterfaceType mixinType in element2.mixins) {
+      if (((mixinType as InterfaceTypeImpl)).isMoreSpecificThan2(s, visitedClasses)) {
+        return true;
+      }
+    }
+    return false;
+  }
+  bool isSubtypeOf2(InterfaceType type, Set<ClassElement> visitedClasses) {
+    InterfaceType typeT = this;
+    InterfaceType typeS = type;
+    ClassElement elementT = element;
+    if (elementT == null || visitedClasses.contains(elementT)) {
+      return false;
+    }
+    javaSetAdd(visitedClasses, elementT);
+    typeT = substitute2(_typeArguments, TypeVariableTypeImpl.getTypes(elementT.typeVariables));
+    if (typeT == typeS) {
+      return true;
+    } else if (elementT == typeS.element) {
+      List<Type2> typeTArgs = typeT.typeArguments;
+      List<Type2> typeSArgs = typeS.typeArguments;
+      if (typeTArgs.length != typeSArgs.length) {
+        return false;
+      }
+      for (int i = 0; i < typeTArgs.length; i++) {
+        if (!typeTArgs[i].isSubtypeOf(typeSArgs[i])) {
+          return false;
+        }
+      }
+      return true;
+    }
+    InterfaceType supertype2 = elementT.supertype;
+    if (supertype2 != null && ((supertype2 as InterfaceTypeImpl)).isSubtypeOf2(typeS, visitedClasses)) {
+      return true;
+    }
+    List<InterfaceType> interfaceTypes = elementT.interfaces;
+    for (InterfaceType interfaceType in interfaceTypes) {
+      if (((interfaceType as InterfaceTypeImpl)).isSubtypeOf2(typeS, visitedClasses)) {
+        return true;
+      }
+    }
+    List<InterfaceType> mixinTypes = elementT.mixins;
+    for (InterfaceType mixinType in mixinTypes) {
+      if (((mixinType as InterfaceTypeImpl)).isSubtypeOf2(typeS, visitedClasses)) {
+        return true;
+      }
+    }
+    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.
@@ -5322,19 +6258,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
@@ -5344,6 +6284,7 @@
     this._element = element;
     this._name = name;
   }
+  String get displayName => name;
   Element get element => _element;
   Type2 getLeastUpperBound(Type2 type) => null;
   String get name => _name;
@@ -5351,6 +6292,7 @@
   bool isDartCoreFunction() => false;
   bool isDynamic() => false;
   bool isMoreSpecificThan(Type2 type) => false;
+  bool isObject() => false;
   bool isSupertypeOf(Type2 type) => type.isSubtypeOf(this);
   bool isVoid() => false;
   String toString() {
@@ -5358,6 +6300,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
@@ -5370,12 +6313,14 @@
     }
   }
 }
+
 /**
  * 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.
@@ -5390,6 +6335,7 @@
     }
     return types;
   }
+  
   /**
    * Initialize a newly created type variable to be declared by the given element and to have the
    * given name.
@@ -5415,20 +6361,24 @@
     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.
    */
@@ -5439,6 +6389,7 @@
   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:
@@ -5448,13 +6399,13 @@
  * <li>The types of functions with optional positional parameters. These have the general form
  * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, \[T<sub>n+1</sub>, &hellip;, T<sub>n+k</sub>\]) &rarr;
  * T</i>.</li>
- * <li>The types of functions with named positional parameters. These have the general form
- * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, {T<sub>x1</sub> x1, &hellip;, T<sub>xk</sub> xk})
- * &rarr; T</i>.</li>
+ * <li>The types of functions with named parameters. These have the general form <i>(T<sub>1</sub>,
+ * &hellip;, T<sub>n</sub>, {T<sub>x1</sub> x1, &hellip;, T<sub>xk</sub> xk}) &rarr; T</i>.</li>
  * </ol>
  * @coverage dart.engine.type
  */
-abstract class FunctionType implements Type2 {
+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
@@ -5463,12 +6414,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
@@ -5477,20 +6430,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 an array containing the actual types of the type arguments. If this type's element does
-   * not have type parameters, then the array should be empty (although it is possible for type
-   * arguments to be erroneously declared). If the element has type parameters and the actual type
-   * does not explicitly include argument values, then the type "dynamic" will be automatically
-   * provided.
-   * @return the actual types of the type arguments
-   */
-  List<Type2> get typeArguments;
+  
   /**
    * Return {@code true} if this type is a subtype of the given type.
    * <p>
@@ -5555,6 +6508,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())}.
@@ -5564,13 +6518,15 @@
   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.
  * @coverage dart.engine.type
  */
-abstract class InterfaceType implements Type2 {
+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.
@@ -5578,6 +6534,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
@@ -5585,6 +6542,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.
@@ -5601,6 +6559,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.
@@ -5608,6 +6567,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,
@@ -5616,6 +6576,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.
@@ -5623,6 +6584,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
@@ -5631,15 +6593,7 @@
    * @return the superclass of this type
    */
   InterfaceType get superclass;
-  /**
-   * Return an array containing the actual types of the type arguments. If this type's element does
-   * not have type parameters, then the array should be empty (although it is possible for type
-   * arguments to be erroneously declared). If the element has type parameters and the actual type
-   * does not explicitly include argument values, then the type "dynamic" will be automatically
-   * provided.
-   * @return the actual types of the type arguments
-   */
-  List<Type2> get typeArguments;
+  
   /**
    * 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>
@@ -5655,6 +6609,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
@@ -5674,6 +6629,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
@@ -5684,6 +6640,21 @@
    * @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
+   * fails. The behavior of this method is defined by the Dart Language Specification in section
+   * 12.11.1: <blockquote>If <i>e</i> is of the form <b>new</b> <i>T.id()</i> then let <i>q<i> be
+   * the constructor <i>T.id</i>, otherwise let <i>q<i> be the constructor <i>T<i>. Otherwise, if
+   * <i>q</i> is not defined or not accessible, a NoSuchMethodException is thrown. </blockquote>
+   * @param constructorName the name of the constructor being looked up
+   * @param library the library with respect to which the lookup is being performed
+   * @return the result of looking up the given constructor in this class with respect to the given
+   * library
+   */
+  ConstructorElement lookUpConstructor(String constructorName, LibraryElement library);
+  
   /**
    * Return the element representing the getter that results from looking up the given getter in
    * this class with respect to the given library, or {@code null} if the look up fails. The
@@ -5704,6 +6675,28 @@
    * 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
+   * fails. The behavior of this method is defined by the Dart Language Specification in section
+   * 12.15.1: <blockquote>The result of looking up getter (respectively setter) <i>m</i> in class
+   * <i>C</i> with respect to library <i>L</i> is:
+   * <ul>
+   * <li>If <i>C</i> declares an instance getter (respectively setter) named <i>m</i> that is
+   * accessible to <i>L</i>, then that getter (respectively setter) is the result of the lookup.
+   * Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the lookup is the result
+   * of looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect to <i>L</i>.
+   * Otherwise, we say that the lookup has failed.</li>
+   * </ul>
+   * </blockquote>
+   * @param getterName the name of the getter being looked up
+   * @param library the library with respect to which the lookup is being performed
+   * @return the result of looking up the given getter in this class with respect to the given
+   * library
+   */
+  PropertyAccessorElement lookUpGetterInSuperclass(String getterName, LibraryElement library);
+  
   /**
    * Return the element representing the method that results from looking up the given method in
    * this class with respect to the given library, or {@code null} if the look up fails. The
@@ -5723,6 +6716,27 @@
    * 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
+   * fails. The behavior of this method is defined by the Dart Language Specification in section
+   * 12.15.1: <blockquote> The result of looking up method <i>m</i> in class <i>C</i> with respect
+   * to library <i>L</i> is:
+   * <ul>
+   * <li>If <i>C</i> declares an instance method named <i>m</i> that is accessible to <i>L</i>, then
+   * that method is the result of the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then
+   * the result of the lookup is the result of looking up method <i>m</i> in <i>S</i> with respect
+   * to <i>L</i>. Otherwise, we say that the lookup has failed.</li>
+   * </ul>
+   * </blockquote>
+   * @param methodName the name of the method being looked up
+   * @param library the library with respect to which the lookup is being performed
+   * @return the result of looking up the given method in this class with respect to the given
+   * library
+   */
+  MethodElement lookUpMethodInSuperclass(String methodName, LibraryElement library);
+  
   /**
    * Return the element representing the setter that results from looking up the given setter in
    * this class with respect to the given library, or {@code null} if the look up fails. The
@@ -5743,6 +6757,28 @@
    * 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
+   * fails. The behavior of this method is defined by the Dart Language Specification in section
+   * 12.16: <blockquote> The result of looking up getter (respectively setter) <i>m</i> in class
+   * <i>C</i> with respect to library <i>L</i> is:
+   * <ul>
+   * <li>If <i>C</i> declares an instance getter (respectively setter) named <i>m</i> that is
+   * accessible to <i>L</i>, then that getter (respectively setter) is the result of the lookup.
+   * Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the lookup is the result
+   * of looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect to <i>L</i>.
+   * Otherwise, we say that the lookup has failed.</li>
+   * </ul>
+   * </blockquote>
+   * @param setterName the name of the setter being looked up
+   * @param library the library with respect to which the lookup is being performed
+   * @return the result of looking up the given setter in this class with respect to the given
+   * library
+   */
+  PropertyAccessorElement lookUpSetterInSuperclass(String setterName, LibraryElement library);
+  
   /**
    * Return the type resulting from substituting the given arguments for this type's parameters.
    * This is fully equivalent to {@code substitute(argumentTypes, getTypeArguments())}.
@@ -5752,12 +6788,45 @@
   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
+   * arguments to be erroneously declared). If the element has type parameters and the actual type
+   * does not explicitly include argument values, then the type "dynamic" will be automatically
+   * provided.
+   * @return the actual types of the type arguments
+   */
+  List<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
@@ -5765,6 +6834,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.
@@ -5772,12 +6842,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>
@@ -5786,6 +6858,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.
@@ -5793,23 +6866,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>.
@@ -5817,11 +6900,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
@@ -5836,6 +6921,7 @@
    */
   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.
@@ -5844,6 +6930,7 @@
 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 e9390f7..8ecb091 100644
--- a/pkg/analyzer_experimental/lib/src/generated/engine.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/engine.dart
@@ -17,33 +17,40 @@
 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
@@ -55,6 +62,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
@@ -67,15 +75,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;
-  /**
-   * Prevent the creation of instances of this class.
-   */
-  AnalysisEngine() : super() {
-  }
+  
   /**
    * Create a new context in which analysis can be performed.
    * @return the analysis context that was created
@@ -87,11 +92,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.
@@ -102,6 +109,7 @@
     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
@@ -135,12 +143,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
@@ -152,6 +162,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
@@ -163,6 +174,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
@@ -176,6 +188,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
@@ -183,6 +196,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
@@ -195,6 +209,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
@@ -207,6 +222,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.
@@ -215,6 +231,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
@@ -225,6 +248,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
@@ -235,6 +259,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.
@@ -243,6 +268,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
@@ -251,12 +277,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
@@ -264,6 +292,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
@@ -274,6 +303,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
@@ -282,6 +312,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
@@ -294,6 +325,16 @@
    * @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.
+   * @param librarySource the source for the defining compilation unit of the library being depended
+   * on
+   * @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.
@@ -301,6 +342,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.
@@ -308,6 +350,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
@@ -317,6 +360,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
@@ -325,6 +369,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
@@ -334,11 +379,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).
@@ -350,6 +397,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
@@ -363,6 +411,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
@@ -370,6 +419,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.
@@ -378,6 +428,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
@@ -387,6 +438,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
@@ -395,6 +447,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
@@ -405,6 +458,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
@@ -416,6 +470,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
@@ -423,6 +478,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
@@ -431,6 +494,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
@@ -439,6 +503,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)
@@ -446,16 +511,19 @@
    */
   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.
@@ -463,12 +531,14 @@
    */
   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.
    */
@@ -477,6 +547,7 @@
   }
   _jtd_constructor_125_impl() {
   }
+  
   /**
    * Initialize a newly created exception to have the given message.
    * @param message the message associated with the exception
@@ -486,6 +557,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
@@ -496,6 +568,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
@@ -506,51 +579,69 @@
   _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.
+   * @return {@code true} if analysis is to use strict mode
+   */
+  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>();
-  /**
-   * Initialize a newly created change set to be empty.
-   */
-  ChangeSet() : super() {
-  }
+  
   /**
    * Record that the specified source has been added and that it's content is the default contents
    * of the source.
@@ -559,6 +650,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.
@@ -567,31 +659,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
@@ -601,6 +699,7 @@
       _removed2.add(source);
     }
   }
+  
   /**
    * Record that the specified source container has been removed.
    * @param container the source container that was removed
@@ -611,62 +710,81 @@
     }
   }
 }
+
 /**
  * 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");
+  
+  /**
+   * 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");
+  
   /**
    * 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");
+  
   /**
    * 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");
+  
   /**
    * 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");
+  
   /**
    * The data descriptor representing the errors resulting from parsing the source.
    */
   static 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");
+  
   /**
    * 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");
+  
   /**
    * The data descriptor representing the errors resulting from resolving the source.
    */
   static 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");
+  
   /**
    * The data descriptor representing the source kind.
    */
   static 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
@@ -674,12 +792,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.
@@ -689,6 +809,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.
@@ -700,128 +821,132 @@
   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 {@code null} if the list is not currently cached.
-   * The list will be empty if the Dart file is a part rather than a library.
+   * 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 source for the defining compilation unit of the library that contains this unit, or{@code null} if this unit is contained in multiple libraries. (If this unit is the defining
-   * compilation unit for it's library, then this will be the source for this unit.)
+   * The state of the cached list of referenced libraries.
    */
-  Source _librarySource;
+  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, or {@code null} if this unit is contained in multiple libraries.
+   * that contains this unit. This field will never be {@code null}.
    */
   DartEntryImpl_ResolutionState _resolutionState = new DartEntryImpl_ResolutionState();
-  /**
-   * A table mapping the sources of the libraries containing this compilation unit to the
-   * information known as a result of resolving this compilation unit as part of the library, or{@code null} if this unit is contained in a single library.
-   */
-  Map<Source, DartEntryImpl_ResolutionState> _resolutionMap;
+  
   /**
    * 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".
    */
   static int _CLIENT_CODE = 1 << 2;
-  /**
-   * Initialize a newly created cache entry to be empty.
-   */
-  DartEntryImpl() : super() {
-  }
-  /**
-   * Record the fact that we are about to parse the compilation unit by marking the results of
-   * parsing as being in progress.
-   */
-  void aboutToParse() {
-    setState(SourceEntry.LINE_INFO, CacheState.IN_PROCESS);
-    _parsedUnitState = CacheState.IN_PROCESS;
-    _parseErrorsState = CacheState.IN_PROCESS;
-  }
   List<AnalysisError> get allErrors {
     List<AnalysisError> errors = new List<AnalysisError>();
     for (AnalysisError error in _parseErrors) {
       errors.add(error);
     }
-    if (_resolutionMap == null) {
-      for (AnalysisError error in _resolutionState._resolutionErrors) {
+    DartEntryImpl_ResolutionState state = _resolutionState;
+    while (state != null) {
+      for (AnalysisError error in state._resolutionErrors) {
         errors.add(error);
       }
-    } else {
-      for (DartEntryImpl_ResolutionState state in _resolutionMap.values) {
-        for (AnalysisError error in state._resolutionErrors) {
-          errors.add(error);
-        }
-      }
+      state = state._nextState;
     }
+    ;
     if (errors.length == 0) {
       return AnalysisError.NO_ERRORS;
     }
@@ -831,23 +956,17 @@
     if (identical(_parsedUnitState, CacheState.VALID)) {
       return _parsedUnit;
     }
-    if (_resolutionMap == null) {
-      return _resolutionState._resolvedUnit;
-    } else {
-      for (DartEntryImpl_ResolutionState state in _resolutionMap.values) {
-        if (identical(state._resolvedUnitState, CacheState.VALID)) {
-          return state._resolvedUnit;
-        }
-      }
-    }
-    return null;
+    return anyResolvedCompilationUnit;
   }
   CompilationUnit get anyResolvedCompilationUnit {
-    for (DartEntryImpl_ResolutionState state in _resolutionMap.values) {
+    DartEntryImpl_ResolutionState state = _resolutionState;
+    while (state != null) {
       if (identical(state._resolvedUnitState, CacheState.VALID)) {
         return state._resolvedUnit;
       }
+      state = state._nextState;
     }
+    ;
     return null;
   }
   SourceKind get kind => _sourceKind;
@@ -866,34 +985,29 @@
       return _parsedUnitState;
     } else if (identical(descriptor, DartEntry.PUBLIC_NAMESPACE)) {
       return _publicNamespaceState;
+    } else if (identical(descriptor, DartEntry.REFERENCED_LIBRARIES)) {
+      return _referencedLibrariesState;
     } else if (identical(descriptor, DartEntry.SOURCE_KIND)) {
       return _sourceKindState;
     } else {
       return super.getState(descriptor);
     }
   }
-  CacheState getState2(DataDescriptor<Object> descriptor, Source librarySource) {
-    if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
-      if (_resolutionMap == null) {
-        return _resolutionState._resolutionErrorsState;
-      } else {
-        DartEntryImpl_ResolutionState state = _resolutionMap[librarySource];
-        if (state != null) {
-          return state._resolutionErrorsState;
+  CacheState getState2(DataDescriptor<Object> descriptor, Source librarySource2) {
+    DartEntryImpl_ResolutionState state = _resolutionState;
+    while (state != null) {
+      if (librarySource2 == state._librarySource) {
+        if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
+          return _resolutionState._resolutionErrorsState;
+        } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
+          return _resolutionState._resolvedUnitState;
+        } else {
+          throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
         }
       }
-    } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
-      if (_resolutionMap == null) {
-        return _resolutionState._resolvedUnitState;
-      } else {
-        DartEntryImpl_ResolutionState state = _resolutionMap[librarySource];
-        if (state != null) {
-          return state._resolvedUnitState;
-        }
-      }
-    } else {
-      throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
+      state = state._nextState;
     }
+    ;
     return CacheState.INVALID;
   }
   Object getValue(DataDescriptor descriptor) {
@@ -911,67 +1025,129 @@
       return _parsedUnit as Object;
     } else if (identical(descriptor, DartEntry.PUBLIC_NAMESPACE)) {
       return _publicNamespace as Object;
+    } else if (identical(descriptor, DartEntry.REFERENCED_LIBRARIES)) {
+      return _referencedLibraries as Object;
     } else if (identical(descriptor, DartEntry.SOURCE_KIND)) {
       return _sourceKind as Object;
     }
     return super.getValue(descriptor);
   }
   Object getValue2(DataDescriptor descriptor, Source librarySource2) {
-    if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
-      if (_resolutionMap == null) {
-        if (librarySource2 == this._librarySource) {
-          return _resolutionState._resolutionErrors as Object;
-        } else {
-          return AnalysisError.NO_ERRORS as Object;
-        }
-      } else {
-        DartEntryImpl_ResolutionState state = _resolutionMap[librarySource2];
-        if (state != null) {
+    DartEntryImpl_ResolutionState state = _resolutionState;
+    while (state != null) {
+      if (librarySource2 == state._librarySource) {
+        if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
           return state._resolutionErrors as Object;
-        }
-      }
-    } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
-      if (_resolutionMap == null) {
-        if (librarySource2 == this._librarySource) {
-          return _resolutionState._resolvedUnit as Object;
-        } else {
-          return null;
-        }
-      } else {
-        DartEntryImpl_ResolutionState state = _resolutionMap[librarySource2];
-        if (state != null) {
+        } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
           return state._resolvedUnit as Object;
+        } else {
+          throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
         }
       }
+      state = state._nextState;
+    }
+    ;
+    if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
+      return AnalysisError.NO_ERRORS as Object;
+    } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
+      return null;
     } else {
       throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
     }
-    return null;
   }
   DartEntryImpl get writableCopy {
     DartEntryImpl copy = new DartEntryImpl();
     copy.copyFrom(this);
     return copy;
   }
+  
+  /**
+   * Invalidate all of the information associated with the compilation unit.
+   */
+  void invalidateAllInformation() {
+    setState(SourceEntry.LINE_INFO, CacheState.INVALID);
+    _sourceKind = SourceKind.UNKNOWN;
+    _sourceKindState = CacheState.INVALID;
+    _parseErrors = AnalysisError.NO_ERRORS;
+    _parseErrorsState = CacheState.INVALID;
+    _parsedUnit = null;
+    _parsedUnitState = CacheState.INVALID;
+    invalidateAllResolutionInformation();
+  }
+  
   /**
    * Invalidate all of the resolution information associated with the compilation unit.
    */
   void invalidateAllResolutionInformation() {
-    if (_resolutionMap == null) {
-      _resolutionState.invalidateAllResolutionInformation();
-    } else {
-      for (DartEntryImpl_ResolutionState state in _resolutionMap.values) {
-        state.invalidateAllResolutionInformation();
-      }
-    }
-    _elementState = CacheState.INVALID;
     _element = null;
-    _publicNamespaceState = CacheState.INVALID;
-    _publicNamespace = null;
-    _launchableState = CacheState.INVALID;
-    _clientServerState = CacheState.INVALID;
+    _elementState = CacheState.INVALID;
+    _includedParts = Source.EMPTY_ARRAY;
+    _includedPartsState = CacheState.INVALID;
+    _referencedLibraries = Source.EMPTY_ARRAY;
+    _referencedLibrariesState = CacheState.INVALID;
     _bitmask = 0;
+    _clientServerState = CacheState.INVALID;
+    _launchableState = CacheState.INVALID;
+    _publicNamespace = null;
+    _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,
+   * as being in error.
+   */
+  void recordParseError() {
+    setState(SourceEntry.LINE_INFO, CacheState.ERROR);
+    _sourceKind = SourceKind.UNKNOWN;
+    _sourceKindState = CacheState.ERROR;
+    _parseErrors = AnalysisError.NO_ERRORS;
+    _parseErrorsState = CacheState.ERROR;
+    _parsedUnit = null;
+    _parsedUnitState = CacheState.ERROR;
+    recordResolutionError();
+  }
+  
+  /**
+   * Record that the parse-related information for the associated source is about to be computed by
+   * the current thread.
+   */
+  void recordParseInProcess() {
+    if (getState(SourceEntry.LINE_INFO) != CacheState.VALID) {
+      setState(SourceEntry.LINE_INFO, CacheState.IN_PROCESS);
+    }
+    if (_sourceKindState != CacheState.VALID) {
+      _sourceKindState = CacheState.IN_PROCESS;
+    }
+    if (_parseErrorsState != CacheState.VALID) {
+      _parseErrorsState = CacheState.IN_PROCESS;
+    }
+    if (_parsedUnitState != CacheState.VALID) {
+      _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
+   * not change the state of any parse results.
+   */
+  void recordResolutionError() {
+    _element = null;
+    _elementState = CacheState.ERROR;
+    _includedParts = Source.EMPTY_ARRAY;
+    _includedPartsState = CacheState.ERROR;
+    _referencedLibraries = Source.EMPTY_ARRAY;
+    _referencedLibrariesState = CacheState.ERROR;
+    _bitmask = 0;
+    _clientServerState = CacheState.ERROR;
+    _launchableState = CacheState.ERROR;
+    _publicNamespace = null;
+    _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.
@@ -979,21 +1155,28 @@
    * contain this part but no longer does
    */
   void removeResolution(Source librarySource2) {
-    if (_resolutionMap == null) {
-      if (librarySource2 == this._librarySource) {
-        _resolutionState.invalidateAllResolutionInformation();
-        this._librarySource = null;
-      }
-    } else {
-      _resolutionMap.remove(librarySource2);
-      if (_resolutionMap.length == 1) {
-        MapEntry<Source, DartEntryImpl_ResolutionState> entry = new JavaIterator(getMapEntrySet(_resolutionMap)).next();
-        this._librarySource = entry.getKey();
-        _resolutionState = entry.getValue();
-        _resolutionMap = null;
+    if (librarySource2 != null) {
+      if (librarySource2 == _resolutionState._librarySource) {
+        if (_resolutionState._nextState == null) {
+          _resolutionState.invalidateAllResolutionInformation();
+        } else {
+          _resolutionState = _resolutionState._nextState;
+        }
+      } else {
+        DartEntryImpl_ResolutionState priorState = _resolutionState;
+        DartEntryImpl_ResolutionState state = _resolutionState._nextState;
+        while (state != null) {
+          if (librarySource2 == state._librarySource) {
+            priorState._nextState = state._nextState;
+            break;
+          }
+          priorState = state;
+          state = state._nextState;
+        }
       }
     }
   }
+  
   /**
    * 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
@@ -1035,6 +1218,9 @@
     } else if (identical(descriptor, DartEntry.PUBLIC_NAMESPACE)) {
       _publicNamespace = updatedValue(state, _publicNamespace, null);
       _publicNamespaceState = state;
+    } else if (identical(descriptor, DartEntry.REFERENCED_LIBRARIES)) {
+      _referencedLibraries = updatedValue(state, _referencedLibraries, Source.EMPTY_ARRAY);
+      _referencedLibrariesState = state;
     } else if (identical(descriptor, DartEntry.SOURCE_KIND)) {
       _sourceKind = updatedValue(state, _sourceKind, SourceKind.UNKNOWN);
       _sourceKindState = state;
@@ -1042,47 +1228,23 @@
       super.setState(descriptor, state);
     }
   }
+  
   /**
    * Set the state of the data represented by the given descriptor in the context of the given
    * library to the given state.
    * @param descriptor the descriptor representing the data whose state is to be set
    * @param librarySource the source of the defining compilation unit of the library that is the
    * context for the data
-   * @param state the new state of the data represented by the given descriptor
+   * @param cacheState the new state of the data represented by the given descriptor
    */
-  void setState2(DataDescriptor<Object> descriptor, Source librarySource2, CacheState state) {
-    if (_resolutionMap == null && this._librarySource != librarySource2) {
-      _resolutionMap = new Map<Source, DartEntryImpl_ResolutionState>();
-      _resolutionMap[this._librarySource] = _resolutionState;
-      this._librarySource = null;
-      _resolutionState = null;
-    }
+  void setState2(DataDescriptor<Object> descriptor, Source librarySource, CacheState cacheState) {
+    DartEntryImpl_ResolutionState state = getOrCreateResolutionState(librarySource);
     if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
-      if (_resolutionMap == null) {
-        _resolutionState._resolutionErrors = updatedValue(state, _resolutionState._resolutionErrors, AnalysisError.NO_ERRORS);
-        _resolutionState._resolutionErrorsState = state;
-      } else {
-        DartEntryImpl_ResolutionState resolutionState = _resolutionMap[librarySource2];
-        if (resolutionState == null) {
-          resolutionState = new DartEntryImpl_ResolutionState();
-          _resolutionMap[librarySource2] = resolutionState;
-        }
-        resolutionState._resolutionErrors = updatedValue(state, resolutionState._resolutionErrors, AnalysisError.NO_ERRORS);
-        resolutionState._resolutionErrorsState = state;
-      }
+      state._resolutionErrors = updatedValue(cacheState, state._resolutionErrors, AnalysisError.NO_ERRORS);
+      state._resolutionErrorsState = cacheState;
     } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
-      if (_resolutionMap == null) {
-        _resolutionState._resolvedUnit = updatedValue(state, _resolutionState._resolvedUnit, null);
-        _resolutionState._resolvedUnitState = state;
-      } else {
-        DartEntryImpl_ResolutionState resolutionState = _resolutionMap[librarySource2];
-        if (resolutionState == null) {
-          resolutionState = new DartEntryImpl_ResolutionState();
-          _resolutionMap[librarySource2] = resolutionState;
-        }
-        resolutionState._resolvedUnit = updatedValue(state, resolutionState._resolvedUnit, null);
-        resolutionState._resolvedUnitState = state;
-      }
+      state._resolvedUnit = updatedValue(cacheState, state._resolvedUnit, null);
+      state._resolvedUnitState = cacheState;
     } else {
       throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
     }
@@ -1117,6 +1279,9 @@
     } else if (identical(descriptor, DartEntry.PUBLIC_NAMESPACE)) {
       _publicNamespace = value as Namespace;
       _publicNamespaceState = CacheState.VALID;
+    } else if (identical(descriptor, DartEntry.REFERENCED_LIBRARIES)) {
+      _referencedLibraries = value == null ? Source.EMPTY_ARRAY : (value as List<Source>);
+      _referencedLibrariesState = CacheState.VALID;
     } else if (identical(descriptor, DartEntry.SOURCE_KIND)) {
       _sourceKind = value as SourceKind;
       _sourceKindState = CacheState.VALID;
@@ -1124,6 +1289,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}.
@@ -1132,39 +1298,14 @@
    * context for the data
    * @param value the new value of the data represented by the given descriptor and library
    */
-  void setValue2(DataDescriptor descriptor, Source librarySource2, Object value) {
-    if (_resolutionMap == null) {
-      if (this._librarySource == null) {
-        this._librarySource = librarySource2;
-      } else if (librarySource2 != this._librarySource) {
-        _resolutionMap = new Map<Source, DartEntryImpl_ResolutionState>();
-        _resolutionMap[this._librarySource] = _resolutionState;
-        this._librarySource = null;
-        _resolutionState = null;
-      }
-    }
+  void setValue2(DataDescriptor descriptor, Source librarySource, Object value) {
+    DartEntryImpl_ResolutionState state = getOrCreateResolutionState(librarySource);
     if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
-      if (_resolutionMap == null) {
-        _resolutionState._resolutionErrors = value == null ? AnalysisError.NO_ERRORS : (value as List<AnalysisError>);
-        _resolutionState._resolutionErrorsState = CacheState.VALID;
-      } else {
-        DartEntryImpl_ResolutionState state = _resolutionMap[librarySource2];
-        if (state != null) {
-          state._resolutionErrors = value == null ? AnalysisError.NO_ERRORS : (value as List<AnalysisError>);
-          state._resolutionErrorsState = CacheState.VALID;
-        }
-      }
+      state._resolutionErrors = value == null ? AnalysisError.NO_ERRORS : (value as List<AnalysisError>);
+      state._resolutionErrorsState = CacheState.VALID;
     } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
-      if (_resolutionMap == null) {
-        _resolutionState._resolvedUnit = value as CompilationUnit;
-        _resolutionState._resolvedUnitState = CacheState.VALID;
-      } else {
-        DartEntryImpl_ResolutionState state = _resolutionMap[librarySource2];
-        if (state != null) {
-          state._resolvedUnit = value as CompilationUnit;
-          state._resolvedUnitState = CacheState.VALID;
-        }
-      }
+      state._resolvedUnit = value as CompilationUnit;
+      state._resolvedUnitState = CacheState.VALID;
     }
   }
   void copyFrom(SourceEntryImpl entry) {
@@ -1178,19 +1319,9 @@
     _parseErrors = other._parseErrors;
     _includedPartsState = other._includedPartsState;
     _includedParts = other._includedParts;
-    if (other._resolutionMap == null) {
-      _librarySource = other._librarySource;
-      DartEntryImpl_ResolutionState newState = new DartEntryImpl_ResolutionState();
-      newState.copyFrom(_resolutionState);
-      _resolutionState = newState;
-    } else {
-      _resolutionMap = new Map<Source, DartEntryImpl_ResolutionState>();
-      for (MapEntry<Source, DartEntryImpl_ResolutionState> mapEntry in getMapEntrySet(other._resolutionMap)) {
-        DartEntryImpl_ResolutionState newState = new DartEntryImpl_ResolutionState();
-        newState.copyFrom(mapEntry.getValue());
-        _resolutionMap[mapEntry.getKey()] = newState;
-      }
-    }
+    _referencedLibrariesState = other._referencedLibrariesState;
+    _referencedLibraries = other._referencedLibraries;
+    _resolutionState.copyFrom(other._resolutionState);
     _elementState = other._elementState;
     _element = other._element;
     _publicNamespaceState = other._publicNamespaceState;
@@ -1199,6 +1330,30 @@
     _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})
+   * @return the resolution state (not {@code null})
+   */
+  DartEntryImpl_ResolutionState getOrCreateResolutionState(Source librarySource2) {
+    DartEntryImpl_ResolutionState state = _resolutionState;
+    if (state._librarySource == null) {
+      state._librarySource = librarySource2;
+      return state;
+    }
+    while (state._librarySource != librarySource2) {
+      if (state._nextState == null) {
+        DartEntryImpl_ResolutionState newState = new DartEntryImpl_ResolutionState();
+        newState._librarySource = librarySource2;
+        state._nextState = newState;
+        return newState;
+      }
+      state = state._nextState;
+    }
+    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.
@@ -1216,63 +1371,102 @@
     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;
+  
   /**
-   * Initialize a newly created resolution state.
-   */
-  DartEntryImpl_ResolutionState() : super() {
-  }
-  /**
-   * Set this state to be exactly like the given state.
+   * Set this state to be exactly like the given state, recursively copying the next state as
+   * necessary.
    * @param other the state to be copied
    */
   void copyFrom(DartEntryImpl_ResolutionState other) {
+    _librarySource = other._librarySource;
     _resolvedUnitState = other._resolvedUnitState;
     _resolvedUnit = other._resolvedUnit;
     _resolutionErrorsState = other._resolutionErrorsState;
     _resolutionErrors = other._resolutionErrors;
+    if (other._nextState != null) {
+      _nextState = new DartEntryImpl_ResolutionState();
+      _nextState.copyFrom(other._nextState);
+    }
   }
+  
   /**
    * Invalidate all of the resolution information associated with the compilation unit.
    */
   void invalidateAllResolutionInformation() {
+    _nextState = null;
+    _librarySource = null;
     _resolvedUnitState = CacheState.INVALID;
     _resolvedUnit = null;
     _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
+   * will not change the state of any parse results.
+   */
+  void recordResolutionError() {
+    _nextState = null;
+    _librarySource = null;
+    _resolvedUnitState = CacheState.ERROR;
+    _resolvedUnit = null;
+    _resolutionErrorsState = CacheState.ERROR;
+    _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
@@ -1282,85 +1476,113 @@
   }
   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");
+  
   /**
    * The data descriptor representing the parsed AST structure.
    */
   static 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");
+  
   /**
    * The data descriptor representing the errors resulting from resolving the source.
    */
   static 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");
+  
+  /**
+   * 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;
   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.
    */
   HtmlElement _element;
-  /**
-   * Initialize a newly created cache entry to be empty.
-   */
-  HtmlEntryImpl() : super() {
+  List<AnalysisError> get allErrors {
+    List<AnalysisError> errors = new List<AnalysisError>();
+    for (AnalysisError error in _resolutionErrors) {
+      errors.add(error);
+    }
+    if (errors.length == 0) {
+      return AnalysisError.NO_ERRORS;
+    }
+    return new List.from(errors);
   }
   SourceKind get kind => SourceKind.HTML;
   CacheState getState(DataDescriptor<Object> descriptor) {
@@ -1451,6 +1673,7 @@
     _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.
@@ -1460,27 +1683,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");
+  
   /**
    * 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.
@@ -1488,6 +1716,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.
@@ -1495,30 +1724,29 @@
    */
   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.
    */
   LineInfo _lineInfo;
-  /**
-   * Initialize a newly created cache entry to be empty.
-   */
-  SourceEntryImpl() : super() {
-  }
   int get modificationTime => _modificationTime;
   CacheState getState(DataDescriptor<Object> descriptor) {
     if (identical(descriptor, SourceEntry.LINE_INFO)) {
@@ -1534,6 +1762,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.
@@ -1542,6 +1771,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
@@ -1555,6 +1785,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
@@ -1568,6 +1799,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
@@ -1577,6 +1809,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.
@@ -1594,57 +1827,67 @@
     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 'script' tag in an HTML file.
    */
   static String _TAG_SCRIPT = "script";
+  
   /**
    * The number of times that the flushing of information from the cache has been disabled without
    * being re-enabled.
    */
   int _cacheRemovalCount = 0;
-  /**
-   * Initialize a newly created analysis context.
-   */
-  AnalysisContextImpl() : super() {
-  }
   void addSourceInfo(Source source, SourceEntry info) {
     _sourceMap[source] = info;
   }
@@ -1672,7 +1915,9 @@
       if (addedDartSource) {
         for (MapEntry<Source, SourceEntry> mapEntry in getMapEntrySet(_sourceMap)) {
           if (!mapEntry.getKey().isInSystemLibrary() && mapEntry.getValue() is DartEntry) {
-            ((mapEntry.getValue() as DartEntryImpl)).invalidateAllResolutionInformation();
+            DartEntryImpl dartCopy = ((mapEntry.getValue() as DartEntry)).writableCopy;
+            dartCopy.invalidateAllResolutionInformation();
+            mapEntry.setValue(dartCopy);
           }
         }
       }
@@ -1688,7 +1933,7 @@
     }
     List<CharSequence> contentHolder = new List<CharSequence>(1);
     try {
-      source2.getContents(new Source_ContentReceiver_5(contentHolder));
+      source2.getContents(new Source_ContentReceiver_6(contentHolder));
     } catch (exception) {
       throw new AnalysisException.con2("Could not get contents of ${source2.fullName}", exception);
     }
@@ -1722,6 +1967,7 @@
         CacheState parseErrorsState = dartEntry.getState(DartEntry.PARSE_ERRORS);
         if (parseErrorsState != CacheState.VALID && parseErrorsState != CacheState.ERROR) {
           parseCompilationUnit(source);
+          dartEntry = getSourceEntry(source) as DartEntry;
         }
         List<Source> libraries = getLibrariesContaining(source);
         for (Source librarySource in libraries) {
@@ -1735,6 +1981,7 @@
         CacheState resolutionErrorsState = htmlEntry.getState(HtmlEntry.RESOLUTION_ERRORS);
         if (resolutionErrorsState != CacheState.VALID && resolutionErrorsState != CacheState.ERROR) {
           computeHtmlElement(source);
+          htmlEntry = getSourceEntry(source) as HtmlEntry;
         }
         return htmlEntry.getValue(HtmlEntry.RESOLUTION_ERRORS);
       }
@@ -1759,15 +2006,15 @@
             unit = parseHtmlUnit(source);
           }
         }
-        RecordingErrorListener listener = new RecordingErrorListener();
-        HtmlUnitBuilder builder = new HtmlUnitBuilder(this, listener);
+        HtmlUnitBuilder builder = new HtmlUnitBuilder(this);
         element = builder.buildHtmlElement2(source, unit);
-        List<AnalysisError> resolutionErrors = listener.getErrors2(source);
-        HtmlEntryImpl htmlCopy = (htmlEntry as HtmlEntryImpl);
+        List<AnalysisError> resolutionErrors = builder.errorListener.getErrors2(source);
+        HtmlEntryImpl htmlCopy = getHtmlEntry(source).writableCopy;
         htmlCopy.setValue(HtmlEntry.RESOLVED_UNIT, unit);
         htmlCopy.setValue(HtmlEntry.RESOLUTION_ERRORS, resolutionErrors);
         htmlCopy.setValue(HtmlEntry.ELEMENT, element);
-        getNotice(source).setErrors(resolutionErrors, htmlCopy.getValue(SourceEntry.LINE_INFO));
+        _sourceMap[source] = htmlCopy;
+        getNotice(source).setErrors(htmlCopy.allErrors, htmlCopy.getValue(SourceEntry.LINE_INFO));
       }
       return element;
     }
@@ -1782,6 +2029,7 @@
         CacheState sourceKindState = dartEntry.getState(DartEntry.SOURCE_KIND);
         if (sourceKindState != CacheState.VALID && sourceKindState != CacheState.ERROR) {
           internalComputeKindOf(source);
+          sourceEntry = getSourceEntry(source);
         }
       }
       return sourceEntry.kind;
@@ -1798,16 +2046,14 @@
       }
       LibraryElement element = dartEntry.getValue(DartEntry.ELEMENT);
       if (element == null) {
-        if (computeKindOf(source) != SourceKind.LIBRARY) {
-          throw new AnalysisException.con1("Cannot compute library element for non-library: ${source.fullName}");
-        }
-        LibraryResolver resolver = new LibraryResolver.con1(this);
+        LibraryResolver resolver = new LibraryResolver(this);
         try {
           element = resolver.resolveLibrary(source, true);
-          if (element != null) {
-            ((dartEntry as DartEntryImpl)).setValue(DartEntry.ELEMENT, element);
-          }
+          recordResolutionResults(resolver);
         } on AnalysisException catch (exception) {
+          DartEntryImpl dartCopy = getDartEntry(source).writableCopy;
+          dartCopy.setState(DartEntry.ELEMENT, CacheState.ERROR);
+          _sourceMap[source] = dartCopy;
           AnalysisEngine.instance.logger.logError2("Could not resolve the library ${source.fullName}", exception);
         }
       }
@@ -1824,10 +2070,10 @@
       if (lineInfo == null) {
         if (sourceEntry is HtmlEntry) {
           parseHtmlUnit(source);
-          lineInfo = sourceEntry.getValue(SourceEntry.LINE_INFO);
+          lineInfo = getSourceEntry(source).getValue(SourceEntry.LINE_INFO);
         } else if (sourceEntry is DartEntry) {
           parseCompilationUnit(source);
-          lineInfo = sourceEntry.getValue(SourceEntry.LINE_INFO);
+          lineInfo = getSourceEntry(source).getValue(SourceEntry.LINE_INFO);
         }
       }
       return lineInfo;
@@ -1843,12 +2089,14 @@
       if (unit != null) {
         return unit.accept(new ASTCloner()) as CompilationUnit;
       }
-      unit = internalParseCompilationUnit(((dartEntry as DartEntryImpl)), source);
-      ((dartEntry as DartEntryImpl)).setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED);
+      DartEntryImpl dartCopy = dartEntry.writableCopy;
+      unit = internalParseCompilationUnit(dartCopy, source);
+      dartCopy.setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED);
+      _sourceMap[source] = dartCopy;
       return unit;
     }
   }
-  AnalysisContext extractContext(SourceContainer container) => extractContextInto(container, (AnalysisEngine.instance.createAnalysisContext() as AnalysisContextImpl));
+  AnalysisContext extractContext(SourceContainer container) => extractContextInto(container, (AnalysisEngine.instance.createAnalysisContext() as InternalAnalysisContext));
   InternalAnalysisContext extractContextInto(SourceContainer container, InternalAnalysisContext newContext) {
     List<Source> sourcesToRemove = new List<Source>();
     {
@@ -1862,6 +2110,7 @@
     }
     return newContext;
   }
+  AnalysisOptions get analysisOptions => _options;
   Element getElement(ElementLocation location) {
     List<String> components2 = ((location as ElementLocationImpl)).components;
     ElementImpl element;
@@ -1882,26 +2131,22 @@
     return element;
   }
   AnalysisErrorInfo getErrors(Source source) {
-    {
-      SourceEntry sourceEntry = getSourceEntry(source);
-      if (sourceEntry is DartEntry) {
-        DartEntry dartEntry = sourceEntry as DartEntry;
-        return new AnalysisErrorInfoImpl(dartEntry.allErrors, dartEntry.getValue(SourceEntry.LINE_INFO));
-      } else if (sourceEntry is HtmlEntry) {
-        HtmlEntry htmlEntry = sourceEntry as HtmlEntry;
-        return new AnalysisErrorInfoImpl(htmlEntry.getValue(HtmlEntry.RESOLUTION_ERRORS), htmlEntry.getValue(SourceEntry.LINE_INFO));
-      }
-      return new AnalysisErrorInfoImpl(AnalysisError.NO_ERRORS, sourceEntry.getValue(SourceEntry.LINE_INFO));
+    SourceEntry sourceEntry = getReadableSourceEntry(source);
+    if (sourceEntry is DartEntry) {
+      DartEntry dartEntry = sourceEntry as DartEntry;
+      return new AnalysisErrorInfoImpl(dartEntry.allErrors, dartEntry.getValue(SourceEntry.LINE_INFO));
+    } else if (sourceEntry is HtmlEntry) {
+      HtmlEntry htmlEntry = sourceEntry as HtmlEntry;
+      return new AnalysisErrorInfoImpl(htmlEntry.allErrors, htmlEntry.getValue(SourceEntry.LINE_INFO));
     }
+    return new AnalysisErrorInfoImpl(AnalysisError.NO_ERRORS, null);
   }
   HtmlElement getHtmlElement(Source source) {
-    {
-      SourceEntry sourceEntry = getSourceEntry(source);
-      if (sourceEntry is HtmlEntry) {
-        return ((sourceEntry as HtmlEntry)).getValue(HtmlEntry.ELEMENT);
-      }
-      return null;
+    SourceEntry sourceEntry = getReadableSourceEntry(source);
+    if (sourceEntry is HtmlEntry) {
+      return ((sourceEntry as HtmlEntry)).getValue(HtmlEntry.ELEMENT);
     }
+    return null;
   }
   List<Source> getHtmlFilesReferencing(Source source) {
     {
@@ -1929,13 +2174,14 @@
   }
   List<Source> get htmlSources => getSources(SourceKind.HTML);
   SourceKind getKindOf(Source source) {
-    {
-      SourceEntry sourceEntry = getSourceEntry(source);
-      if (sourceEntry == null) {
-        return SourceKind.UNKNOWN;
+    SourceEntry sourceEntry = getReadableSourceEntry(source);
+    if (sourceEntry == null) {
+      if (AnalysisEngine.isHtmlFileName(source.shortName)) {
+        return SourceKind.HTML;
       }
-      return sourceEntry.kind;
+      return SourceKind.UNKNOWN;
     }
+    return sourceEntry.kind;
   }
   List<Source> get launchableClientLibrarySources {
     List<Source> sources = new List<Source>();
@@ -1979,24 +2225,36 @@
       return new List.from(librarySources);
     }
   }
-  LibraryElement getLibraryElement(Source source) {
+  List<Source> getLibrariesDependingOn(Source librarySource) {
     {
-      SourceEntry sourceEntry = getSourceEntry(source);
-      if (sourceEntry is DartEntry) {
-        return ((sourceEntry as DartEntry)).getValue(DartEntry.ELEMENT);
+      List<Source> dependentLibraries = new List<Source>();
+      for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(_sourceMap)) {
+        if (identical(entry.getValue().kind, SourceKind.LIBRARY)) {
+          if (contains(((entry.getValue() as DartEntry)).getValue(DartEntry.REFERENCED_LIBRARIES), librarySource)) {
+            dependentLibraries.add(entry.getKey());
+          }
+        }
       }
-      return null;
+      if (dependentLibraries.isEmpty) {
+        return Source.EMPTY_ARRAY;
+      }
+      return new List.from(dependentLibraries);
     }
   }
+  LibraryElement getLibraryElement(Source source) {
+    SourceEntry sourceEntry = getReadableSourceEntry(source);
+    if (sourceEntry is DartEntry) {
+      return ((sourceEntry as DartEntry)).getValue(DartEntry.ELEMENT);
+    }
+    return null;
+  }
   List<Source> get librarySources => getSources(SourceKind.LIBRARY);
   LineInfo getLineInfo(Source source) {
-    {
-      SourceEntry sourceEntry = getSourceEntry(source);
-      if (sourceEntry != null) {
-        return sourceEntry.getValue(SourceEntry.LINE_INFO);
-      }
-      return null;
+    SourceEntry sourceEntry = getReadableSourceEntry(source);
+    if (sourceEntry != null) {
+      return sourceEntry.getValue(SourceEntry.LINE_INFO);
     }
+    return null;
   }
   Namespace getPublicNamespace(LibraryElement library) {
     Source source2 = library.definingCompilationUnit.source;
@@ -2009,7 +2267,9 @@
       if (namespace == null) {
         NamespaceBuilder builder = new NamespaceBuilder();
         namespace = builder.createPublicNamespace(library);
-        ((dartEntry as DartEntryImpl)).setValue(DartEntry.PUBLIC_NAMESPACE, namespace);
+        DartEntryImpl dartCopy = dartEntry.writableCopy;
+        dartCopy.setValue(DartEntry.PUBLIC_NAMESPACE, namespace);
+        _sourceMap[source2] = dartCopy;
       }
       return namespace;
     }
@@ -2028,7 +2288,9 @@
         }
         NamespaceBuilder builder = new NamespaceBuilder();
         namespace = builder.createPublicNamespace(library);
-        ((dartEntry as DartEntryImpl)).setValue(DartEntry.PUBLIC_NAMESPACE, namespace);
+        DartEntryImpl dartCopy = dartEntry.writableCopy;
+        dartCopy.setValue(DartEntry.PUBLIC_NAMESPACE, namespace);
+        _sourceMap[source] = dartCopy;
       }
       return namespace;
     }
@@ -2040,38 +2302,25 @@
     return getResolvedCompilationUnit2(unitSource, library.source);
   }
   CompilationUnit getResolvedCompilationUnit2(Source unitSource, Source librarySource) {
-    {
-      accessed(unitSource);
-      DartEntry dartEntry = getDartEntry(unitSource);
-      if (dartEntry == null) {
-        return null;
-      }
-      return dartEntry.getValue2(DartEntry.RESOLVED_UNIT, librarySource);
+    SourceEntry sourceEntry = getReadableSourceEntry(unitSource);
+    if (sourceEntry is DartEntry) {
+      return ((sourceEntry as DartEntry)).getValue2(DartEntry.RESOLVED_UNIT, librarySource);
     }
+    return null;
   }
   SourceFactory get sourceFactory => _sourceFactory;
   bool isClientLibrary(Source librarySource) {
-    SourceEntry sourceEntry = getSourceEntry(librarySource);
+    SourceEntry sourceEntry = getReadableSourceEntry(librarySource);
     if (sourceEntry is DartEntry) {
       DartEntry dartEntry = sourceEntry as DartEntry;
-      CacheState isClientState = dartEntry.getState(DartEntry.IS_CLIENT);
-      CacheState isLaunchableState = dartEntry.getState(DartEntry.IS_LAUNCHABLE);
-      if (identical(isClientState, CacheState.INVALID) || identical(isClientState, CacheState.ERROR) || identical(isLaunchableState, CacheState.INVALID) || identical(isLaunchableState, CacheState.ERROR)) {
-        return false;
-      }
       return dartEntry.getValue(DartEntry.IS_CLIENT) && dartEntry.getValue(DartEntry.IS_LAUNCHABLE);
     }
     return false;
   }
   bool isServerLibrary(Source librarySource) {
-    SourceEntry sourceEntry = getSourceEntry(librarySource);
+    SourceEntry sourceEntry = getReadableSourceEntry(librarySource);
     if (sourceEntry is DartEntry) {
       DartEntry dartEntry = sourceEntry as DartEntry;
-      CacheState isClientState = dartEntry.getState(DartEntry.IS_CLIENT);
-      CacheState isLaunchableState = dartEntry.getState(DartEntry.IS_LAUNCHABLE);
-      if (identical(isClientState, CacheState.INVALID) || identical(isClientState, CacheState.ERROR) || identical(isLaunchableState, CacheState.INVALID) || identical(isLaunchableState, CacheState.ERROR)) {
-        return false;
-      }
       return !dartEntry.getValue(DartEntry.IS_CLIENT) && dartEntry.getValue(DartEntry.IS_LAUNCHABLE);
     }
     return false;
@@ -2097,7 +2346,9 @@
       }
       CompilationUnit unit = dartEntry.anyParsedCompilationUnit;
       if (unit == null) {
-        unit = internalParseCompilationUnit((dartEntry as DartEntryImpl), source);
+        DartEntryImpl dartCopy = dartEntry.writableCopy;
+        unit = internalParseCompilationUnit(dartCopy, source);
+        _sourceMap[source] = dartCopy;
       }
       return unit;
     }
@@ -2115,9 +2366,11 @@
         if (unit == null) {
           HtmlParseResult result = new HtmlParser(source).parse(scanHtml(source));
           unit = result.htmlUnit;
-          ((htmlEntry as HtmlEntryImpl)).setValue(SourceEntry.LINE_INFO, new LineInfo(result.lineStarts));
-          ((htmlEntry as HtmlEntryImpl)).setValue(HtmlEntry.PARSED_UNIT, unit);
-          ((htmlEntry as HtmlEntryImpl)).setValue(HtmlEntry.REFERENCED_LIBRARIES, getLibrarySources2(source, unit));
+          HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
+          htmlCopy.setValue(SourceEntry.LINE_INFO, new LineInfo(result.lineStarts));
+          htmlCopy.setValue(HtmlEntry.PARSED_UNIT, unit);
+          htmlCopy.setValue(HtmlEntry.REFERENCED_LIBRARIES, getLibrarySources2(source, unit));
+          _sourceMap[source] = htmlCopy;
         }
       }
       return unit;
@@ -2137,47 +2390,20 @@
     }
   }
   void recordLibraryElements(Map<Source, LibraryElement> elementMap) {
-    Source htmlSource = _sourceFactory.forUri("dart:html");
+    Source htmlSource = _sourceFactory.forUri(DartSdk.DART_HTML);
     {
       for (MapEntry<Source, LibraryElement> entry in getMapEntrySet(elementMap)) {
         Source librarySource = entry.getKey();
         LibraryElement library = entry.getValue();
-        DartEntryImpl dartEntry = getDartEntry(librarySource) as DartEntryImpl;
+        DartEntry dartEntry = getDartEntry(librarySource);
         if (dartEntry != null) {
-          dartEntry.setValue(DartEntry.ELEMENT, library);
-          dartEntry.setValue(DartEntry.IS_LAUNCHABLE, library.entryPoint != null);
-          dartEntry.setValue(DartEntry.IS_CLIENT, isClient(library, htmlSource, new Set<LibraryElement>()));
-          List<Source> unitSources = new List<Source>();
-          unitSources.add(librarySource);
-          for (CompilationUnitElement part in library.parts) {
-            Source partSource = part.source;
-            unitSources.add(partSource);
-          }
-          dartEntry.setValue(DartEntry.INCLUDED_PARTS, new List.from(unitSources));
+          DartEntryImpl dartCopy = dartEntry.writableCopy;
+          recordElementData(dartCopy, library, htmlSource);
+          _sourceMap[librarySource] = dartCopy;
         }
       }
     }
   }
-  void recordResolutionErrors(Source source, Source librarySource, List<AnalysisError> errors, LineInfo lineInfo) {
-    {
-      DartEntryImpl dartEntry = getDartEntry(source) as DartEntryImpl;
-      if (dartEntry != null) {
-        dartEntry.setValue(SourceEntry.LINE_INFO, lineInfo);
-        dartEntry.setValue2(DartEntry.RESOLUTION_ERRORS, librarySource, errors);
-      }
-      getNotice(source).setErrors(dartEntry.allErrors, lineInfo);
-    }
-  }
-  void recordResolvedCompilationUnit(Source source, Source librarySource, CompilationUnit unit) {
-    {
-      DartEntryImpl dartEntry = getDartEntry(source) as DartEntryImpl;
-      if (dartEntry != null) {
-        dartEntry.setValue2(DartEntry.RESOLVED_UNIT, librarySource, unit);
-        dartEntry.setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED);
-        getNotice(source).compilationUnit = unit;
-      }
-    }
-  }
   CompilationUnit resolveCompilationUnit(Source source2, LibraryElement library) {
     if (library == null) {
       return null;
@@ -2209,12 +2435,14 @@
             ResolverVisitor resolverVisitor = new ResolverVisitor.con2(libraryElement, unitSource, typeProvider, errorListener);
             unitAST.accept(resolverVisitor);
             ErrorReporter errorReporter = new ErrorReporter(errorListener, unitSource);
-            ErrorVerifier errorVerifier = new ErrorVerifier(errorReporter, libraryElement, typeProvider);
+            ErrorVerifier errorVerifier = new ErrorVerifier(errorReporter, libraryElement, typeProvider, new InheritanceManager(libraryElement));
             unitAST.accept(errorVerifier);
-            ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter);
+            ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter, typeProvider);
             unitAST.accept(constantVerifier);
             unitAST.resolutionErrors = errorListener.errors;
-            ((dartEntry as DartEntryImpl)).setValue2(DartEntry.RESOLVED_UNIT, librarySource, unitAST);
+            DartEntryImpl dartCopy = getDartEntry(unitSource).writableCopy;
+            dartCopy.setValue2(DartEntry.RESOLVED_UNIT, librarySource, unitAST);
+            _sourceMap[unitSource] = dartCopy;
             unit = unitAST;
           }
         } finally {
@@ -2247,6 +2475,12 @@
       return unit;
     }
   }
+  void set analysisOptions(AnalysisOptions options2) {
+    {
+      this._options = options2;
+      invalidateAllResults();
+    }
+  }
   void setContents(Source source, String contents) {
     {
       _sourceFactory.setContents(source, contents);
@@ -2265,13 +2499,7 @@
       }
       factory.context = this;
       _sourceFactory = factory;
-      for (SourceEntry sourceEntry in _sourceMap.values) {
-        if (sourceEntry is HtmlEntry) {
-          ((sourceEntry as HtmlEntryImpl)).setState(HtmlEntry.RESOLVED_UNIT, CacheState.INVALID);
-        } else if (sourceEntry is DartEntry) {
-          ((sourceEntry as DartEntryImpl)).invalidateAllResolutionInformation();
-        }
-      }
+      invalidateAllResults();
     }
   }
   Iterable<Source> sourcesToResolve(List<Source> changedSources) {
@@ -2283,6 +2511,37 @@
     }
     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.
+   * @return a list of the sources that would be processed by {@link #performAnalysisTask()}
+   */
+  List<Source> get sourcesNeedingProcessing {
+    List<Source> sources = new List<Source>();
+    {
+      for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(_sourceMap)) {
+        SourceEntry sourceEntry = entry.getValue();
+        if (sourceEntry is DartEntry) {
+          DartEntry dartEntry = sourceEntry as DartEntry;
+          CacheState parsedUnitState = dartEntry.getState(DartEntry.PARSED_UNIT);
+          CacheState elementState = dartEntry.getState(DartEntry.ELEMENT);
+          if (identical(parsedUnitState, CacheState.INVALID) || identical(elementState, CacheState.INVALID)) {
+            sources.add(entry.getKey());
+          }
+        } else if (sourceEntry is HtmlEntry) {
+          HtmlEntry htmlEntry = sourceEntry as HtmlEntry;
+          CacheState parsedUnitState = htmlEntry.getState(HtmlEntry.PARSED_UNIT);
+          CacheState resolvedUnitState = htmlEntry.getState(HtmlEntry.RESOLVED_UNIT);
+          if (identical(parsedUnitState, CacheState.INVALID) || identical(resolvedUnitState, CacheState.INVALID)) {
+            sources.add(entry.getKey());
+          }
+        }
+      }
+    }
+    return sources;
+  }
+  
   /**
    * Record that the given source was just accessed for some unspecified purpose.
    * <p>
@@ -2299,17 +2558,22 @@
       Source removedSource = _recentlyUsed.removeAt(0);
       SourceEntry sourceEntry = _sourceMap[removedSource];
       if (sourceEntry is HtmlEntry) {
-        ((sourceEntry as HtmlEntryImpl)).setState(HtmlEntry.PARSED_UNIT, CacheState.FLUSHED);
-        ((sourceEntry as HtmlEntryImpl)).setState(HtmlEntry.RESOLVED_UNIT, CacheState.FLUSHED);
+        HtmlEntryImpl htmlCopy = ((sourceEntry as HtmlEntry)).writableCopy;
+        htmlCopy.setState(HtmlEntry.PARSED_UNIT, CacheState.FLUSHED);
+        htmlCopy.setState(HtmlEntry.RESOLVED_UNIT, CacheState.FLUSHED);
+        _sourceMap[removedSource] = htmlCopy;
       } else if (sourceEntry is DartEntry) {
-        ((sourceEntry as DartEntryImpl)).setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED);
+        DartEntryImpl dartCopy = ((sourceEntry as DartEntry)).writableCopy;
+        dartCopy.setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED);
         for (Source librarySource in getLibrariesContaining(source)) {
-          ((sourceEntry as DartEntryImpl)).setState2(DartEntry.RESOLVED_UNIT, librarySource, CacheState.FLUSHED);
+          dartCopy.setState2(DartEntry.RESOLVED_UNIT, librarySource, CacheState.FLUSHED);
         }
+        _sourceMap[removedSource] = dartCopy;
       }
     }
     _recentlyUsed.add(source);
   }
+  
   /**
    * Add all of the sources contained in the given source container to the given list of sources.
    * <p>
@@ -2324,6 +2588,7 @@
       }
     }
   }
+  
   /**
    * Return {@code true} if the given array of sources contains the given source.
    * @param sources the sources being searched
@@ -2338,6 +2603,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
@@ -2352,6 +2618,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.
@@ -2371,6 +2638,7 @@
     }
     return null;
   }
+  
   /**
    * Disable flushing information from the cache until {@link #enableCacheRemoval()} has been
    * called.
@@ -2378,6 +2646,7 @@
   void disableCacheRemoval() {
     _cacheRemovalCount++;
   }
+  
   /**
    * Re-enable flushing information from the cache.
    */
@@ -2390,17 +2659,22 @@
         Source removedSource = _recentlyUsed.removeAt(0);
         SourceEntry sourceEntry = _sourceMap[removedSource];
         if (sourceEntry is HtmlEntry) {
-          ((sourceEntry as HtmlEntryImpl)).setState(HtmlEntry.PARSED_UNIT, CacheState.FLUSHED);
-          ((sourceEntry as HtmlEntryImpl)).setState(HtmlEntry.RESOLVED_UNIT, CacheState.FLUSHED);
+          HtmlEntryImpl htmlCopy = ((sourceEntry as HtmlEntry)).writableCopy;
+          htmlCopy.setState(HtmlEntry.PARSED_UNIT, CacheState.FLUSHED);
+          htmlCopy.setState(HtmlEntry.RESOLVED_UNIT, CacheState.FLUSHED);
+          _sourceMap[removedSource] = htmlCopy;
         } else if (sourceEntry is DartEntry) {
-          ((sourceEntry as DartEntryImpl)).setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED);
+          DartEntryImpl dartCopy = ((sourceEntry as DartEntry)).writableCopy;
+          dartCopy.setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED);
           for (Source librarySource in getLibrariesContaining(removedSource)) {
-            ((sourceEntry as DartEntryImpl)).setState2(DartEntry.RESOLVED_UNIT, librarySource, CacheState.FLUSHED);
+            dartCopy.setState2(DartEntry.RESOLVED_UNIT, librarySource, CacheState.FLUSHED);
           }
+          _sourceMap[removedSource] = dartCopy;
         }
       }
     }
   }
+  
   /**
    * 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
@@ -2421,6 +2695,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
@@ -2443,6 +2718,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
@@ -2465,6 +2741,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
@@ -2473,12 +2750,13 @@
    */
   List<Source> getLibrarySources2(Source htmlSource, HtmlUnit htmlUnit) {
     List<Source> libraries = new List<Source>();
-    htmlUnit.accept(new RecursiveXmlVisitor_6(this, htmlSource, libraries));
+    htmlUnit.accept(new RecursiveXmlVisitor_7(this, htmlSource, libraries));
     if (libraries.isEmpty) {
       return Source.EMPTY_ARRAY;
     }
     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
@@ -2492,6 +2770,19 @@
     }
     return notice;
   }
+  
+  /**
+   * Return the cache entry associated with the given source, or {@code null} if there is no entry
+   * associated with the source.
+   * @param source the source for which a cache entry is being sought
+   * @return the source cache entry associated with the given source
+   */
+  SourceEntry getReadableSourceEntry(Source source) {
+    {
+      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
@@ -2509,6 +2800,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
@@ -2525,6 +2817,7 @@
     }
     return new List.from(sources);
   }
+  
   /**
    * Return {@code true} if the given compilation unit has a part-of directive but no library
    * directive.
@@ -2542,6 +2835,7 @@
     }
     return hasPartOf;
   }
+  
   /**
    * Compute the kind of the given source. This method should only be invoked when the kind is not
    * already known.
@@ -2559,50 +2853,59 @@
       List<AnalysisError> errors = errorListener.getErrors2(source);
       unit.parsingErrors = errors;
       unit.lineInfo = lineInfo;
-      DartEntryImpl dartEntry = _sourceMap[source] as DartEntryImpl;
+      DartEntryImpl dartCopy = ((_sourceMap[source] as DartEntry)).writableCopy;
       if (hasPartOfDirective(unit)) {
-        dartEntry.setValue(DartEntry.SOURCE_KIND, SourceKind.PART);
+        dartCopy.setValue(DartEntry.SOURCE_KIND, SourceKind.PART);
       } else {
-        dartEntry.setValue(DartEntry.SOURCE_KIND, SourceKind.LIBRARY);
+        dartCopy.setValue(DartEntry.SOURCE_KIND, SourceKind.LIBRARY);
       }
-      dartEntry.setValue(SourceEntry.LINE_INFO, lineInfo);
-      dartEntry.setValue(DartEntry.PARSED_UNIT, unit);
-      dartEntry.setValue(DartEntry.PARSE_ERRORS, errors);
-      return dartEntry;
+      dartCopy.setValue(SourceEntry.LINE_INFO, lineInfo);
+      dartCopy.setValue(DartEntry.PARSED_UNIT, unit);
+      dartCopy.setValue(DartEntry.PARSE_ERRORS, errors);
+      _sourceMap[source] = dartCopy;
+      return dartCopy;
     } on AnalysisException catch (exception) {
-      DartEntryImpl dartEntry = _sourceMap[source] as DartEntryImpl;
-      dartEntry.setState(DartEntry.SOURCE_KIND, CacheState.ERROR);
-      dartEntry.setState(SourceEntry.LINE_INFO, CacheState.ERROR);
-      dartEntry.setState(DartEntry.PARSED_UNIT, CacheState.ERROR);
-      dartEntry.setState(DartEntry.PARSE_ERRORS, CacheState.ERROR);
-      return dartEntry;
+      DartEntryImpl dartCopy = ((_sourceMap[source] as DartEntry)).writableCopy;
+      dartCopy.setState(DartEntry.SOURCE_KIND, CacheState.ERROR);
+      dartCopy.setState(SourceEntry.LINE_INFO, CacheState.ERROR);
+      dartCopy.setState(DartEntry.PARSED_UNIT, CacheState.ERROR);
+      dartCopy.setState(DartEntry.PARSE_ERRORS, CacheState.ERROR);
+      _sourceMap[source] = dartCopy;
+      return dartCopy;
     }
   }
-  CompilationUnit internalParseCompilationUnit(DartEntryImpl dartEntry, Source source) {
+  CompilationUnit internalParseCompilationUnit(DartEntryImpl dartCopy, Source source) {
     accessed(source);
-    RecordingErrorListener errorListener = new RecordingErrorListener();
-    AnalysisContextImpl_ScanResult scanResult = internalScan(source, errorListener);
-    Parser parser = new Parser(source, errorListener);
-    CompilationUnit unit = parser.parseCompilationUnit(scanResult._token);
-    LineInfo lineInfo = new LineInfo(scanResult._lineStarts);
-    List<AnalysisError> errors = errorListener.getErrors2(source);
-    unit.parsingErrors = errors;
-    unit.lineInfo = lineInfo;
-    if (identical(dartEntry.getState(DartEntry.SOURCE_KIND), CacheState.INVALID)) {
-      if (hasPartOfDirective(unit)) {
-        dartEntry.setValue(DartEntry.SOURCE_KIND, SourceKind.PART);
-      } else {
-        dartEntry.setValue(DartEntry.SOURCE_KIND, SourceKind.LIBRARY);
+    try {
+      RecordingErrorListener errorListener = new RecordingErrorListener();
+      AnalysisContextImpl_ScanResult scanResult = internalScan(source, errorListener);
+      Parser parser = new Parser(source, errorListener);
+      CompilationUnit unit = parser.parseCompilationUnit(scanResult._token);
+      LineInfo lineInfo = new LineInfo(scanResult._lineStarts);
+      List<AnalysisError> errors = errorListener.getErrors2(source);
+      unit.parsingErrors = errors;
+      unit.lineInfo = lineInfo;
+      if (identical(dartCopy.getState(DartEntry.SOURCE_KIND), CacheState.INVALID)) {
+        if (hasPartOfDirective(unit)) {
+          dartCopy.setValue(DartEntry.SOURCE_KIND, SourceKind.PART);
+        } else {
+          dartCopy.setValue(DartEntry.SOURCE_KIND, SourceKind.LIBRARY);
+        }
       }
+      dartCopy.setValue(SourceEntry.LINE_INFO, lineInfo);
+      dartCopy.setValue(DartEntry.PARSED_UNIT, unit);
+      dartCopy.setValue(DartEntry.PARSE_ERRORS, errors);
+      return unit;
+    } on AnalysisException catch (exception) {
+      dartCopy.setState(SourceEntry.LINE_INFO, CacheState.ERROR);
+      dartCopy.setState(DartEntry.PARSED_UNIT, CacheState.ERROR);
+      dartCopy.setState(DartEntry.PARSE_ERRORS, CacheState.ERROR);
+      throw exception;
     }
-    dartEntry.setValue(SourceEntry.LINE_INFO, lineInfo);
-    dartEntry.setValue(DartEntry.PARSED_UNIT, unit);
-    dartEntry.setValue(DartEntry.PARSE_ERRORS, errors);
-    return unit;
   }
   AnalysisContextImpl_ScanResult internalScan(Source source, AnalysisErrorListener errorListener) {
     AnalysisContextImpl_ScanResult result = new AnalysisContextImpl_ScanResult();
-    Source_ContentReceiver receiver = new Source_ContentReceiver_7(source, errorListener, result);
+    Source_ContentReceiver receiver = new Source_ContentReceiver_8(source, errorListener, result);
     try {
       source.getContents(receiver);
     } catch (exception) {
@@ -2610,22 +2913,51 @@
     }
     return result;
   }
+  
+  /**
+   * Invalidate all of the results computed by this context.
+   * <p>
+   * <b>Note:</b> This method must only be invoked while we are synchronized on {@link #cacheLock}.
+   */
+  void invalidateAllResults() {
+    for (MapEntry<Source, SourceEntry> mapEntry in getMapEntrySet(_sourceMap)) {
+      SourceEntry sourceEntry = mapEntry.getValue();
+      if (sourceEntry is HtmlEntry) {
+        HtmlEntryImpl htmlCopy = ((sourceEntry as HtmlEntry)).writableCopy;
+        htmlCopy.setState(HtmlEntry.RESOLVED_UNIT, CacheState.INVALID);
+        mapEntry.setValue(htmlCopy);
+      } else if (sourceEntry is DartEntry) {
+        DartEntryImpl dartCopy = ((sourceEntry as DartEntry)).writableCopy;
+        dartCopy.invalidateAllResolutionInformation();
+        mapEntry.setValue(dartCopy);
+      }
+    }
+  }
+  
   /**
    * 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.
    * @param librarySource the source of the library being invalidated
-   * @param libraryEntry the cache entry for the library being invalidated
    */
-  void invalidateLibraryResolution(Source librarySource, DartEntryImpl libraryEntry) {
+  void invalidateLibraryResolution(Source librarySource) {
+    DartEntry libraryEntry = getDartEntry(librarySource);
     if (libraryEntry != null) {
-      for (Source unitSource in libraryEntry.getValue(DartEntry.INCLUDED_PARTS)) {
-        DartEntryImpl partEntry = getDartEntry(unitSource) as DartEntryImpl;
-        partEntry.invalidateAllResolutionInformation();
+      List<Source> includedParts = libraryEntry.getValue(DartEntry.INCLUDED_PARTS);
+      DartEntryImpl libraryCopy = libraryEntry.writableCopy;
+      libraryCopy.invalidateAllResolutionInformation();
+      libraryCopy.setState(DartEntry.INCLUDED_PARTS, CacheState.INVALID);
+      _sourceMap[librarySource] = libraryCopy;
+      for (Source unitSource in includedParts) {
+        DartEntry partEntry = getDartEntry(unitSource);
+        if (partEntry != null) {
+          DartEntryImpl dartCopy = partEntry.writableCopy;
+          dartCopy.invalidateAllResolutionInformation();
+          _sourceMap[unitSource] = dartCopy;
+        }
       }
-      libraryEntry.invalidateAllResolutionInformation();
-      libraryEntry.setState(DartEntry.INCLUDED_PARTS, CacheState.INVALID);
     }
   }
+  
   /**
    * Return {@code true} if this library is, or depends on, dart:html.
    * @param library the library being tested
@@ -2653,6 +2985,7 @@
     }
     return false;
   }
+  
   /**
    * Perform a single analysis task.
    * <p>
@@ -2669,7 +3002,9 @@
           try {
             parseCompilationUnit(entry.getKey());
           } on AnalysisException catch (exception) {
-            ((dartEntry as DartEntryImpl)).setState(DartEntry.PARSED_UNIT, CacheState.ERROR);
+            DartEntryImpl dartCopy = ((entry.getValue() as DartEntry)).writableCopy;
+            dartCopy.setState(DartEntry.PARSED_UNIT, CacheState.ERROR);
+            entry.setValue(dartCopy);
             AnalysisEngine.instance.logger.logError2("Could not parse ${entry.getKey().fullName}", exception);
           }
           return true;
@@ -2681,7 +3016,9 @@
           try {
             parseHtmlUnit(entry.getKey());
           } on AnalysisException catch (exception) {
-            ((htmlEntry as HtmlEntryImpl)).setState(HtmlEntry.PARSED_UNIT, CacheState.ERROR);
+            HtmlEntryImpl htmlCopy = ((entry.getValue() as HtmlEntry)).writableCopy;
+            htmlCopy.setState(HtmlEntry.PARSED_UNIT, CacheState.ERROR);
+            entry.setValue(htmlCopy);
             AnalysisEngine.instance.logger.logError2("Could not parse ${entry.getKey().fullName}", exception);
           }
           return true;
@@ -2697,7 +3034,9 @@
           try {
             computeLibraryElement(entry.getKey());
           } on AnalysisException catch (exception) {
-            ((dartEntry as DartEntryImpl)).setState(DartEntry.ELEMENT, CacheState.ERROR);
+            DartEntryImpl dartCopy = ((entry.getValue() as DartEntry)).writableCopy;
+            dartCopy.setState(DartEntry.ELEMENT, CacheState.ERROR);
+            entry.setValue(dartCopy);
             AnalysisEngine.instance.logger.logError2("Could not resolve ${entry.getKey().fullName}", exception);
           }
           return true;
@@ -2709,7 +3048,9 @@
           try {
             resolveHtmlUnit(entry.getKey());
           } on AnalysisException catch (exception) {
-            ((htmlEntry as HtmlEntryImpl)).setState(HtmlEntry.RESOLVED_UNIT, CacheState.ERROR);
+            HtmlEntryImpl htmlCopy = ((entry.getValue() as HtmlEntry)).writableCopy;
+            htmlCopy.setState(HtmlEntry.RESOLVED_UNIT, CacheState.ERROR);
+            entry.setValue(htmlCopy);
             AnalysisEngine.instance.logger.logError2("Could not resolve ${entry.getKey().fullName}", exception);
           }
           return true;
@@ -2718,6 +3059,76 @@
     }
     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.
+   * @param dartCopy the cache entry in which data is to be recorded
+   * @param library the library element used to record information
+   * @param htmlSource the source for the HTML library
+   */
+  void recordElementData(DartEntryImpl dartCopy, LibraryElement library, Source htmlSource) {
+    dartCopy.setValue(DartEntry.ELEMENT, library);
+    dartCopy.setValue(DartEntry.IS_LAUNCHABLE, library.entryPoint != null);
+    dartCopy.setValue(DartEntry.IS_CLIENT, isClient(library, htmlSource, new Set<LibraryElement>()));
+    List<Source> unitSources = new List<Source>();
+    unitSources.add(library.definingCompilationUnit.source);
+    for (CompilationUnitElement part in library.parts) {
+      Source partSource = part.source;
+      unitSources.add(partSource);
+    }
+    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
+   * @throws AnalysisException if the results cannot be retrieved for some reason
+   */
+  void recordResolutionResults(LibraryResolver resolver) {
+    Source htmlSource = _sourceFactory.forUri(DartSdk.DART_HTML);
+    RecordingErrorListener errorListener2 = resolver.errorListener;
+    for (Library library in resolver.resolvedLibraries) {
+      Source librarySource2 = library.librarySource;
+      Set<Source> referencedLibraries = new Set<Source>();
+      for (Library referencedLibrary in library.exports) {
+        javaSetAdd(referencedLibraries, referencedLibrary.librarySource);
+      }
+      for (Library referencedLibrary in library.imports) {
+        javaSetAdd(referencedLibraries, referencedLibrary.librarySource);
+      }
+      for (Source source in library.compilationUnitSources) {
+        CompilationUnit unit = library.getAST(source);
+        List<AnalysisError> errors = errorListener2.getErrors2(source);
+        unit.resolutionErrors = errors;
+        LineInfo lineInfo2 = unit.lineInfo;
+        {
+          DartEntry dartEntry = getDartEntry(source);
+          if (dartEntry != null) {
+            DartEntryImpl dartCopy = dartEntry.writableCopy;
+            dartCopy.setValue(SourceEntry.LINE_INFO, lineInfo2);
+            dartCopy.setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED);
+            dartCopy.setValue2(DartEntry.RESOLVED_UNIT, librarySource2, unit);
+            dartCopy.setValue2(DartEntry.RESOLUTION_ERRORS, librarySource2, errors);
+            if (identical(source, librarySource2)) {
+              recordElementData(dartCopy, library.libraryElement, htmlSource);
+              List<Source> libraries;
+              if (referencedLibraries.isEmpty) {
+                libraries = Source.EMPTY_ARRAY;
+              } else {
+                libraries = new List.from(referencedLibraries);
+              }
+              dartCopy.setValue(DartEntry.REFERENCED_LIBRARIES, libraries);
+            }
+            _sourceMap[source] = dartCopy;
+            ChangeNoticeImpl notice = getNotice(source);
+            notice.compilationUnit = unit;
+            notice.setErrors(dartCopy.allErrors, lineInfo2);
+          }
+        }
+      }
+    }
+  }
   HtmlScanResult scanHtml(Source source) {
     HtmlScanner scanner = new HtmlScanner(source);
     try {
@@ -2727,6 +3138,7 @@
     }
     return scanner.result;
   }
+  
   /**
    * Create an entry for the newly added source. Return {@code true} if the new source is a Dart
    * file.
@@ -2742,6 +3154,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
@@ -2749,27 +3162,28 @@
   void sourceChanged(Source source) {
     SourceEntry sourceEntry = _sourceMap[source];
     if (sourceEntry is HtmlEntry) {
-      HtmlEntryImpl htmlEntry = sourceEntry as HtmlEntryImpl;
-      htmlEntry.setState(HtmlEntry.ELEMENT, CacheState.INVALID);
-      htmlEntry.setState(SourceEntry.LINE_INFO, CacheState.INVALID);
-      htmlEntry.setState(HtmlEntry.PARSED_UNIT, CacheState.INVALID);
-      htmlEntry.setState(HtmlEntry.REFERENCED_LIBRARIES, CacheState.INVALID);
-      htmlEntry.setState(HtmlEntry.RESOLVED_UNIT, CacheState.INVALID);
+      HtmlEntryImpl htmlCopy = ((sourceEntry as HtmlEntry)).writableCopy;
+      htmlCopy.setState(HtmlEntry.ELEMENT, CacheState.INVALID);
+      htmlCopy.setState(SourceEntry.LINE_INFO, CacheState.INVALID);
+      htmlCopy.setState(HtmlEntry.PARSED_UNIT, CacheState.INVALID);
+      htmlCopy.setState(HtmlEntry.REFERENCED_LIBRARIES, CacheState.INVALID);
+      htmlCopy.setState(HtmlEntry.RESOLVED_UNIT, CacheState.INVALID);
+      _sourceMap[source] = htmlCopy;
     } else if (sourceEntry is DartEntry) {
-      DartEntryImpl dartEntry = sourceEntry as DartEntryImpl;
       List<Source> containingLibraries = getLibrariesContaining(source);
-      invalidateLibraryResolution(source, dartEntry);
-      dartEntry.setState(DartEntry.INCLUDED_PARTS, CacheState.INVALID);
-      dartEntry.setState(SourceEntry.LINE_INFO, CacheState.INVALID);
-      dartEntry.setState(DartEntry.PARSE_ERRORS, CacheState.INVALID);
-      dartEntry.setState(DartEntry.PARSED_UNIT, CacheState.INVALID);
-      dartEntry.setState(DartEntry.SOURCE_KIND, CacheState.INVALID);
+      DartEntryImpl dartCopy = ((sourceEntry as DartEntry)).writableCopy;
+      dartCopy.setState(SourceEntry.LINE_INFO, CacheState.INVALID);
+      dartCopy.setState(DartEntry.PARSE_ERRORS, CacheState.INVALID);
+      dartCopy.setState(DartEntry.PARSED_UNIT, CacheState.INVALID);
+      dartCopy.setState(DartEntry.SOURCE_KIND, CacheState.INVALID);
+      _sourceMap[source] = dartCopy;
+      invalidateLibraryResolution(source);
       for (Source librarySource in containingLibraries) {
-        DartEntryImpl libraryEntry = getDartEntry(librarySource) as DartEntryImpl;
-        invalidateLibraryResolution(librarySource, libraryEntry);
+        invalidateLibraryResolution(librarySource);
       }
     }
   }
+  
   /**
    * <b>Note:</b> This method must only be invoked while we are synchronized on {@link #cacheLock}.
    * @param source the source that has been deleted
@@ -2777,39 +3191,44 @@
   void sourceRemoved(Source source) {
     DartEntry dartEntry = getDartEntry(source);
     if (dartEntry != null) {
+      Set<Source> libraries = new Set<Source>();
       for (Source librarySource in getLibrariesContaining(source)) {
-        DartEntryImpl libraryEntry = getDartEntry(librarySource) as DartEntryImpl;
-        invalidateLibraryResolution(librarySource, libraryEntry);
+        javaSetAdd(libraries, librarySource);
+        for (Source dependentLibrary in getLibrariesDependingOn(librarySource)) {
+          javaSetAdd(libraries, dependentLibrary);
+        }
+      }
+      for (Source librarySource in libraries) {
+        invalidateLibraryResolution(librarySource);
       }
     }
     _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.
    */
   List<int> _lineStarts;
-  /**
-   * Initialize a newly created result object to be empty.
-   */
-  AnalysisContextImpl_ScanResult() : super() {
-  }
 }
-class Source_ContentReceiver_5 implements Source_ContentReceiver {
+class Source_ContentReceiver_6 implements Source_ContentReceiver {
   List<CharSequence> contentHolder;
-  Source_ContentReceiver_5(this.contentHolder);
+  Source_ContentReceiver_6(this.contentHolder);
   void accept(CharBuffer contents, int modificationTime) {
     contentHolder[0] = contents;
   }
@@ -2817,11 +3236,11 @@
     contentHolder[0] = new CharSequence(contents);
   }
 }
-class RecursiveXmlVisitor_6 extends RecursiveXmlVisitor<Object> {
+class RecursiveXmlVisitor_7 extends RecursiveXmlVisitor<Object> {
   final AnalysisContextImpl AnalysisContextImpl_this;
   Source htmlSource;
   List<Source> libraries;
-  RecursiveXmlVisitor_6(this.AnalysisContextImpl_this, this.htmlSource, this.libraries) : super();
+  RecursiveXmlVisitor_7(this.AnalysisContextImpl_this, this.htmlSource, this.libraries) : super();
   Object visitXmlTagNode(XmlTagNode node) {
     if (javaStringEqualsIgnoreCase(node.tag.lexeme, AnalysisContextImpl._TAG_SCRIPT)) {
       for (XmlAttributeNode attribute in node.attributes) {
@@ -2844,11 +3263,11 @@
     return super.visitXmlTagNode(node);
   }
 }
-class Source_ContentReceiver_7 implements Source_ContentReceiver {
+class Source_ContentReceiver_8 implements Source_ContentReceiver {
   Source source;
   AnalysisErrorListener errorListener;
   AnalysisContextImpl_ScanResult result;
-  Source_ContentReceiver_7(this.source, this.errorListener, this.result);
+  Source_ContentReceiver_8(this.source, this.errorListener, this.result);
   void accept(CharBuffer contents, int modificationTime2) {
     CharBufferScanner scanner = new CharBufferScanner(source, contents, errorListener);
     result._modificationTime = modificationTime2;
@@ -2862,19 +3281,23 @@
     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
@@ -2884,11 +3307,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.
@@ -2896,10 +3321,41 @@
    */
   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.
+   * @param isStrict {@code true} if analysis is to use strict mode
+   */
+  void set strictMode(bool isStrict) {
+    _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.
@@ -2910,6 +3366,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.
@@ -2921,6 +3378,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>
@@ -2931,6 +3389,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>
@@ -2940,6 +3399,7 @@
    * </ul>
    */
   static final CacheState INVALID = new CacheState('INVALID', 3);
+  
   /**
    * The data is in the cache and up-to-date.
    * <p>
@@ -2951,42 +3411,52 @@
    */
   static final CacheState VALID = new CacheState('VALID', 4);
   static final List<CacheState> values = [ERROR, FLUSHED, IN_PROCESS, INVALID, VALID];
-  final String __name;
-  final int __ordinal;
-  int get ordinal => __ordinal;
-  CacheState(this.__name, this.__ordinal) {
+  
+  /// 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) {
   }
-  int compareTo(CacheState other) => __ordinal - other.__ordinal;
-  String toString() => __name;
+  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
@@ -2994,29 +3464,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
@@ -3024,6 +3499,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.
@@ -3035,12 +3511,14 @@
     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
@@ -3048,11 +3526,6 @@
    * will be such a resolver.
    */
   InternalAnalysisContext _sdkAnalysisContext;
-  /**
-   * Initialize a newly created delegating analysis context.
-   */
-  DelegatingAnalysisContextImpl() : super() {
-  }
   void addSourceInfo(Source source, SourceEntry info) {
     if (source.isInSystemLibrary()) {
       _sdkAnalysisContext.addSourceInfo(source, info);
@@ -3137,6 +3610,13 @@
       return super.getLibrariesContaining(source);
     }
   }
+  List<Source> getLibrariesDependingOn(Source librarySource) {
+    if (librarySource.isInSystemLibrary()) {
+      return _sdkAnalysisContext.getLibrariesDependingOn(librarySource);
+    } else {
+      return super.getLibrariesDependingOn(librarySource);
+    }
+  }
   LibraryElement getLibraryElement(Source source) {
     if (source.isInSystemLibrary()) {
       return _sdkAnalysisContext.getLibraryElement(source);
@@ -3220,20 +3700,6 @@
       super.recordLibraryElements(elementMap);
     }
   }
-  void recordResolutionErrors(Source source, Source librarySource, List<AnalysisError> errors, LineInfo lineInfo) {
-    if (source.isInSystemLibrary()) {
-      _sdkAnalysisContext.recordResolutionErrors(source, librarySource, errors, lineInfo);
-    } else {
-      super.recordResolutionErrors(source, librarySource, errors, lineInfo);
-    }
-  }
-  void recordResolvedCompilationUnit(Source source, Source librarySource, CompilationUnit unit) {
-    if (source.isInSystemLibrary()) {
-      _sdkAnalysisContext.recordResolvedCompilationUnit(source, librarySource, unit);
-    } else {
-      super.recordResolvedCompilationUnit(source, librarySource, unit);
-    }
-  }
   CompilationUnit resolveCompilationUnit(Source source, LibraryElement library) {
     if (source.isInSystemLibrary()) {
       return _sdkAnalysisContext.resolveCompilationUnit(source, library);
@@ -3276,12 +3742,14 @@
     }
   }
 }
+
 /**
  * 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
@@ -3290,32 +3758,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_178_impl();
+    _jtd_constructor_182_impl();
   }
-  _jtd_constructor_178_impl() {
-    _jtd_constructor_179_impl(new AnalysisContextImpl());
+  _jtd_constructor_182_impl() {
+    _jtd_constructor_183_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_179_impl(context);
+    _jtd_constructor_183_impl(context);
   }
-  _jtd_constructor_179_impl(InternalAnalysisContext context) {
+  _jtd_constructor_183_impl(InternalAnalysisContext context) {
     _basis = context;
   }
   void addSourceInfo(Source source, SourceEntry info) {
@@ -3408,6 +3880,16 @@
     }
   }
   InternalAnalysisContext extractContextInto(SourceContainer container, InternalAnalysisContext newContext) => _basis.extractContextInto(container, newContext);
+  AnalysisOptions get analysisOptions {
+    InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getAnalysisOptions");
+    try {
+      instrumentation.metric3("contextId", _contextId);
+      return _basis.analysisOptions;
+    } finally {
+      instrumentation.log();
+    }
+  }
+  
   /**
    * @return the underlying {@link AnalysisContext}.
    */
@@ -3517,6 +3999,19 @@
       instrumentation.log();
     }
   }
+  List<Source> getLibrariesDependingOn(Source librarySource) {
+    InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getLibrariesDependingOn");
+    try {
+      instrumentation.metric3("contextId", _contextId);
+      List<Source> ret = _basis.getLibrariesDependingOn(librarySource);
+      if (ret != null) {
+        instrumentation.metric2("Source-count", ret.length);
+      }
+      return ret;
+    } finally {
+      instrumentation.log();
+    }
+  }
   LibraryElement getLibraryElement(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getLibraryElement");
     try {
@@ -3647,12 +4142,6 @@
   void recordLibraryElements(Map<Source, LibraryElement> elementMap) {
     _basis.recordLibraryElements(elementMap);
   }
-  void recordResolutionErrors(Source source, Source librarySource, List<AnalysisError> errors, LineInfo lineInfo) {
-    _basis.recordResolutionErrors(source, librarySource, errors, lineInfo);
-  }
-  void recordResolvedCompilationUnit(Source source, Source librarySource, CompilationUnit unit) {
-    _basis.recordResolvedCompilationUnit(source, librarySource, unit);
-  }
   CompilationUnit resolveCompilationUnit(Source unitSource, LibraryElement library) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-resolveCompilationUnit");
     try {
@@ -3689,6 +4178,15 @@
       instrumentation.log();
     }
   }
+  void set analysisOptions(AnalysisOptions options) {
+    InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-setAnalysisOptions");
+    try {
+      instrumentation.metric3("contextId", _contextId);
+      _basis.analysisOptions = options;
+    } finally {
+      instrumentation.log();
+    }
+  }
   void setContents(Source source, String contents) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-setContents");
     try {
@@ -3717,17 +4215,20 @@
     }
   }
 }
+
 /**
  * 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
@@ -3737,6 +4238,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.
@@ -3746,6 +4248,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.
@@ -3753,6 +4256,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.
@@ -3761,6 +4265,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.
@@ -3768,25 +4273,8 @@
    * the elements representing the libraries
    */
   void recordLibraryElements(Map<Source, LibraryElement> elementMap);
-  /**
-   * Give the resolution errors and line info associated with the given source, add the information
-   * to the cache.
-   * @param source the source with which the information is associated
-   * @param librarySource the source of the defining compilation unit of the library in which the
-   * source was resolved
-   * @param errors the resolution errors associated with the source
-   * @param lineInfo the line information associated with the source
-   */
-  void recordResolutionErrors(Source source, Source librarySource, List<AnalysisError> errors, LineInfo lineInfo);
-  /**
-   * Give the resolved compilation unit associated with the given source, add the unit to the cache.
-   * @param source the source with which the unit is associated
-   * @param librarySource the source of the defining compilation unit of the library in which the
-   * source was resolved
-   * @param unit the compilation unit associated with the source
-   */
-  void recordResolvedCompilationUnit(Source source, Source librarySource, CompilationUnit unit);
 }
+
 /**
  * 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
@@ -3794,10 +4282,22 @@
  * @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
+   */
+  void addAll(RecordingErrorListener listener) {
+    for (AnalysisError error in listener.errors) {
+      onError(error);
+    }
+  }
+  
   /**
    * Answer the errors collected by the listener.
    * @return an array of errors (not {@code null}, contains no {@code null}s)
@@ -3813,6 +4313,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
@@ -3837,6 +4338,7 @@
     errorsForSource.add(event);
   }
 }
+
 /**
  * Instances of the class {@code ResolutionEraser} remove any resolution information from an AST
  * structure when used to visit that structure.
@@ -3908,6 +4410,7 @@
     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
@@ -3917,28 +4420,33 @@
  */
 abstract class Logger {
   static 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
@@ -3946,6 +4454,7 @@
    */
   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 152ea76..21804c9 100644
--- a/pkg/analyzer_experimental/lib/src/generated/error.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/error.dart
@@ -8,83 +8,150 @@
 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
  */
 class ErrorSeverity implements Comparable<ErrorSeverity> {
+
   /**
    * The severity representing a non-error. This is never used for any error code, but is useful for
    * clients.
    */
   static final ErrorSeverity NONE = new ErrorSeverity('NONE', 0, " ", "none");
+
   /**
    * 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");
+
   /**
    * The severity representing an error.
    */
   static final ErrorSeverity ERROR = new ErrorSeverity('ERROR', 2, "E", "error");
   static final List<ErrorSeverity> values = [NONE, WARNING, ERROR];
-  final String __name;
-  final int __ordinal;
-  int get ordinal => __ordinal;
+
+  /// 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 name of the severity used when producing machine output.
    */
   String _machineCode;
+
   /**
    * The name of the severity used when producing readable output.
    */
   String _displayName;
+
   /**
    * Initialize a newly created severity with the given names.
    * @param machineCode the name of the severity used when producing machine output
    * @param displayName the name of the severity used when producing readable output
    */
-  ErrorSeverity(this.__name, this.__ordinal, String machineCode, String displayName) {
+  ErrorSeverity(this.name, this.ordinal, String machineCode, String displayName) {
     this._machineCode = machineCode;
     this._displayName = displayName;
   }
+
   /**
    * Return the name of the severity used when producing readable output.
    * @return the name of the severity used when producing readable output
    */
   String get displayName => _displayName;
+
   /**
    * Return the name of the severity used when producing machine output.
    * @return the name of the severity used when producing machine output
    */
   String get machineCode => _machineCode;
+
   /**
    * Return the severity constant that represents the greatest severity.
    * @param severity the severity being compared against
    * @return the most sever of this or the given severity
    */
   ErrorSeverity max(ErrorSeverity severity) => this.ordinal >= severity.ordinal ? this : severity;
-  int compareTo(ErrorSeverity other) => __ordinal - other.__ordinal;
-  String toString() => __name;
+  int compareTo(ErrorSeverity other) => ordinal - other.ordinal;
+  String toString() => name;
 }
+
+/**
+ * Instances of the class {@code AnalysisErrorWithProperties}
+ */
+class AnalysisErrorWithProperties extends AnalysisError {
+
+  /**
+   * The properties associated with this error.
+   */
+  Map<ErrorProperty, Object> _propertyMap = new Map<ErrorProperty, Object>();
+
+  /**
+   * Initialize a newly created analysis error for the specified source. The error has no location
+   * information.
+   * @param source the source for which the exception occurred
+   * @param errorCode the error code to be associated with this error
+   * @param arguments the arguments used to build the error message
+   */
+  AnalysisErrorWithProperties.con1(Source source, ErrorCode errorCode, List<Object> arguments) : super.con1(source, errorCode, arguments) {
+    _jtd_constructor_133_impl(source, errorCode, arguments);
+  }
+  _jtd_constructor_133_impl(Source source, ErrorCode errorCode, List<Object> arguments) {
+  }
+
+  /**
+   * Initialize a newly created analysis error for the specified source at the given location.
+   * @param source the source for which the exception occurred
+   * @param offset the offset of the location of the error
+   * @param length the length of the location of the error
+   * @param errorCode the error code to be associated with this error
+   * @param arguments the arguments used to build the error message
+   */
+  AnalysisErrorWithProperties.con2(Source source, int offset, int length, ErrorCode errorCode, List<Object> arguments) : super.con2(source, offset, length, errorCode, arguments) {
+    _jtd_constructor_134_impl(source, offset, length, errorCode, arguments);
+  }
+  _jtd_constructor_134_impl(Source source, int offset, int length, ErrorCode errorCode, List<Object> arguments) {
+  }
+  Object getProperty(ErrorProperty property) => _propertyMap[property];
+
+  /**
+   * Set the value of the given property to the given value. Using a value of {@code null} will
+   * effectively remove the property from this error.
+   * @param property the property whose value is to be returned
+   * @param value the new value of the given property
+   */
+  void setProperty(ErrorProperty property, Object value) {
+    _propertyMap[property] = value;
+  }
+}
+
 /**
  * Instances of the class {@code ErrorReporter} wrap an error listener with utility methods used to
  * create the errors being reported.
  * @coverage dart.engine.error
  */
 class ErrorReporter {
+
   /**
    * The error listener to which errors will be reported.
    */
   AnalysisErrorListener _errorListener;
+
   /**
    * The default source to be used when reporting errors.
    */
   Source _defaultSource;
+
   /**
    * The source to be used when reporting errors.
    */
   Source _source;
+
   /**
    * Initialize a newly created error reporter that will report errors to the given listener.
    * @param errorListener the error listener to which errors will be reported
@@ -100,24 +167,46 @@
     this._defaultSource = defaultSource;
     this._source = defaultSource;
   }
+
+  /**
+   * Report a passed error.
+   * @param error the error to report
+   */
+  void reportError(AnalysisError error) {
+    _errorListener.onError(error);
+  }
+
   /**
    * Report an error with the given error code and arguments.
    * @param errorCode the error code of the error to be reported
    * @param node the node specifying the location of the error
    * @param arguments the arguments to the error, used to compose the error message
    */
-  void reportError(ErrorCode errorCode, ASTNode node, List<Object> arguments) {
+  void reportError2(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
+   * @param offset the offset of the location of the error
+   * @param length the length of the location of the error
+   * @param arguments the arguments to the error, used to compose the error message
+   */
+  void reportError3(ErrorCode errorCode, int offset, int length, List<Object> arguments) {
+    _errorListener.onError(new AnalysisError.con2(_source, offset, length, errorCode, arguments));
+  }
+
   /**
    * Report an error with the given error code and arguments.
    * @param errorCode the error code of the error to be reported
    * @param token the token specifying the location of the error
    * @param arguments the arguments to the error, used to compose the error message
    */
-  void reportError2(ErrorCode errorCode, Token token, List<Object> arguments) {
+  void reportError4(ErrorCode errorCode, Token token, List<Object> arguments) {
     _errorListener.onError(new AnalysisError.con2(_source, token.offset, token.length, errorCode, arguments));
   }
+
   /**
    * Set the source to be used when reporting errors. Setting the source to {@code null} will cause
    * the default source to be used.
@@ -127,6 +216,7 @@
     this._source = source2 == null ? _defaultSource : source2;
   }
 }
+
 /**
  * Instances of the class {@code AnalysisError} represent an error discovered during the analysis of
  * some Dart code.
@@ -134,15 +224,18 @@
  * @coverage dart.engine.error
  */
 class AnalysisError {
+
   /**
    * An empty array of errors used when no errors are expected.
    */
   static List<AnalysisError> NO_ERRORS = new List<AnalysisError>(0);
+
   /**
    * A {@link Comparator} that sorts by the name of the file that the {@link AnalysisError} was
    * found.
    */
   static Comparator<AnalysisError> FILE_COMPARATOR = (AnalysisError o1, AnalysisError o2) => o1.source.shortName.compareTo(o2.source.shortName);
+
   /**
    * A {@link Comparator} that sorts error codes first by their severity (errors first, warnings
    * second), and then by the the error code type.
@@ -160,27 +253,33 @@
       return errorSeverity2.compareTo(errorSeverity1);
     }
   };
+
   /**
    * The error code associated with the error.
    */
   ErrorCode _errorCode;
+
   /**
    * The localized error message.
    */
   String _message;
+
   /**
    * The source in which the error occurred, or {@code null} if unknown.
    */
   Source _source;
+
   /**
    * The character offset from the beginning of the source (zero based) where the error occurred.
    */
   int _offset = 0;
+
   /**
    * The number of characters from the offset to the end of the source which encompasses the
    * compilation error.
    */
   int _length = 0;
+
   /**
    * Initialize a newly created analysis error for the specified source. The error has no location
    * information.
@@ -196,6 +295,7 @@
     this._errorCode = errorCode2;
     this._message = JavaString.format(errorCode2.message, arguments);
   }
+
   /**
    * Initialize a newly created analysis error for the specified source at the given location.
    * @param source the source for which the exception occurred
@@ -214,28 +314,41 @@
     this._errorCode = errorCode2;
     this._message = JavaString.format(errorCode2.message, arguments);
   }
+
   /**
    * Return the error code associated with the error.
    * @return the error code associated with the error
    */
   ErrorCode get errorCode => _errorCode;
+
   /**
    * Return the number of characters from the offset to the end of the source which encompasses the
    * compilation error.
    * @return the length of the error location
    */
   int get length => _length;
+
   /**
    * Return the localized error message.
    * @return the localized error message
    */
   String get message => _message;
+
   /**
    * Return the character offset from the beginning of the source (zero based) where the error
    * occurred.
    * @return the offset to the start of the error location
    */
   int get offset => _offset;
+
+  /**
+   * Return the value of the given property, or {@code null} if the given property is not defined
+   * for this error.
+   * @param property the property whose value is to be returned
+   * @return the value of the given property
+   */
+  Object getProperty(ErrorProperty property) => null;
+
   /**
    * Return the source in which the error occurred, or {@code null} if unknown.
    * @return the source in which the error occurred
@@ -247,6 +360,7 @@
     hashCode ^= (_source != null) ? _source.hashCode : 0;
     return hashCode;
   }
+
   /**
    * Set the source in which the error occurred to the given source.
    * @param source the source in which the error occurred
@@ -266,82 +380,114 @@
     return builder.toString();
   }
 }
+
+/**
+ * The enumeration {@code ErrorProperty} defines the properties that can be associated with an{@link AnalysisError}.
+ */
+class ErrorProperty implements Comparable<ErrorProperty> {
+
+  /**
+   * A property whose value is an array of {@link ExecutableElement executable elements} that should
+   * be but are not implemented by a concrete class.
+   */
+  static final ErrorProperty UNIMPLEMENTED_METHODS = new ErrorProperty('UNIMPLEMENTED_METHODS', 0);
+  static final List<ErrorProperty> values = [UNIMPLEMENTED_METHODS];
+
+  /// The name of this enum constant, as declared in the enum declaration.
+  final String name;
+
+  /// The position in the enum declaration.
+  final int ordinal;
+  ErrorProperty(this.name, this.ordinal) {
+  }
+  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}.
  * @coverage dart.engine.error
  */
 abstract class ErrorCode {
+
   /**
    * Return the severity of this error.
    * @return the severity of this error
    */
   ErrorSeverity get errorSeverity;
+
   /**
    * Return the message template used to create the message to be displayed for this error.
    * @return the message template used to create the message to be displayed for this error
    */
   String get message;
+
   /**
    * Return the type of the error.
    * @return the type of the error
    */
   ErrorType get type;
-  /**
-   * Return {@code true} if this error should cause recompilation of the source during the next
-   * incremental compilation.
-   * @return {@code true} if this error should cause recompilation of the source during the next
-   * incremental compilation
-   */
-  bool needsRecompilation();
 }
+
 /**
  * Instances of the enumeration {@code ErrorType} represent the type of an {@link ErrorCode}.
  * @coverage dart.engine.error
  */
 class ErrorType implements Comparable<ErrorType> {
+
   /**
    * Compile-time errors are errors that preclude execution. A compile time error must be reported
    * by a Dart compiler before the erroneous code is executed.
    */
   static final ErrorType COMPILE_TIME_ERROR = new ErrorType('COMPILE_TIME_ERROR', 0, ErrorSeverity.ERROR);
+
   /**
    * 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);
+
   /**
    * 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);
+
   /**
    * 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];
-  final String __name;
-  final int __ordinal;
-  int get ordinal => __ordinal;
+
+  /// 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 type of error.
    */
   ErrorSeverity _severity;
+
   /**
    * Initialize a newly created error type to have the given severity.
    * @param severity the severity of this type of error
    */
-  ErrorType(this.__name, this.__ordinal, ErrorSeverity severity) {
+  ErrorType(this.name, this.ordinal, ErrorSeverity severity) {
     this._severity = severity;
   }
+
   /**
    * Return the severity of this type of error.
    * @return the severity of this type of error
    */
   ErrorSeverity get severity => _severity;
-  int compareTo(ErrorType other) => __ordinal - other.__ordinal;
-  String toString() => __name;
+  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
@@ -350,12 +496,17 @@
  * @coverage dart.engine.error
  */
 class CompileTimeErrorCode implements Comparable<CompileTimeErrorCode>, ErrorCode {
+
   /**
    * 14.2 Exports: It is a compile-time error if a name <i>N</i> is re-exported by a library
    * <i>L</i> and <i>N</i> is introduced into the export namespace of <i>L</i> by more than one
    * export.
+   * @param ambiguousElementName the name of the ambiguous element
+   * @param firstLibraryName the name of the first library that the type is found
+   * @param secondLibraryName the name of the second library that the type is found
    */
-  static final CompileTimeErrorCode AMBIGUOUS_EXPORT = new CompileTimeErrorCode('AMBIGUOUS_EXPORT', 0, "");
+  static final CompileTimeErrorCode AMBIGUOUS_EXPORT = new CompileTimeErrorCode('AMBIGUOUS_EXPORT', 0, "The element '%s' is defined in the libraries '%s' and '%s'");
+
   /**
    * 14.1 Imports: If a name <i>N</i> is referenced by a library <i>L</i> and <i>N</i> is introduced
    * into the top level scope <i>L</i> by more than one import then:
@@ -365,78 +516,141 @@
    * referenced during a subtype test.
    * <li>Otherwise, it is a compile-time error.
    * </ol>
+   * @param ambiguousElementName the name of the ambiguous element
+   * @param firstLibraryName the name of the first library that the type is found
+   * @param secondLibraryName the name of the second library that the type is found
    */
-  static final CompileTimeErrorCode AMBIGUOUS_IMPORT = new CompileTimeErrorCode('AMBIGUOUS_IMPORT', 1, "");
+  static final CompileTimeErrorCode AMBIGUOUS_IMPORT = new CompileTimeErrorCode('AMBIGUOUS_IMPORT', 1, "The element '%s' is defined in the libraries '%s' and '%s'");
+
   /**
    * 12.33 Argument Definition Test: It is a compile time error if <i>v</i> does not denote a formal
    * parameter.
    * @param the name of the identifier in the argument definition test that is not a parameter
    */
   static final CompileTimeErrorCode ARGUMENT_DEFINITION_TEST_NON_PARAMETER = new CompileTimeErrorCode('ARGUMENT_DEFINITION_TEST_NON_PARAMETER', 2, "'%s' is not a parameter");
+
   /**
    * 12.30 Identifier Reference: It is a compile-time error to use a built-in identifier other than
    * dynamic as a type annotation.
    */
   static final CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE = new CompileTimeErrorCode('BUILT_IN_IDENTIFIER_AS_TYPE', 3, "The built-in identifier '%s' cannot be as a type");
+
   /**
    * 12.30 Identifier Reference: It is a compile-time error if a built-in identifier is used as the
    * declared name of a class, type parameter or type alias.
    */
   static final CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_NAME = new CompileTimeErrorCode('BUILT_IN_IDENTIFIER_AS_TYPE_NAME', 4, "The built-in identifier '%s' cannot be used as a type name");
+
   /**
    * 12.30 Identifier Reference: It is a compile-time error if a built-in identifier is used as the
    * declared name of a class, type parameter or type alias.
    */
   static final CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME = new CompileTimeErrorCode('BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME', 5, "The built-in identifier '%s' cannot be used as a type alias name");
+
   /**
    * 12.30 Identifier Reference: It is a compile-time error if a built-in identifier is used as the
    * declared name of a class, type parameter or type alias.
    */
   static final CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME = new CompileTimeErrorCode('BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME', 6, "The built-in identifier '%s' cannot be used as a type variable name");
+
   /**
    * 13.9 Switch: It is a compile-time error if the class <i>C</i> implements the operator
    * <i>==</i>.
    */
   static final CompileTimeErrorCode CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS = new CompileTimeErrorCode('CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS', 7, "The switch case expression type '%s' cannot override the == operator");
+
   /**
    * 12.1 Constants: It is a compile-time error if evaluation of a compile-time constant would raise
    * an exception.
    */
   static final CompileTimeErrorCode COMPILE_TIME_CONSTANT_RAISES_EXCEPTION = new CompileTimeErrorCode('COMPILE_TIME_CONSTANT_RAISES_EXCEPTION', 8, "");
+
   /**
    * 7.6 Constructors: A constructor name always begins with the name of its immediately enclosing
    * class, and may optionally be followed by a dot and an identifier <i>id</i>. It is a
    * compile-time error if <i>id</i> is the name of a member declared in the immediately enclosing
    * class.
    */
-  static final CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD = new CompileTimeErrorCode('CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD', 9, "'%s' cannot be used to name a constructor and a method in this class");
+  static final CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD = new CompileTimeErrorCode('CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD', 9, "'%s' cannot be used to name a constructor and a field in this class");
+
   /**
    * 7.6 Constructors: A constructor name always begins with the name of its immediately enclosing
    * class, and may optionally be followed by a dot and an identifier <i>id</i>. It is a
    * compile-time error if <i>id</i> is the name of a member declared in the immediately enclosing
    * class.
    */
-  static final CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD = new CompileTimeErrorCode('CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD', 10, "'%s' cannot be used to name a constructor and a field in this class");
-  /**
-   * 7.6.3 Constant Constructors: It is a compile-time error if a constant constructor is declared
-   * by a class that has a non-final instance variable.
-   */
-  static final CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD = new CompileTimeErrorCode('CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD', 11, "Classes with non-final fields cannot define 'const' constructors");
-  /**
-   * 6.2 Formal Parameters: It is a compile-time error if a formal parameter is declared as a
-   * constant variable.
-   */
-  static final CompileTimeErrorCode CONST_FORMAL_PARAMETER = new CompileTimeErrorCode('CONST_FORMAL_PARAMETER', 12, "Parameters cannot be 'const'");
-  /**
-   * 5 Variables: A constant variable must be initialized to a compile-time constant or a
-   * compile-time error occurs.
-   */
-  static final CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE = new CompileTimeErrorCode('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE', 13, "'const' variables must be constant value");
+  static final CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD = new CompileTimeErrorCode('CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD', 10, "'%s' cannot be used to name a constructor and a method in this class");
+
   /**
    * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
    * uncaught exception being thrown.
    */
-  static final CompileTimeErrorCode CONST_EVAL_THROWS_EXCEPTION = new CompileTimeErrorCode('CONST_EVAL_THROWS_EXCEPTION', 14, "'const' constructors cannot throw exceptions");
+  static final CompileTimeErrorCode CONST_CONSTRUCTOR_THROWS_EXCEPTION = new CompileTimeErrorCode('CONST_CONSTRUCTOR_THROWS_EXCEPTION', 11, "'const' constructors cannot throw exceptions");
+
+  /**
+   * 7.6.3 Constant Constructors: It is a compile-time error if a constant constructor is declared
+   * by a class that has a non-final instance variable.
+   * <p>
+   * The above refers to both locally declared and inherited instance variables.
+   */
+  static final CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD = new CompileTimeErrorCode('CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD', 12, "Cannot define the 'const' constructor for a class with non-final fields");
+
+  /**
+   * 7.6.1 Generative Constructors: In checked mode, it is a dynamic type error if o is not
+   * <b>null</b> and the interface of the class of <i>o</i> is not a subtype of the static type of
+   * the field <i>v</i>.
+   * <p>
+   * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
+   * uncaught exception being thrown.
+   * @param initializerType the name of the type of the initializer expression
+   * @param fieldType the name of the type of the field
+   */
+  static final CompileTimeErrorCode CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE = new CompileTimeErrorCode('CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE', 13, "The initializer type '%s' cannot be assigned to the field type '%s'");
+
+  /**
+   * 6.2 Formal Parameters: It is a compile-time error if a formal parameter is declared as a
+   * constant variable.
+   */
+  static final CompileTimeErrorCode CONST_FORMAL_PARAMETER = new CompileTimeErrorCode('CONST_FORMAL_PARAMETER', 14, "Parameters cannot be 'const'");
+
+  /**
+   * 5 Variables: A constant variable must be initialized to a compile-time constant or a
+   * compile-time error occurs.
+   */
+  static final CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE = new CompileTimeErrorCode('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE', 15, "'const' variables must be constant value");
+
+  /**
+   * 12.11.2 Const: An expression of one of the forms !e, e1 && e2 or e1 || e2, where e, e1 and e2
+   * are constant expressions that evaluate to a boolean value.
+   */
+  static final CompileTimeErrorCode CONST_EVAL_TYPE_BOOL = new CompileTimeErrorCode('CONST_EVAL_TYPE_BOOL', 16, "An expression of type 'bool' was expected");
+
+  /**
+   * 12.11.2 Const: An expression of one of the forms e1 == e2 or e1 != e2 where e1 and e2 are
+   * constant expressions that evaluate to a numeric, string or boolean value or to null.
+   */
+  static final CompileTimeErrorCode CONST_EVAL_TYPE_BOOL_NUM_STRING = new CompileTimeErrorCode('CONST_EVAL_TYPE_BOOL_NUM_STRING', 17, "An expression of type 'bool', 'num', 'String' or 'null' was expected");
+
+  /**
+   * 12.11.2 Const: An expression of one of the forms ~e, e1 ^ e2, e1 & e2, e1 | e2, e1 >> e2 or e1
+   * << e2, where e, e1 and e2 are constant expressions that evaluate to an integer value or to
+   * null.
+   */
+  static final CompileTimeErrorCode CONST_EVAL_TYPE_INT = new CompileTimeErrorCode('CONST_EVAL_TYPE_INT', 18, "An expression of type 'int' was expected");
+
+  /**
+   * 12.11.2 Const: An expression of one of the forms e, e1 + e2, e1 - e2, e1 * e2, e1 / e2, e1 ~/
+   * e2, e1 > e2, e1 < e2, e1 >= e2, e1 <= e2 or e1 % e2, where e, e1 and e2 are constant
+   * expressions that evaluate to a numeric value or to null..
+   */
+  static final CompileTimeErrorCode CONST_EVAL_TYPE_NUM = new CompileTimeErrorCode('CONST_EVAL_TYPE_NUM', 19, "An expression of type 'num' was expected");
+
+  /**
+   * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
+   * uncaught exception being thrown.
+   */
+  static final CompileTimeErrorCode CONST_EVAL_THROWS_EXCEPTION = new CompileTimeErrorCode('CONST_EVAL_THROWS_EXCEPTION', 20, "Evaluation of this constant expression causes exception");
+
   /**
    * 12.11.2 Const: If <i>T</i> is a parameterized type <i>S&lt;U<sub>1</sub>, &hellip;,
    * U<sub>m</sub>&gt;</i>, let <i>R = S</i>; It is a compile time error if <i>S</i> is not a
@@ -445,19 +659,22 @@
    * @param parameterCount the number of type parameters that were declared
    * @param argumentCount the number of type arguments provided
    */
-  static final CompileTimeErrorCode CONST_WITH_INVALID_TYPE_PARAMETERS = new CompileTimeErrorCode('CONST_WITH_INVALID_TYPE_PARAMETERS', 15, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
+  static final CompileTimeErrorCode CONST_WITH_INVALID_TYPE_PARAMETERS = new CompileTimeErrorCode('CONST_WITH_INVALID_TYPE_PARAMETERS', 21, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
+
   /**
    * 12.11.2 Const: If <i>e</i> is of the form <i>const T(a<sub>1</sub>, &hellip;, a<sub>n</sub>,
    * x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i> it is a
    * compile-time error if the type <i>T</i> does not declare a constant constructor with the same
    * name as the declaration of <i>T</i>.
    */
-  static final CompileTimeErrorCode CONST_WITH_NON_CONST = new CompileTimeErrorCode('CONST_WITH_NON_CONST', 16, "The constructor being called is not a 'const' constructor");
+  static final CompileTimeErrorCode CONST_WITH_NON_CONST = new CompileTimeErrorCode('CONST_WITH_NON_CONST', 22, "The constructor being called is not a 'const' constructor");
+
   /**
    * 12.11.2 Const: In all of the above cases, it is a compile-time error if <i>a<sub>i</sub>, 1
    * &lt;= i &lt;= n + k</i>, is not a compile-time constant expression.
    */
-  static final CompileTimeErrorCode CONST_WITH_NON_CONSTANT_ARGUMENT = new CompileTimeErrorCode('CONST_WITH_NON_CONSTANT_ARGUMENT', 17, "");
+  static final CompileTimeErrorCode CONST_WITH_NON_CONSTANT_ARGUMENT = new CompileTimeErrorCode('CONST_WITH_NON_CONSTANT_ARGUMENT', 23, "Arguments of a constant creation must be constant expressions");
+
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T</i> is not a class accessible in the current
    * scope, optionally followed by type arguments.
@@ -466,55 +683,94 @@
    * x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip; x<sub>n+k</sub>: a<sub>n+k</sub>)</i> it is a
    * compile-time error if <i>T</i> is not a class accessible in the current scope, optionally
    * followed by type arguments.
+   * @param name the name of the non-type element
    */
-  static final CompileTimeErrorCode CONST_WITH_NON_TYPE = new CompileTimeErrorCode('CONST_WITH_NON_TYPE', 18, "");
+  static final CompileTimeErrorCode CONST_WITH_NON_TYPE = new CompileTimeErrorCode('CONST_WITH_NON_TYPE', 24, "The name '%s' is not a class");
+
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T</i> includes any type parameters.
    */
-  static final CompileTimeErrorCode CONST_WITH_TYPE_PARAMETERS = new CompileTimeErrorCode('CONST_WITH_TYPE_PARAMETERS', 19, "");
+  static final CompileTimeErrorCode CONST_WITH_TYPE_PARAMETERS = new CompileTimeErrorCode('CONST_WITH_TYPE_PARAMETERS', 25, "The constant creation cannot use a type parameter");
+
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T.id</i> is not the name of a constant
    * constructor declared by the type <i>T</i>.
+   * @param typeName the name of the type
+   * @param constructorName the name of the requested constant constructor
    */
-  static final CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR = new CompileTimeErrorCode('CONST_WITH_UNDEFINED_CONSTRUCTOR', 20, "");
+  static final CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR = new CompileTimeErrorCode('CONST_WITH_UNDEFINED_CONSTRUCTOR', 26, "The class '%s' does not have a constant constructor '%s'");
+
+  /**
+   * 12.11.2 Const: It is a compile-time error if <i>T.id</i> is not the name of a constant
+   * constructor declared by the type <i>T</i>.
+   * @param typeName the name of the type
+   */
+  static final CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = new CompileTimeErrorCode('CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 27, "The class '%s' does not have a default constant constructor");
+
   /**
    * 15.3.1 Typedef: It is a compile-time error if any default values are specified in the signature
    * of a function type alias.
    */
-  static final CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS = new CompileTimeErrorCode('DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS', 21, "Default values aren't allowed in typedefs");
+  static final CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS = new CompileTimeErrorCode('DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS', 28, "Default values aren't allowed in typedefs");
+
+  /**
+   * 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
+   * declared in the same scope.
+   */
+  static final CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_DEFAULT = new CompileTimeErrorCode('DUPLICATE_CONSTRUCTOR_DEFAULT', 29, "The default constructor is already defined");
+
   /**
    * 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
    * declared in the same scope.
    * @param duplicateName the name of the duplicate entity
    */
-  static final CompileTimeErrorCode DUPLICATE_DEFINITION = new CompileTimeErrorCode('DUPLICATE_DEFINITION', 22, "The name '%s' is already defined");
+  static final CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_NAME = new CompileTimeErrorCode('DUPLICATE_CONSTRUCTOR_NAME', 30, "The constructor with name '%s' is already defined");
+
+  /**
+   * 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
+   * declared in the same scope.
+   * @param duplicateName the name of the duplicate entity
+   */
+  static final CompileTimeErrorCode DUPLICATE_DEFINITION = new CompileTimeErrorCode('DUPLICATE_DEFINITION', 31, "The name '%s' is already defined");
+
   /**
    * 7 Classes: It is a compile-time error if a class declares two members of the same name.
    */
-  static final CompileTimeErrorCode DUPLICATE_MEMBER_NAME = new CompileTimeErrorCode('DUPLICATE_MEMBER_NAME', 23, "");
+  static final CompileTimeErrorCode DUPLICATE_MEMBER_NAME = new CompileTimeErrorCode('DUPLICATE_MEMBER_NAME', 32, "");
+
   /**
    * 7 Classes: It is a compile-time error if a class has an instance member and a static member
    * with the same name.
    */
-  static final CompileTimeErrorCode DUPLICATE_MEMBER_NAME_INSTANCE_STATIC = new CompileTimeErrorCode('DUPLICATE_MEMBER_NAME_INSTANCE_STATIC', 24, "");
+  static final CompileTimeErrorCode DUPLICATE_MEMBER_NAME_INSTANCE_STATIC = new CompileTimeErrorCode('DUPLICATE_MEMBER_NAME_INSTANCE_STATIC', 33, "");
+
   /**
    * 12.14.2 Binding Actuals to Formals: It is a compile-time error if <i>q<sub>i</sub> =
    * q<sub>j</sub></i> for any <i>i != j</i> \[where <i>q<sub>i</sub></i> is the label for a named
    * argument\].
    */
-  static final CompileTimeErrorCode DUPLICATE_NAMED_ARGUMENT = new CompileTimeErrorCode('DUPLICATE_NAMED_ARGUMENT', 25, "");
+  static final CompileTimeErrorCode DUPLICATE_NAMED_ARGUMENT = new CompileTimeErrorCode('DUPLICATE_NAMED_ARGUMENT', 34, "The argument for the named parameter '%s' was already specified");
+
+  /**
+   * SDK implementation libraries can be exported only by other SDK libraries.
+   * @param uri the uri pointing to a library
+   */
+  static final CompileTimeErrorCode EXPORT_INTERNAL_LIBRARY = new CompileTimeErrorCode('EXPORT_INTERNAL_LIBRARY', 35, "The library %s is internal and cannot be exported");
+
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
    * not a library declaration.
    * @param uri the uri pointing to a non-library declaration
    */
-  static final CompileTimeErrorCode EXPORT_OF_NON_LIBRARY = new CompileTimeErrorCode('EXPORT_OF_NON_LIBRARY', 26, "The exported library '%s' must not have a part-of directive");
+  static final CompileTimeErrorCode EXPORT_OF_NON_LIBRARY = new CompileTimeErrorCode('EXPORT_OF_NON_LIBRARY', 36, "The exported library '%s' must not have a part-of directive");
+
   /**
    * 7.9 Superclasses: It is a compile-time error if the extends clause of a class <i>C</i> includes
    * a type expression that does not denote a class available in the lexical scope of <i>C</i>.
    * @param typeName the name of the superclass that was not found
    */
-  static final CompileTimeErrorCode EXTENDS_NON_CLASS = new CompileTimeErrorCode('EXTENDS_NON_CLASS', 27, "Classes can only extend other classes");
+  static final CompileTimeErrorCode EXTENDS_NON_CLASS = new CompileTimeErrorCode('EXTENDS_NON_CLASS', 37, "Classes can only extend other classes");
+
   /**
    * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
    * <p>
@@ -531,7 +787,18 @@
    * @param typeName the name of the type that cannot be extended
    * @see #IMPLEMENTS_DISALLOWED_CLASS
    */
-  static final CompileTimeErrorCode EXTENDS_DISALLOWED_CLASS = new CompileTimeErrorCode('EXTENDS_DISALLOWED_CLASS', 28, "Classes cannot extend '%s'");
+  static final CompileTimeErrorCode EXTENDS_DISALLOWED_CLASS = new CompileTimeErrorCode('EXTENDS_DISALLOWED_CLASS', 38, "Classes cannot extend '%s'");
+
+  /**
+   * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m < h</i> or if <i>m > n</i>.
+   * <p>
+   * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
+   * uncaught exception being thrown.
+   * @param requiredCount the maximum number of positional arguments
+   * @param argumentCount the actual number of positional arguments given
+   */
+  static final CompileTimeErrorCode EXTRA_POSITIONAL_ARGUMENTS = new CompileTimeErrorCode('EXTRA_POSITIONAL_ARGUMENTS', 39, "%d positional arguments expected, but %d found");
+
   /**
    * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
    * <p>
@@ -548,95 +815,132 @@
    * @param typeName the name of the type that cannot be implemented
    * @see #EXTENDS_DISALLOWED_CLASS
    */
-  static final CompileTimeErrorCode IMPLEMENTS_DISALLOWED_CLASS = new CompileTimeErrorCode('IMPLEMENTS_DISALLOWED_CLASS', 29, "Classes cannot implement '%s'");
+  static final CompileTimeErrorCode IMPLEMENTS_DISALLOWED_CLASS = new CompileTimeErrorCode('IMPLEMENTS_DISALLOWED_CLASS', 40, "Classes cannot implement '%s'");
+
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile time
    * error if more than one initializer corresponding to a given instance variable appears in
    * <i>k</i>'s list.
    */
-  static final CompileTimeErrorCode FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS = new CompileTimeErrorCode('FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS', 30, "The field '%s' cannot be initialized twice in the same constructor");
+  static final CompileTimeErrorCode FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS = new CompileTimeErrorCode('FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS', 41, "The field '%s' cannot be initialized twice in the same constructor");
+
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile time
    * error if <i>k</i>'s initializer list contains an initializer for a final variable <i>f</i>
    * whose declaration includes an initialization expression.
    */
-  static final CompileTimeErrorCode FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION = new CompileTimeErrorCode('FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION', 31, "Values cannot be set in the constructor if they are final, and have already been set");
+  static final CompileTimeErrorCode FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION = new CompileTimeErrorCode('FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION', 42, "Values cannot be set in the constructor if they are final, and have already been set");
+
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile time
    * error if <i>k</i>'s initializer list contains an initializer for a variable that is initialized
    * by means of an initializing formal of <i>k</i>.
    */
-  static final CompileTimeErrorCode FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER = new CompileTimeErrorCode('FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER', 32, "Fields cannot be initialized in both the parameter list and the initializers");
-  /**
-   * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
-   * a function other than a non-redirecting generative constructor.
-   */
-  static final CompileTimeErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = new CompileTimeErrorCode('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 33, "Initializing formal fields can only be used in constructors");
+  static final CompileTimeErrorCode FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER = new CompileTimeErrorCode('FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER', 43, "Fields cannot be initialized in both the parameter list and the initializers");
+
   /**
    * 5 Variables: It is a compile-time error if a final instance variable that has been initialized
    * at its point of declaration is also initialized in a constructor.
    * @param name the name of the field in question
    */
-  static final CompileTimeErrorCode FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR = new CompileTimeErrorCode('FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR', 34, "'%s' is final and was given a value when it was declared, so it cannot be set to a new value");
+  static final CompileTimeErrorCode FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR = new CompileTimeErrorCode('FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR', 44, "'%s' is final and was given a value when it was declared, so it cannot be set to a new value");
+
   /**
    * 5 Variables: It is a compile-time error if a final instance variable that has is initialized by
    * means of an initializing formal of a constructor is also initialized elsewhere in the same
    * constructor.
    * @param name the name of the field in question
    */
-  static final CompileTimeErrorCode FINAL_INITIALIZED_MULTIPLE_TIMES = new CompileTimeErrorCode('FINAL_INITIALIZED_MULTIPLE_TIMES', 35, "'%s' is a final field and so can only be set once");
+  static final CompileTimeErrorCode FINAL_INITIALIZED_MULTIPLE_TIMES = new CompileTimeErrorCode('FINAL_INITIALIZED_MULTIPLE_TIMES', 45, "'%s' is a final field and so can only be set once");
+
+  /**
+   * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
+   * a function other than a non-redirecting generative constructor.
+   */
+  static final CompileTimeErrorCode FIELD_INITIALIZER_FACTORY_CONSTRUCTOR = new CompileTimeErrorCode('FIELD_INITIALIZER_FACTORY_CONSTRUCTOR', 46, "Initializing formal fields cannot be used in factory constructors");
+
+  /**
+   * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
+   * a function other than a non-redirecting generative constructor.
+   */
+  static final CompileTimeErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = new CompileTimeErrorCode('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 47, "Initializing formal fields can only be used in constructors");
+
+  /**
+   * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
+   * only action is to invoke another generative constructor.
+   * <p>
+   * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
+   * a function other than a non-redirecting generative constructor.
+   */
+  static final CompileTimeErrorCode FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR = new CompileTimeErrorCode('FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR', 48, "The redirecting constructor cannot have a field initializer");
+
   /**
    * 5 Variables: It is a compile-time error if a library, static or local variable <i>v</i> is
    * final and <i>v</i> is not initialized at its point of declaration.
    * @param name the name of the variable in question
    */
-  static final CompileTimeErrorCode FINAL_NOT_INITIALIZED = new CompileTimeErrorCode('FINAL_NOT_INITIALIZED', 36, "The final variable '%s' must be initialized");
+  static final CompileTimeErrorCode FINAL_NOT_INITIALIZED = new CompileTimeErrorCode('FINAL_NOT_INITIALIZED', 49, "The final variable '%s' must be initialized");
+
   /**
    * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
    * name.
+   * @param name the conflicting name of the getter and method
    */
-  static final CompileTimeErrorCode GETTER_AND_METHOD_WITH_SAME_NAME = new CompileTimeErrorCode('GETTER_AND_METHOD_WITH_SAME_NAME', 37, "");
+  static final CompileTimeErrorCode GETTER_AND_METHOD_WITH_SAME_NAME = new CompileTimeErrorCode('GETTER_AND_METHOD_WITH_SAME_NAME', 50, "'%s' cannot be used to name a getter, there is already a method with the same name");
+
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class includes
    * type dynamic.
    */
-  static final CompileTimeErrorCode IMPLEMENTS_DYNAMIC = new CompileTimeErrorCode('IMPLEMENTS_DYNAMIC', 38, "Classes cannot implement 'dynamic'");
+  static final CompileTimeErrorCode IMPLEMENTS_DYNAMIC = new CompileTimeErrorCode('IMPLEMENTS_DYNAMIC', 51, "Classes cannot implement 'dynamic'");
+
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class <i>C</i>
    * includes a type expression that does not denote a class available in the lexical scope of
    * <i>C</i>.
    * @param typeName the name of the interface that was not found
    */
-  static final CompileTimeErrorCode IMPLEMENTS_NON_CLASS = new CompileTimeErrorCode('IMPLEMENTS_NON_CLASS', 39, "Classes can only implement other classes");
+  static final CompileTimeErrorCode IMPLEMENTS_NON_CLASS = new CompileTimeErrorCode('IMPLEMENTS_NON_CLASS', 52, "Classes can only implement other classes");
+
   /**
    * 7.10 Superinterfaces: It is a compile-time error if a type <i>T</i> appears more than once in
    * the implements clause of a class.
+   * @param className the name of the class that is implemented more than once
+   */
+  static final CompileTimeErrorCode IMPLEMENTS_REPEATED = new CompileTimeErrorCode('IMPLEMENTS_REPEATED', 53, "'%s' can only be implemented once");
+
+  /**
+   * 7.6.1 Generative Constructors: Note that this is not in scope on the right hand side of an
+   * initializer.
+   * <p>
+   * 12.10 This: It is a compile-time error if this appears in a top-level function or variable
+   * initializer, in a factory constructor, or in a static method or variable initializer, or in the
+   * initializer of an instance variable.
    * @param name the name of the type in question
    */
-  static final CompileTimeErrorCode IMPLEMENTS_REPEATED = new CompileTimeErrorCode('IMPLEMENTS_REPEATED', 40, "'%s' can only be implemented once");
+  static final CompileTimeErrorCode IMPLICIT_THIS_REFERENCE_IN_INITIALIZER = new CompileTimeErrorCode('IMPLICIT_THIS_REFERENCE_IN_INITIALIZER', 54, "The 'this' expression cannot be implicitly used in initializers");
+
   /**
-   * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
-   * superinterface of itself.
-   * @param name the name of the type in question
+   * SDK implementation libraries can be imported only by other SDK libraries.
+   * @param uri the uri pointing to a library
    */
-  static final CompileTimeErrorCode IMPLEMENTS_SELF = new CompileTimeErrorCode('IMPLEMENTS_SELF', 41, "'%s' cannot implement itself");
-  /**
-   * 14.1 Imports: It is a compile-time error to import two different libraries with the same name.
-   */
-  static final CompileTimeErrorCode IMPORT_DUPLICATED_LIBRARY_NAME = new CompileTimeErrorCode('IMPORT_DUPLICATED_LIBRARY_NAME', 42, "");
+  static final CompileTimeErrorCode IMPORT_INTERNAL_LIBRARY = new CompileTimeErrorCode('IMPORT_INTERNAL_LIBRARY', 55, "The library %s is internal and cannot be imported");
+
   /**
    * 14.1 Imports: It is a compile-time error if the compilation unit found at the specified URI is
    * not a library declaration.
    * @param uri the uri pointing to a non-library declaration
    */
-  static final CompileTimeErrorCode IMPORT_OF_NON_LIBRARY = new CompileTimeErrorCode('IMPORT_OF_NON_LIBRARY', 43, "The imported library '%s' must not have a part-of directive");
+  static final CompileTimeErrorCode IMPORT_OF_NON_LIBRARY = new CompileTimeErrorCode('IMPORT_OF_NON_LIBRARY', 56, "The imported library '%s' must not have a part-of directive");
+
   /**
    * 13.9 Switch: It is a compile-time error if values of the expressions <i>e<sub>k</sub></i> are
    * not instances of the same class <i>C</i>, for all <i>1 &lt;= k &lt;= n</i>.
    * @param expressionSource the expression source code that is the unexpected type
    * @param expectedType the name of the expected type
    */
-  static final CompileTimeErrorCode INCONSISTENT_CASE_EXPRESSION_TYPES = new CompileTimeErrorCode('INCONSISTENT_CASE_EXPRESSION_TYPES', 44, "Case expressions must have the same types, '%s' is not a %s'");
+  static final CompileTimeErrorCode INCONSISTENT_CASE_EXPRESSION_TYPES = new CompileTimeErrorCode('INCONSISTENT_CASE_EXPRESSION_TYPES', 57, "Case expressions must have the same types, '%s' is not a %s'");
+
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
    * error if <i>k</i>'s initializer list contains an initializer for a variable that is not an
@@ -645,7 +949,8 @@
    * immediately enclosing class
    * @see #INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD
    */
-  static final CompileTimeErrorCode INITIALIZER_FOR_NON_EXISTANT_FIELD = new CompileTimeErrorCode('INITIALIZER_FOR_NON_EXISTANT_FIELD', 45, "'%s' is not a variable in the enclosing class");
+  static final CompileTimeErrorCode INITIALIZER_FOR_NON_EXISTANT_FIELD = new CompileTimeErrorCode('INITIALIZER_FOR_NON_EXISTANT_FIELD', 58, "'%s' is not a variable in the enclosing class");
+
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
    * error if <i>k</i>'s initializer list contains an initializer for a variable that is not an
@@ -654,7 +959,8 @@
    * enclosing class
    * @see #INITIALIZING_FORMAL_FOR_STATIC_FIELD
    */
-  static final CompileTimeErrorCode INITIALIZER_FOR_STATIC_FIELD = new CompileTimeErrorCode('INITIALIZER_FOR_STATIC_FIELD', 46, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
+  static final CompileTimeErrorCode INITIALIZER_FOR_STATIC_FIELD = new CompileTimeErrorCode('INITIALIZER_FOR_STATIC_FIELD', 59, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
+
   /**
    * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
    * compile-time error if <i>id</i> is not the name of an instance variable of the immediately
@@ -664,7 +970,8 @@
    * @see #INITIALIZING_FORMAL_FOR_STATIC_FIELD
    * @see #INITIALIZER_FOR_NON_EXISTANT_FIELD
    */
-  static final CompileTimeErrorCode INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD = new CompileTimeErrorCode('INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD', 47, "'%s' is not a variable in the enclosing class");
+  static final CompileTimeErrorCode INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD = new CompileTimeErrorCode('INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD', 60, "'%s' is not a variable in the enclosing class");
+
   /**
    * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
    * compile-time error if <i>id</i> is not the name of an instance variable of the immediately
@@ -673,69 +980,88 @@
    * enclosing class
    * @see #INITIALIZER_FOR_STATIC_FIELD
    */
-  static final CompileTimeErrorCode INITIALIZING_FORMAL_FOR_STATIC_FIELD = new CompileTimeErrorCode('INITIALIZING_FORMAL_FOR_STATIC_FIELD', 48, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
+  static final CompileTimeErrorCode INITIALIZING_FORMAL_FOR_STATIC_FIELD = new CompileTimeErrorCode('INITIALIZING_FORMAL_FOR_STATIC_FIELD', 61, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
+
   /**
    * TODO(brianwilkerson) Remove this when we have decided on how to report errors in compile-time
    * constants. Until then, this acts as a placeholder for more informative errors.
    */
-  static final CompileTimeErrorCode INVALID_CONSTANT = new CompileTimeErrorCode('INVALID_CONSTANT', 49, "");
+  static final CompileTimeErrorCode INVALID_CONSTANT = new CompileTimeErrorCode('INVALID_CONSTANT', 62, "");
+
   /**
    * 7.6 Constructors: It is a compile-time error if the name of a constructor is not a constructor
    * name.
    */
-  static final CompileTimeErrorCode INVALID_CONSTRUCTOR_NAME = new CompileTimeErrorCode('INVALID_CONSTRUCTOR_NAME', 50, "");
+  static final CompileTimeErrorCode INVALID_CONSTRUCTOR_NAME = new CompileTimeErrorCode('INVALID_CONSTRUCTOR_NAME', 63, "Invalid constructor name");
+
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>M</i> is not the name of the immediately
    * enclosing class.
    */
-  static final CompileTimeErrorCode INVALID_FACTORY_NAME_NOT_A_CLASS = new CompileTimeErrorCode('INVALID_FACTORY_NAME_NOT_A_CLASS', 51, "");
+  static final CompileTimeErrorCode INVALID_FACTORY_NAME_NOT_A_CLASS = new CompileTimeErrorCode('INVALID_FACTORY_NAME_NOT_A_CLASS', 64, "The name of the immediately enclosing class expected");
+
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
    * instance member <i>m2</i>, the signature of <i>m2</i> explicitly specifies a default value for
    * a formal parameter <i>p</i> and the signature of <i>m1</i> specifies a different default value
    * for <i>p</i>.
    */
-  static final CompileTimeErrorCode INVALID_OVERRIDE_DEFAULT_VALUE = new CompileTimeErrorCode('INVALID_OVERRIDE_DEFAULT_VALUE', 52, "");
+  static final CompileTimeErrorCode INVALID_OVERRIDE_DEFAULT_VALUE = new CompileTimeErrorCode('INVALID_OVERRIDE_DEFAULT_VALUE', 65, "");
+
   /**
-   * 7.1: It is a compile-time error if an instance method <i>m1</i> overrides an instance member
-   * <i>m2</i> and <i>m1</i> does not declare all the named parameters declared by <i>m2</i>.
+   * 7.1 Instance Methods: It is a compile-time error if an instance method <i>m1</i> overrides an
+   * instance member <i>m2</i> and <i>m1</i> does not declare all the named parameters declared by
+   * <i>m2</i>.
+   * @param paramCount the number of named parameters in the overridden member
+   * @param className the name of the class from the overridden method
    */
-  static final CompileTimeErrorCode INVALID_OVERRIDE_NAMED = new CompileTimeErrorCode('INVALID_OVERRIDE_NAMED', 53, "");
+  static final CompileTimeErrorCode INVALID_OVERRIDE_NAMED = new CompileTimeErrorCode('INVALID_OVERRIDE_NAMED', 66, "Missing the named parameter '%s' to match the overridden method from '%s'");
+
   /**
    * 7.1 Instance Methods: It is a compile-time error if an instance method <i>m1</i> overrides an
    * instance member <i>m2</i> and <i>m1</i> has fewer optional positional parameters than
    * <i>m2</i>.
+   * @param paramCount the number of positional parameters in the overridden member
+   * @param className the name of the class from the overridden method
    */
-  static final CompileTimeErrorCode INVALID_OVERRIDE_POSITIONAL = new CompileTimeErrorCode('INVALID_OVERRIDE_POSITIONAL', 54, "");
+  static final CompileTimeErrorCode INVALID_OVERRIDE_POSITIONAL = new CompileTimeErrorCode('INVALID_OVERRIDE_POSITIONAL', 67, "Must have at least %d optional parameters to match the overridden method from '%s'");
+
   /**
    * 7.1 Instance Methods: It is a compile-time error if an instance method <i>m1</i> overrides an
    * instance member <i>m2</i> and <i>m1</i> has a different number of required parameters than
    * <i>m2</i>.
+   * @param paramCount the number of required parameters in the overridden member
+   * @param className the name of the class from the overridden method
    */
-  static final CompileTimeErrorCode INVALID_OVERRIDE_REQUIRED = new CompileTimeErrorCode('INVALID_OVERRIDE_REQUIRED', 55, "");
+  static final CompileTimeErrorCode INVALID_OVERRIDE_REQUIRED = new CompileTimeErrorCode('INVALID_OVERRIDE_REQUIRED', 68, "Must have at exactly %d required parameters to match the overridden method from '%s'");
+
   /**
    * 12.10 This: It is a compile-time error if this appears in a top-level function or variable
    * initializer, in a factory constructor, or in a static method or variable initializer, or in the
    * initializer of an instance variable.
    */
-  static final CompileTimeErrorCode INVALID_REFERENCE_TO_THIS = new CompileTimeErrorCode('INVALID_REFERENCE_TO_THIS', 56, "");
+  static final CompileTimeErrorCode INVALID_REFERENCE_TO_THIS = new CompileTimeErrorCode('INVALID_REFERENCE_TO_THIS', 69, "Invalid reference to 'this' expression");
+
   /**
    * 12.7 Maps: It is a compile-time error if the first type argument to a map literal is not
    * String.
    */
-  static final CompileTimeErrorCode INVALID_TYPE_ARGUMENT_FOR_KEY = new CompileTimeErrorCode('INVALID_TYPE_ARGUMENT_FOR_KEY', 57, "The first type argument to a map literal must be 'String'");
+  static final CompileTimeErrorCode INVALID_TYPE_ARGUMENT_FOR_KEY = new CompileTimeErrorCode('INVALID_TYPE_ARGUMENT_FOR_KEY', 70, "The first type argument to a map literal must be 'String'");
+
   /**
    * 12.6 Lists: It is a compile time error if the type argument of a constant list literal includes
    * a type parameter.
    * @name the name of the type parameter
    */
-  static final CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_LIST = new CompileTimeErrorCode('INVALID_TYPE_ARGUMENT_IN_CONST_LIST', 58, "Constant list literals cannot include a type parameter as a type argument, such as '%s'");
+  static final CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_LIST = new CompileTimeErrorCode('INVALID_TYPE_ARGUMENT_IN_CONST_LIST', 71, "Constant list literals cannot include a type parameter as a type argument, such as '%s'");
+
   /**
    * 12.7 Maps: It is a compile time error if the type arguments of a constant map literal include a
    * type parameter.
    * @name the name of the type parameter
    */
-  static final CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_MAP = new CompileTimeErrorCode('INVALID_TYPE_ARGUMENT_IN_CONST_MAP', 59, "Constant map literals cannot include a type parameter as a type argument, such as '%s'");
+  static final CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_MAP = new CompileTimeErrorCode('INVALID_TYPE_ARGUMENT_IN_CONST_MAP', 72, "Constant map literals cannot include a type parameter as a type argument, such as '%s'");
+
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
    * not a library declaration.
@@ -745,9 +1071,11 @@
    * <p>
    * 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
+   * @param uri the URI that is invalid
+   * @see #URI_DOES_NOT_EXIST
    */
-  static final CompileTimeErrorCode INVALID_URI = new CompileTimeErrorCode('INVALID_URI', 60, "'%s' is not a valid uri");
+  static final CompileTimeErrorCode INVALID_URI = new CompileTimeErrorCode('INVALID_URI', 73, "Invalid URI syntax: '%s'");
+
   /**
    * 13.13 Break: It is a compile-time error if no such statement <i>s<sub>E</sub></i> exists within
    * the innermost function in which <i>s<sub>b</sub></i> occurs.
@@ -756,7 +1084,8 @@
    * <i>s<sub>E</sub></i> exists within the innermost function in which <i>s<sub>c</sub></i> occurs.
    * @param labelName the name of the unresolvable label
    */
-  static final CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = new CompileTimeErrorCode('LABEL_IN_OUTER_SCOPE', 61, "Cannot reference label '%s' declared in an outer method");
+  static final CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = new CompileTimeErrorCode('LABEL_IN_OUTER_SCOPE', 74, "Cannot reference label '%s' declared in an outer method");
+
   /**
    * 13.13 Break: It is a compile-time error if no such statement <i>s<sub>E</sub></i> exists within
    * the innermost function in which <i>s<sub>b</sub></i> occurs.
@@ -765,47 +1094,64 @@
    * <i>s<sub>E</sub></i> exists within the innermost function in which <i>s<sub>c</sub></i> occurs.
    * @param labelName the name of the unresolvable label
    */
-  static final CompileTimeErrorCode LABEL_UNDEFINED = new CompileTimeErrorCode('LABEL_UNDEFINED', 62, "Cannot reference undefined label '%s'");
+  static final CompileTimeErrorCode LABEL_UNDEFINED = new CompileTimeErrorCode('LABEL_UNDEFINED', 75, "Cannot reference undefined label '%s'");
+
   /**
    * 7 Classes: It is a compile time error if a class <i>C</i> declares a member with the same name
    * as <i>C</i>.
    */
-  static final CompileTimeErrorCode MEMBER_WITH_CLASS_NAME = new CompileTimeErrorCode('MEMBER_WITH_CLASS_NAME', 63, "");
+  static final CompileTimeErrorCode MEMBER_WITH_CLASS_NAME = new CompileTimeErrorCode('MEMBER_WITH_CLASS_NAME', 76, "Class members cannot have the same name as the enclosing class");
+
+  /**
+   * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
+   * name.
+   * @param name the conflicting name of the getter and method
+   */
+  static 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");
+
   /**
    * 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', 64, "");
+  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");
+
   /**
    * 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', 65, "");
+  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");
+
   /**
    * 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.
-   * @param typeName the name of the mixin that was not found
    */
-  static final CompileTimeErrorCode MIXIN_OF_NON_CLASS = new CompileTimeErrorCode('MIXIN_OF_NON_CLASS', 66, "Classes can only mixin other classes");
-  /**
-   * 9.1 Mixin Application: If <i>M</i> is a class, it is a compile time error if a well formed
-   * mixin cannot be derived from <i>M</i>.
-   */
-  static final CompileTimeErrorCode MIXIN_OF_NON_MIXIN = new CompileTimeErrorCode('MIXIN_OF_NON_MIXIN', 67, "");
+  static final CompileTimeErrorCode MIXIN_OF_NON_CLASS = new CompileTimeErrorCode('MIXIN_OF_NON_CLASS', 80, "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', 68, "");
+  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'");
+
   /**
    * 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', 69, "");
+  static final CompileTimeErrorCode MIXIN_WITH_NON_CLASS_SUPERCLASS = new CompileTimeErrorCode('MIXIN_WITH_NON_CLASS_SUPERCLASS', 82, "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");
+
   /**
    * 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', 70, "");
+  static final CompileTimeErrorCode MULTIPLE_SUPER_INITIALIZERS = new CompileTimeErrorCode('MULTIPLE_SUPER_INITIALIZERS', 84, "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
    * parameters.
@@ -813,12 +1159,14 @@
    * @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', 71, "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', 85, "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', 72, "");
+  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");
+
   /**
    * 13.9 Switch: Given a switch statement of the form <i>switch (e) { label<sub>11</sub> &hellip;
    * label<sub>1j1</sub> case e<sub>1</sub>: s<sub>1</sub> &hellip; label<sub>n1</sub> &hellip;
@@ -828,122 +1176,190 @@
    * 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', 73, "Case expressions must be constant");
+  static final CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION = new CompileTimeErrorCode('NON_CONSTANT_CASE_EXPRESSION', 87, "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', 74, "Default values of an optional parameter must be constant");
+  static final CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE = new CompileTimeErrorCode('NON_CONSTANT_DEFAULT_VALUE', 88, "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', 75, "'const' lists must have all constant values");
+  static final CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT = new CompileTimeErrorCode('NON_CONSTANT_LIST_ELEMENT', 89, "'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', 76, "The keys in a map must be constant");
+  static final CompileTimeErrorCode NON_CONSTANT_MAP_KEY = new CompileTimeErrorCode('NON_CONSTANT_MAP_KEY', 90, "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', 77, "The values in a 'const' map must be constant");
+  static final CompileTimeErrorCode NON_CONSTANT_MAP_VALUE = new CompileTimeErrorCode('NON_CONSTANT_MAP_VALUE', 91, "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', 78, "");
+  static final CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER = new CompileTimeErrorCode('NON_CONSTANT_VALUE_IN_INITIALIZER', 92, "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>.
+   * <p>
+   * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
+   * uncaught exception being thrown.
+   * @param requiredCount the expected number of required arguments
+   * @param argumentCount the actual number of positional arguments given
+   */
+  static final CompileTimeErrorCode NOT_ENOUGH_REQUIRED_ARGUMENTS = new CompileTimeErrorCode('NOT_ENOUGH_REQUIRED_ARGUMENTS', 93, "%d required argument(s) expected, but %d found");
+
+  /**
+   * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
+   * and let <i>S</i> be the superclass of <i>C</i>. Let <i>k</i> be a generative constructor. It is
+   * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
+   * (respectively <i>S.id</i>)
+   */
+  static final CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR = new CompileTimeErrorCode('NON_GENERATIVE_CONSTRUCTOR', 94, "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', 79, "");
+  static final CompileTimeErrorCode OBJECT_CANNOT_EXTEND_ANOTHER_CLASS = new CompileTimeErrorCode('OBJECT_CANNOT_EXTEND_ANOTHER_CLASS', 95, "");
+
   /**
    * 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', 80, "Optional parameters are not allowed when defining an operator");
-  /**
-   * 8 Interfaces: It is a compile-time error if an interface member <i>m1</i> overrides an
-   * interface member <i>m2</i> and <i>m1</i> does not declare all the named parameters declared by
-   * <i>m2</i> in the same order.
-   */
-  static final CompileTimeErrorCode OVERRIDE_MISSING_NAMED_PARAMETERS = new CompileTimeErrorCode('OVERRIDE_MISSING_NAMED_PARAMETERS', 81, "");
-  /**
-   * 8 Interfaces: It is a compile-time error if an interface member <i>m1</i> overrides an
-   * interface member <i>m2</i> and <i>m1</i> has a different number of required parameters than
-   * <i>m2</i>.
-   */
-  static final CompileTimeErrorCode OVERRIDE_MISSING_REQUIRED_PARAMETERS = new CompileTimeErrorCode('OVERRIDE_MISSING_REQUIRED_PARAMETERS', 82, "");
+  static final CompileTimeErrorCode OPTIONAL_PARAMETER_IN_OPERATOR = new CompileTimeErrorCode('OPTIONAL_PARAMETER_IN_OPERATOR', 96, "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', 83, "The included part '%s' must have a part-of directive");
+  static final CompileTimeErrorCode PART_OF_NON_PART = new CompileTimeErrorCode('PART_OF_NON_PART', 97, "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', 84, "");
+  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");
+
   /**
    * 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', 85, "Named optional parameters cannot start with an underscore");
+  static final CompileTimeErrorCode PRIVATE_OPTIONAL_PARAMETER = new CompileTimeErrorCode('PRIVATE_OPTIONAL_PARAMETER', 99, "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', 86, "");
+  static final CompileTimeErrorCode RECURSIVE_COMPILE_TIME_CONSTANT = new CompileTimeErrorCode('RECURSIVE_COMPILE_TIME_CONSTANT', 100, "");
+
+  /**
+   * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
+   * only action is to invoke another generative constructor.
+   * <p>
+   * TODO(scheglov) review this later, there are no explicit "it is a compile-time error" in
+   * specification. But it was added to the co19 and there is same error for factories.
+   * <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");
+
   /**
    * 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', 87, "");
+  static final CompileTimeErrorCode RECURSIVE_FACTORY_REDIRECT = new CompileTimeErrorCode('RECURSIVE_FACTORY_REDIRECT', 102, "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', 88, "");
+  static final CompileTimeErrorCode RECURSIVE_FUNCTION_TYPE_ALIAS = new CompileTimeErrorCode('RECURSIVE_FUNCTION_TYPE_ALIAS', 103, "");
+
   /**
+   * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
+   * superinterface of itself.
+   * <p>
    * 8.1 Superinterfaces: It is a compile-time error if an interface is a superinterface of itself.
+   * <p>
+   * 7.9 Superclasses: It is a compile-time error if a class <i>C</i> is a superclass of itself.
+   * @param className the name of the class that implements itself recursively
+   * @param strImplementsPath a string representation of the implements loop
    */
-  static final CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = new CompileTimeErrorCode('RECURSIVE_INTERFACE_INHERITANCE', 89, "");
+  static final CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = new CompileTimeErrorCode('RECURSIVE_INTERFACE_INHERITANCE', 104, "'%s' cannot be a superinterface of itself: %s");
+
+  /**
+   * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
+   * superinterface of itself.
+   * <p>
+   * 8.1 Superinterfaces: It is a compile-time error if an interface is a superinterface of itself.
+   * <p>
+   * 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");
+
+  /**
+   * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
+   * superinterface of itself.
+   * <p>
+   * 8.1 Superinterfaces: It is a compile-time error if an interface is a superinterface of itself.
+   * <p>
+   * 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");
+
   /**
    * 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', 90, "");
+  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");
+
   /**
    * 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', 91, "");
+  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");
+
   /**
    * 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', 92, "");
+  static final CompileTimeErrorCode RESERVED_WORD_AS_IDENTIFIER = new CompileTimeErrorCode('RESERVED_WORD_AS_IDENTIFIER', 109, "");
+
   /**
    * 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', 93, "rethrow must be inside of a catch clause");
+  static final CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = new CompileTimeErrorCode('RETHROW_OUTSIDE_CATCH', 110, "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', 94, "Constructors cannot return a value");
+  static final CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = new CompileTimeErrorCode('RETURN_IN_GENERATIVE_CONSTRUCTOR', 111, "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', 95, "");
+  static final CompileTimeErrorCode STATIC_TOP_LEVEL_FUNCTION = new CompileTimeErrorCode('STATIC_TOP_LEVEL_FUNCTION', 112, "");
+
   /**
    * 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', 96, "");
+  static final CompileTimeErrorCode STATIC_TOP_LEVEL_VARIABLE = new CompileTimeErrorCode('STATIC_TOP_LEVEL_VARIABLE', 113, "");
+
   /**
    * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
    * <i>super.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip;
@@ -952,12 +1368,20 @@
    * 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', 97, "");
+  static final CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = new CompileTimeErrorCode('SUPER_IN_INVALID_CONTEXT', 114, "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");
+
   /**
    * 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', 98, "");
+  static final CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = new CompileTimeErrorCode('SUPER_INITIALIZER_IN_OBJECT', 116, "");
+
   /**
    * 12.11 Instance Creation: It is a compile-time error if a constructor of a non-generic type
    * invoked by a new expression or a constant object expression is passed any type arguments.
@@ -966,14 +1390,30 @@
    * <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', 99, "");
+  static final CompileTimeErrorCode TYPE_ARGUMENTS_FOR_NON_GENERIC_CLASS = new CompileTimeErrorCode('TYPE_ARGUMENTS_FOR_NON_GENERIC_CLASS', 117, "");
+
+  /**
+   * 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'");
+
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
    * and let <i>S</i> be the superclass of <i>C</i>. Let <i>k</i> be a generative constructor. It is
    * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
    */
-  static final CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = new CompileTimeErrorCode('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 100, "");
+  static final CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = new CompileTimeErrorCode('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 119, "The class '%s' does not have a generative constructor '%s'");
+
+  /**
+   * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
+   * and let <i>S</i> be the superclass of <i>C</i>. Let <i>k</i> be a generative constructor. It is
+   * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
+   * (respectively <i>S.id</i>)
+   */
+  static 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");
+
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. Each final instance
    * variable <i>f</i> declared in the immediately enclosing class must have an initializer in
@@ -985,7 +1425,33 @@
    * </ol>
    * or a compile-time error occurs.
    */
-  static final CompileTimeErrorCode UNINITIALIZED_FINAL_FIELD = new CompileTimeErrorCode('UNINITIALIZED_FINAL_FIELD', 101, "");
+  static final CompileTimeErrorCode UNINITIALIZED_FINAL_FIELD = new CompileTimeErrorCode('UNINITIALIZED_FINAL_FIELD', 121, "");
+
+  /**
+   * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
+   * must have a corresponding named parameter in the set {<i>p<sub>n+1</sub></i> ...
+   * <i>p<sub>n+k</sub></i>} or a static warning occurs.
+   * <p>
+   * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
+   * uncaught exception being thrown.
+   * @param name the name of the requested named parameter
+   */
+  static final CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = new CompileTimeErrorCode('UNDEFINED_NAMED_PARAMETER', 122, "The named parameter '%s' is not defined");
+
+  /**
+   * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
+   * not a library declaration.
+   * <p>
+   * 14.1 Imports: It is a compile-time error if the compilation unit found at the specified URI is
+   * not a library declaration.
+   * <p>
+   * 14.3 Parts: It is a compile time error if the contents of the URI are not a valid part
+   * declaration.
+   * @param uri the URI pointing to a non-existent file
+   * @see #INVALID_URI
+   */
+  static final CompileTimeErrorCode URI_DOES_NOT_EXIST = new CompileTimeErrorCode('URI_DOES_NOT_EXIST', 123, "Target of URI does not exist: '%s'");
+
   /**
    * 14.1 Imports: It is a compile-time error if <i>x</i> is not a compile-time constant, or if
    * <i>x</i> involves string interpolation.
@@ -996,21 +1462,34 @@
    * 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', 102, "URIs cannot use string interpolation");
+  static final CompileTimeErrorCode URI_WITH_INTERPOLATION = new CompileTimeErrorCode('URI_WITH_INTERPOLATION', 124, "URIs cannot use string interpolation");
+
   /**
    * 7.1.1 Operators: It is a compile-time error if the arity of the user-declared operator \[\]= is
    * not 2. It is a compile time error if the arity of a user-declared operator with one of the
    * names: &lt;, &gt;, &lt;=, &gt;=, ==, +, /, ~/, *, %, |, ^, &, &lt;&lt;, &gt;&gt;, \[\] is not 1.
    * It is a compile time error if the arity of the user-declared operator - is not 0 or 1. It is a
    * compile time error if the arity of the user-declared operator ~ is not 0.
+   * @param operatorName the name of the declared operator
+   * @param expectedNumberOfParameters the number of parameters expected
+   * @param actualNumberOfParameters the number of parameters found in the operator declaration
    */
-  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = new CompileTimeErrorCode('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 103, "");
+  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");
+
+  /**
+   * 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");
+
   /**
    * 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', 104, "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', 127, "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
    * <i>n</i> type parameters invoked by a new expression or a constant object expression is passed
@@ -1020,29 +1499,34 @@
    * <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', 105, "");
-  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_WITH_NON_FINAL_FIELD, CONST_FORMAL_PARAMETER, CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 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, DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS, DUPLICATE_DEFINITION, DUPLICATE_MEMBER_NAME, DUPLICATE_MEMBER_NAME_INSTANCE_STATIC, DUPLICATE_NAMED_ARGUMENT, EXPORT_OF_NON_LIBRARY, EXTENDS_NON_CLASS, EXTENDS_DISALLOWED_CLASS, IMPLEMENTS_DISALLOWED_CLASS, FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS, FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION, FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER, FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR, FINAL_INITIALIZED_MULTIPLE_TIMES, FINAL_NOT_INITIALIZED, GETTER_AND_METHOD_WITH_SAME_NAME, IMPLEMENTS_DYNAMIC, IMPLEMENTS_NON_CLASS, IMPLEMENTS_REPEATED, IMPLEMENTS_SELF, IMPORT_DUPLICATED_LIBRARY_NAME, 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, MIXIN_DECLARES_CONSTRUCTOR, MIXIN_INHERITS_FROM_NOT_OBJECT, MIXIN_OF_NON_CLASS, MIXIN_OF_NON_MIXIN, MIXIN_REFERENCES_SUPER, MIXIN_WITH_NON_CLASS_SUPERCLASS, 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, OBJECT_CANNOT_EXTEND_ANOTHER_CLASS, OPTIONAL_PARAMETER_IN_OPERATOR, OVERRIDE_MISSING_NAMED_PARAMETERS, OVERRIDE_MISSING_REQUIRED_PARAMETERS, PART_OF_NON_PART, PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER, PRIVATE_OPTIONAL_PARAMETER, RECURSIVE_COMPILE_TIME_CONSTANT, RECURSIVE_FACTORY_REDIRECT, RECURSIVE_FUNCTION_TYPE_ALIAS, RECURSIVE_INTERFACE_INHERITANCE, 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_INITIALIZER_IN_OBJECT, TYPE_ARGUMENTS_FOR_NON_GENERIC_CLASS, UNDEFINED_CONSTRUCTOR_IN_INITIALIZER, UNINITIALIZED_FINAL_FIELD, URI_WITH_INTERPOLATION, WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR, WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER, WRONG_NUMBER_OF_TYPE_ARGUMENTS];
-  final String __name;
-  final int __ordinal;
-  int get ordinal => __ordinal;
+  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];
+
+  /// 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
    */
-  CompileTimeErrorCode(this.__name, this.__ordinal, String message) {
+  CompileTimeErrorCode(this.name, this.ordinal, String message) {
     this._message = message;
   }
   ErrorSeverity get errorSeverity => ErrorType.COMPILE_TIME_ERROR.severity;
   String get message => _message;
   ErrorType get type => ErrorType.COMPILE_TIME_ERROR;
-  bool needsRecompilation() => true;
-  int compareTo(CompileTimeErrorCode other) => __ordinal - other.__ordinal;
-  String toString() => __name;
+  int compareTo(CompileTimeErrorCode 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
@@ -1051,6 +1535,22 @@
  * @coverage dart.engine.error
  */
 class StaticWarningCode implements Comparable<StaticWarningCode>, ErrorCode {
+
+  /**
+   * 14.1 Imports: If a name <i>N</i> is referenced by a library <i>L</i> and <i>N</i> is introduced
+   * into the top level scope <i>L</i> by more than one import then:
+   * <ol>
+   * <li>It is a static warning if <i>N</i> is used as a type annotation.
+   * <li>In checked mode, it is a dynamic error if <i>N</i> is used as a type annotation and
+   * referenced during a subtype test.
+   * <li>Otherwise, it is a compile-time error.
+   * </ol>
+   * @param ambiguousTypeName the name of the ambiguous type
+   * @param firstLibraryName the name of the first library that the type is found
+   * @param secondLibraryName the name of the second library that the type is found
+   */
+  static final StaticWarningCode AMBIGUOUS_IMPORT = new StaticWarningCode('AMBIGUOUS_IMPORT', 0, "The type '%s' is defined in the libraries '%s' and '%s'");
+
   /**
    * 12.11.1 New: It is a static warning if the static type of <i>a<sub>i</sub>, 1 &lt;= i &lt;= n+
    * k</i> may not be assigned to the type of the corresponding formal parameter of the constructor
@@ -1072,23 +1572,27 @@
    * <i>T<sub>m+j</sub></i> may not be assigned to <i>S<sub>r</sub></i>, where <i>r = q<sub>j</sub>,
    * 1 &lt;= j &lt;= l</i>.
    */
-  static final StaticWarningCode ARGUMENT_TYPE_NOT_ASSIGNABLE = new StaticWarningCode('ARGUMENT_TYPE_NOT_ASSIGNABLE', 0, "");
+  static final StaticWarningCode ARGUMENT_TYPE_NOT_ASSIGNABLE = new StaticWarningCode('ARGUMENT_TYPE_NOT_ASSIGNABLE', 1, "The argument type '%s' cannot be assigned to the parameter type '%s'");
+
   /**
    * 5 Variables: Attempting to assign to a final variable elsewhere will cause a NoSuchMethodError
    * to be thrown, because no setter is defined for it. The assignment will also give rise to a
    * static warning for the same reason.
    */
-  static final StaticWarningCode ASSIGNMENT_TO_FINAL = new StaticWarningCode('ASSIGNMENT_TO_FINAL', 1, "");
+  static final StaticWarningCode ASSIGNMENT_TO_FINAL = new StaticWarningCode('ASSIGNMENT_TO_FINAL', 2, "Final variables cannot be assigned a value");
+
   /**
    * 13.9 Switch: It is a static warning if the last statement of the statement sequence
    * <i>s<sub>k</sub></i> is not a break, continue, return or throw statement.
    */
-  static final StaticWarningCode CASE_BLOCK_NOT_TERMINATED = new StaticWarningCode('CASE_BLOCK_NOT_TERMINATED', 2, "");
+  static final StaticWarningCode CASE_BLOCK_NOT_TERMINATED = new StaticWarningCode('CASE_BLOCK_NOT_TERMINATED', 3, "The last statement of the 'case' should be 'break', 'continue', 'return' or 'throw'");
+
   /**
    * 12.32 Type Cast: It is a static warning if <i>T</i> does not denote a type available in the
    * current lexical scope.
    */
-  static final StaticWarningCode CAST_TO_NON_TYPE = new StaticWarningCode('CAST_TO_NON_TYPE', 3, "");
+  static final StaticWarningCode CAST_TO_NON_TYPE = new StaticWarningCode('CAST_TO_NON_TYPE', 4, "");
+
   /**
    * 16.1.2 Comments: A token of the form <i>\[new c\](uri)</i> will be replaced by a link in the
    * formatted output. The link will point at the constructor named <i>c</i> in <i>L</i>. The title
@@ -1096,128 +1600,273 @@
    * <i>L</i>, or if <i>c</i> is not the name of a constructor of a class declared in the exported
    * namespace of <i>L</i>.
    */
-  static final StaticWarningCode COMMENT_REFERENCE_CONSTRUCTOR_NOT_VISIBLE = new StaticWarningCode('COMMENT_REFERENCE_CONSTRUCTOR_NOT_VISIBLE', 4, "");
+  static final StaticWarningCode COMMENT_REFERENCE_CONSTRUCTOR_NOT_VISIBLE = new StaticWarningCode('COMMENT_REFERENCE_CONSTRUCTOR_NOT_VISIBLE', 5, "");
+
   /**
    * 16.1.2 Comments: A token of the form <i>\[id\](uri)</i> will be replaced by a link in the
    * formatted output. The link will point at the declaration named <i>id</i> in <i>L</i>. The title
    * of the link will be <i>id</i>. It is a static warning if uri is not the URI of a dart library
    * <i>L</i>, or if <i>id</i> is not a name declared in the exported namespace of <i>L</i>.
    */
-  static final StaticWarningCode COMMENT_REFERENCE_IDENTIFIER_NOT_VISIBLE = new StaticWarningCode('COMMENT_REFERENCE_IDENTIFIER_NOT_VISIBLE', 5, "");
+  static final StaticWarningCode COMMENT_REFERENCE_IDENTIFIER_NOT_VISIBLE = new StaticWarningCode('COMMENT_REFERENCE_IDENTIFIER_NOT_VISIBLE', 6, "");
+
   /**
    * 16.1.2 Comments: It is a static warning if <i>c</i> does not denote a constructor that
    * available in the scope of the documentation comment.
    */
-  static final StaticWarningCode COMMENT_REFERENCE_UNDECLARED_CONSTRUCTOR = new StaticWarningCode('COMMENT_REFERENCE_UNDECLARED_CONSTRUCTOR', 6, "");
+  static final StaticWarningCode COMMENT_REFERENCE_UNDECLARED_CONSTRUCTOR = new StaticWarningCode('COMMENT_REFERENCE_UNDECLARED_CONSTRUCTOR', 7, "");
+
   /**
    * 16.1.2 Comments: It is a static warning if <i>id</i> does not denote a declaration that
    * available in the scope of the documentation comment.
    */
-  static final StaticWarningCode COMMENT_REFERENCE_UNDECLARED_IDENTIFIER = new StaticWarningCode('COMMENT_REFERENCE_UNDECLARED_IDENTIFIER', 7, "");
+  static final StaticWarningCode COMMENT_REFERENCE_UNDECLARED_IDENTIFIER = new StaticWarningCode('COMMENT_REFERENCE_UNDECLARED_IDENTIFIER', 8, "");
+
   /**
    * 16.1.2 Comments: A token of the form <i>\[id\](uri)</i> will be replaced by a link in the
    * formatted output. The link will point at the declaration named <i>id</i> in <i>L</i>. The title
    * of the link will be <i>id</i>. It is a static warning if uri is not the URI of a dart library
    * <i>L</i>, or if <i>id</i> is not a name declared in the exported namespace of <i>L</i>.
    */
-  static final StaticWarningCode COMMENT_REFERENCE_URI_NOT_LIBRARY = new StaticWarningCode('COMMENT_REFERENCE_URI_NOT_LIBRARY', 8, "");
+  static final StaticWarningCode COMMENT_REFERENCE_URI_NOT_LIBRARY = new StaticWarningCode('COMMENT_REFERENCE_URI_NOT_LIBRARY', 9, "");
+
   /**
    * 7.4 Abstract Instance Members: It is a static warning if an abstract member is declared or
    * inherited in a concrete class.
    */
-  static final StaticWarningCode CONCRETE_CLASS_WITH_ABSTRACT_MEMBER = new StaticWarningCode('CONCRETE_CLASS_WITH_ABSTRACT_MEMBER', 9, "'%s' must have a method body because '%s' is not abstract");
+  static final StaticWarningCode CONCRETE_CLASS_WITH_ABSTRACT_MEMBER = new StaticWarningCode('CONCRETE_CLASS_WITH_ABSTRACT_MEMBER', 10, "'%s' must have a method body because '%s' is not abstract");
+
   /**
    * 7.2 Getters: It is a static warning if a class <i>C</i> declares an instance getter named
    * <i>v</i> and an accessible static member named <i>v</i> or <i>v=</i> is declared in a
    * superclass of <i>C</i>.
+   * @param superName the name of the super class declaring a static member
    */
-  static final StaticWarningCode CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER = new StaticWarningCode('CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER', 10, "");
+  static final StaticWarningCode CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER = new StaticWarningCode('CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER', 11, "Superclass '%s' declares static member with the same name");
+
   /**
    * 7.3 Setters: It is a static warning if a class <i>C</i> declares an instance setter named
    * <i>v=</i> and an accessible static member named <i>v=</i> or <i>v</i> is declared in a
    * superclass of <i>C</i>.
+   * @param superName the name of the super class declaring a static member
    */
-  static final StaticWarningCode CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER = new StaticWarningCode('CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER', 11, "");
+  static final StaticWarningCode CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER = new StaticWarningCode('CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER', 12, "Superclass '%s' declares static member with the same name");
+
   /**
    * 7.2 Getters: It is a static warning if a class declares a static getter named <i>v</i> and also
    * has a non-static setter named <i>v=</i>.
    */
-  static final StaticWarningCode CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER = new StaticWarningCode('CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER', 12, "");
+  static final StaticWarningCode CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER = new StaticWarningCode('CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER', 13, "Class '%s' declares non-static setter with the same name");
+
   /**
    * 7.3 Setters: It is a static warning if a class declares a static setter named <i>v=</i> and
    * also has a non-static member named <i>v</i>.
    */
-  static final StaticWarningCode CONFLICTING_STATIC_SETTER_AND_INSTANCE_GETTER = new StaticWarningCode('CONFLICTING_STATIC_SETTER_AND_INSTANCE_GETTER', 13, "");
+  static final StaticWarningCode CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER = new StaticWarningCode('CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER', 14, "Class '%s' declares non-static member with the same name");
+
   /**
    * 12.11.2 Const: Given an instance creation expression of the form <i>const q(a<sub>1</sub>,
    * &hellip; a<sub>n</sub>)</i> it is a static warning if <i>q</i> is the constructor of an
    * abstract class but <i>q</i> is not a factory constructor.
    */
-  static final StaticWarningCode CONST_WITH_ABSTRACT_CLASS = new StaticWarningCode('CONST_WITH_ABSTRACT_CLASS', 14, "Abstract classes cannot be created with a 'const' expression");
+  static final StaticWarningCode CONST_WITH_ABSTRACT_CLASS = new StaticWarningCode('CONST_WITH_ABSTRACT_CLASS', 15, "Abstract classes cannot be created with a 'const' expression");
+
   /**
    * 12.7 Maps: It is a static warning if the values of any two keys in a map literal are equal.
    */
-  static final StaticWarningCode EQUAL_KEYS_IN_MAP = new StaticWarningCode('EQUAL_KEYS_IN_MAP', 15, "Keys in a map cannot be equal");
+  static final StaticWarningCode EQUAL_KEYS_IN_MAP = new StaticWarningCode('EQUAL_KEYS_IN_MAP', 16, "Keys in a map cannot be equal");
+
+  /**
+   * 14.2 Exports: It is a static warning to export two different libraries with the same name.
+   * @param uri1 the uri pointing to a first library
+   * @param uri2 the uri pointing to a second library
+   * @param name the shared name of the exported libraries
+   */
+  static final StaticWarningCode EXPORT_DUPLICATED_LIBRARY_NAME = new StaticWarningCode('EXPORT_DUPLICATED_LIBRARY_NAME', 17, "The exported libraries '%s' and '%s' should not have the same name '%s'");
+
+  /**
+   * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m < h</i> or if <i>m > n</i>.
+   * @param requiredCount the maximum number of positional arguments
+   * @param argumentCount the actual number of positional arguments given
+   */
+  static final StaticWarningCode EXTRA_POSITIONAL_ARGUMENTS = new StaticWarningCode('EXTRA_POSITIONAL_ARGUMENTS', 18, "%d positional arguments expected, but %d found");
+
+  /**
+   * 7.6.1 Generative Constructors: Execution of an initializer of the form <b>this</b>.<i>v</i> =
+   * <i>e</i> proceeds as follows: First, the expression <i>e</i> is evaluated to an object
+   * <i>o</i>. Then, the instance variable <i>v</i> of the object denoted by this is bound to
+   * <i>o</i>.
+   * <p>
+   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static type of
+   * <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of <i>p<sub>i</sub>, 1 &lt;= i &lt;=
+   * n+k</i> and let <i>S<sub>q</sub></i> be the type of the named parameter <i>q</i> of <i>f</i>.
+   * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
+   * j &lt;= m</i>.
+   * @param initializerType the name of the type of the initializer expression
+   * @param fieldType the name of the type of the field
+   */
+  static final StaticWarningCode FIELD_INITIALIZER_NOT_ASSIGNABLE = new StaticWarningCode('FIELD_INITIALIZER_NOT_ASSIGNABLE', 19, "The initializer type '%s' cannot be assigned to the field type '%s'");
+
   /**
    * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
    * static warning if the static type of <i>id</i> is not assignable to <i>T<sub>id</sub></i>.
    * @param parameterType the name of the type of the field formal parameter
    * @param fieldType the name of the type of the field
    */
-  static final StaticWarningCode FIELD_INITIALIZER_WITH_INVALID_TYPE = new StaticWarningCode('FIELD_INITIALIZER_WITH_INVALID_TYPE', 16, "The parameter type '%s' is incompatable with the field type '%s'");
+  static final StaticWarningCode FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE = new StaticWarningCode('FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE', 20, "The parameter type '%s' is incompatable with the field type '%s'");
+
+  /**
+   * 14.1 Imports: It is a static warning to import two different libraries with the same name.
+   * @param uri1 the uri pointing to a first library
+   * @param uri2 the uri pointing to a second library
+   * @param name the shared name of the imported libraries
+   */
+  static final StaticWarningCode IMPORT_DUPLICATED_LIBRARY_NAME = new StaticWarningCode('IMPORT_DUPLICATED_LIBRARY_NAME', 21, "The imported libraries '%s' and '%s' should not have the same name '%s'");
+
+  /**
+   * 8.1.1 Inheritance and Overriding: However, if there are multiple members <i>m<sub>1</sub>,
+   * &hellip; m<sub>k</sub></i> with the same name <i>n</i> that would be inherited (because
+   * identically named members existed in several superinterfaces) then at most one member is
+   * inherited.
+   * <p>
+   * If some but not all of the <i>m<sub>i</sub>, 1 &lt;= i &lt;= k</i>, are getters, or if some but
+   * not all of the <i>m<sub>i</sub></i> are setters, none of the <i>m<sub>i</sub></i> are
+   * inherited, and a static warning is issued.
+   */
+  static final StaticWarningCode INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD = new StaticWarningCode('INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD', 22, "'%s' is inherited as a getter and also a method");
+
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
    * n</i>.
    */
-  static final StaticWarningCode INCORRECT_NUMBER_OF_ARGUMENTS = new StaticWarningCode('INCORRECT_NUMBER_OF_ARGUMENTS', 17, "");
+  static final StaticWarningCode INCORRECT_NUMBER_OF_ARGUMENTS = new StaticWarningCode('INCORRECT_NUMBER_OF_ARGUMENTS', 23, "");
+
   /**
    * 7.1 Instance Methods: It is a static warning if a class <i>C</i> declares an instance method
    * named <i>n</i> and an accessible static member named <i>n</i> is declared in a superclass of
    * <i>C</i>.
+   * @param memberName the name of the member with the name conflict
+   * @param superclassName the name of the enclosing class that has the static member
    */
-  static final StaticWarningCode INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC = new StaticWarningCode('INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC', 18, "");
+  static final StaticWarningCode INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC = new StaticWarningCode('INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC', 24, "'%s' collides with a static member in the superclass '%s'");
+
   /**
    * 7.6.2 Factories: It is a static warning if <i>M.id</i> is not a constructor name.
    */
-  static final StaticWarningCode INVALID_FACTORY_NAME = new StaticWarningCode('INVALID_FACTORY_NAME', 19, "");
+  static final StaticWarningCode INVALID_FACTORY_NAME = new StaticWarningCode('INVALID_FACTORY_NAME', 25, "");
+
   /**
    * 7.2 Getters: It is a static warning if a getter <i>m1</i> overrides a getter <i>m2</i> and the
    * type of <i>m1</i> is not a subtype of the type of <i>m2</i>.
+   * @param actualReturnTypeName the name of the expected return type
+   * @param expectedReturnType the name of the actual return type, not assignable to the
+   * actualReturnTypeName
+   * @param className the name of the class where the overridden getter is declared
+   * @see #INVALID_METHOD_OVERRIDE_RETURN_TYPE
    */
-  static final StaticWarningCode INVALID_OVERRIDE_GETTER_TYPE = new StaticWarningCode('INVALID_OVERRIDE_GETTER_TYPE', 20, "");
+  static final StaticWarningCode INVALID_GETTER_OVERRIDE_RETURN_TYPE = new StaticWarningCode('INVALID_GETTER_OVERRIDE_RETURN_TYPE', 26, "The return type '%s' is not assignable to '%s' as required from getter it is overriding from '%s'");
+
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
    * instance method <i>m2</i> and the type of <i>m1</i> is not a subtype of the type of <i>m2</i>.
+   * @param actualParamTypeName the name of the expected parameter type
+   * @param expectedParamType the name of the actual parameter type, not assignable to the
+   * actualParamTypeName
+   * @param className the name of the class where the overridden method is declared
    */
-  static final StaticWarningCode INVALID_OVERRIDE_RETURN_TYPE = new StaticWarningCode('INVALID_OVERRIDE_RETURN_TYPE', 21, "");
+  static final StaticWarningCode INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE = new StaticWarningCode('INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE', 27, "The parameter type '%s' is not assignable to '%s' as required from method it is overriding from '%s'");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
+   * instance method <i>m2</i> and the type of <i>m1</i> is not a subtype of the type of <i>m2</i>.
+   * @param actualParamTypeName the name of the expected parameter type
+   * @param expectedParamType the name of the actual parameter type, not assignable to the
+   * actualParamTypeName
+   * @param className the name of the class where the overridden method is declared
+   * @see #INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE
+   */
+  static final StaticWarningCode INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE = new StaticWarningCode('INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE', 28, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
+   * instance method <i>m2</i> and the type of <i>m1</i> is not a subtype of the type of <i>m2</i>.
+   * @param actualParamTypeName the name of the expected parameter type
+   * @param expectedParamType the name of the actual parameter type, not assignable to the
+   * actualParamTypeName
+   * @param className the name of the class where the overridden method is declared
+   */
+  static final StaticWarningCode INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE = new StaticWarningCode('INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE', 29, "The parameter type '%s' is not assignable to '%s' as required from method it is overriding from '%s'");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
+   * instance method <i>m2</i> and the type of <i>m1</i> is not a subtype of the type of <i>m2</i>.
+   * @param actualReturnTypeName the name of the expected return type
+   * @param expectedReturnType the name of the actual return type, not assignable to the
+   * actualReturnTypeName
+   * @param className the name of the class where the overridden method is declared
+   * @see #INVALID_GETTER_OVERRIDE_RETURN_TYPE
+   */
+  static final StaticWarningCode INVALID_METHOD_OVERRIDE_RETURN_TYPE = new StaticWarningCode('INVALID_METHOD_OVERRIDE_RETURN_TYPE', 30, "The return type '%s' is not assignable to '%s' as required from method it is overriding from '%s'");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
+   * instance member <i>m2</i>, the signature of <i>m2</i> explicitly specifies a default value for
+   * a formal parameter <i>p</i> and the signature of <i>m1</i> specifies a different default value
+   * for <i>p</i>.
+   */
+  static final StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES = new StaticWarningCode('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES', 31, "");
+
   /**
    * 7.3 Setters: It is a static warning if a setter <i>m1</i> overrides a setter <i>m2</i> and the
    * type of <i>m1</i> is not a subtype of the type of <i>m2</i>.
+   * @param actualParamTypeName the name of the expected parameter type
+   * @param expectedParamType the name of the actual parameter type, not assignable to the
+   * actualParamTypeName
+   * @param className the name of the class where the overridden setter is declared
+   * @see #INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE
    */
-  static final StaticWarningCode INVALID_OVERRIDE_SETTER_RETURN_TYPE = new StaticWarningCode('INVALID_OVERRIDE_SETTER_RETURN_TYPE', 22, "");
+  static final StaticWarningCode INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE = new StaticWarningCode('INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE', 32, "The parameter type '%s' is not assignable to '%s' as required by the setter it is overriding from '%s'");
+
   /**
    * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
    * <i>super.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip;
    * x<sub>n+k</sub>: a<sub>n+k</sub>)</i>. If <i>S.m</i> exists, it is a static warning if the type
    * <i>F</i> of <i>S.m</i> may not be assigned to a function type.
    */
-  static final StaticWarningCode INVOCATION_OF_NON_FUNCTION = new StaticWarningCode('INVOCATION_OF_NON_FUNCTION', 23, "");
+  static final StaticWarningCode INVOCATION_OF_NON_FUNCTION = new StaticWarningCode('INVOCATION_OF_NON_FUNCTION', 33, "");
+
+  /**
+   * 15.1 Static Types: A type <i>T</i> is malformed iff: <li><i>T</i> has the form <i>id</i> or the
+   * form <i>prefix.id</i>, and in the enclosing lexical scope, the name <i>id</i> (respectively
+   * <i>prefix.id</i>) does not denote a type.</li> <li><i>T</i> denotes a type variable in the
+   * enclosing lexical scope, but occurs in the signature or body of a static member.</li> <li>
+   * <i>T</i> is a parameterized type of the form <i>G&lt;S<sub>1</sub>, .., S<sub>n</sub>&gt;</i>,
+   * and <i>G</i> is malformed.</li></ul>
+   * <p>
+   * Any use of a malformed type gives rise to a static warning.
+   */
+  static final StaticWarningCode MALFORMED_TYPE = new StaticWarningCode('MALFORMED_TYPE', 34, "");
+
   /**
    * 7.3 Setters: It is a static warning if a class has a setter named <i>v=</i> with argument type
    * <i>T</i> and a getter named <i>v</i> with return type <i>S</i>, and <i>T</i> may not be
    * assigned to <i>S</i>.
    */
-  static final StaticWarningCode MISMATCHED_GETTER_AND_SETTER_TYPES = new StaticWarningCode('MISMATCHED_GETTER_AND_SETTER_TYPES', 24, "");
+  static final StaticWarningCode MISMATCHED_GETTER_AND_SETTER_TYPES = new StaticWarningCode('MISMATCHED_GETTER_AND_SETTER_TYPES', 35, "The parameter type for setter '%s' is %s which is not assignable to its getter (of type %s)");
+
   /**
    * 12.11.1 New: It is a static warning if <i>q</i> is a constructor of an abstract class and
    * <i>q</i> is not a factory constructor.
    */
-  static final StaticWarningCode NEW_WITH_ABSTRACT_CLASS = new StaticWarningCode('NEW_WITH_ABSTRACT_CLASS', 25, "Abstract classes cannot be created with a 'new' expression");
+  static final StaticWarningCode NEW_WITH_ABSTRACT_CLASS = new StaticWarningCode('NEW_WITH_ABSTRACT_CLASS', 36, "Abstract classes cannot be created with a 'new' expression");
+
   /**
    * 12.11.1 New: It is a static warning if <i>T</i> is not a class accessible in the current scope,
    * optionally followed by type arguments.
+   * @param name the name of the non-type element
    */
-  static final StaticWarningCode NEW_WITH_NON_TYPE = new StaticWarningCode('NEW_WITH_NON_TYPE', 26, "");
+  static final StaticWarningCode NEW_WITH_NON_TYPE = new StaticWarningCode('NEW_WITH_NON_TYPE', 37, "The name '%s' is not a class");
+
   /**
    * 12.11.1 New: If <i>T</i> is a class or parameterized type accessible in the current scope then:
    * 1. If <i>e</i> is of the form <i>new T.id(a<sub>1</sub>, &hellip;, a<sub>n</sub>,
@@ -1227,75 +1876,169 @@
    * a<sub>n+1</sub>, &hellip; x<sub>n+k</sub>: a<sub>n+kM/sub>)</i> it is a static warning if the
    * type <i>T</i> does not declare a constructor with the same name as the declaration of <i>T</i>.
    */
-  static final StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR = new StaticWarningCode('NEW_WITH_UNDEFINED_CONSTRUCTOR', 27, "");
+  static final StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR = new StaticWarningCode('NEW_WITH_UNDEFINED_CONSTRUCTOR', 38, "The class '%s' does not have a constructor '%s'");
+
   /**
-   * 7.10 Superinterfaces: It is a static warning if the implicit interface of a non-abstract class
-   * <i>C</i> includes an instance member <i>m</i> and <i>C</i> does not declare or inherit a
-   * corresponding instance member <i>m</i>.
+   * 12.11.1 New: If <i>T</i> is a class or parameterized type accessible in the current scope then:
+   * 1. If <i>e</i> is of the form <i>new T.id(a<sub>1</sub>, &hellip;, a<sub>n</sub>,
+   * x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i> it is a
+   * static warning if <i>T.id</i> is not the name of a constructor declared by the type <i>T</i>.
+   * If <i>e</i> of the form <i>new T(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>:
+   * a<sub>n+1</sub>, &hellip; x<sub>n+k</sub>: a<sub>n+kM/sub>)</i> it is a static warning if the
+   * type <i>T</i> does not declare a constructor with the same name as the declaration of <i>T</i>.
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER', 28, "");
+  static final StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = new StaticWarningCode('NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 39, "The class '%s' does not have a default constructor");
+
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
    * abstract method.
+   * <p>
+   * 7.10 Superinterfaces: It is a static warning if the implicit interface of a non-abstract class
+   * <i>C</i> includes an instance member <i>m</i> and <i>C</i> does not declare or inherit a
+   * corresponding instance member <i>m</i>.
+   * @param enclosingClass enclosing class of the first missing member
+   * @param name first member name
+   * @param enclosingClass enclosing class of the second missing member
+   * @param name second member name
+   * @param enclosingClass enclosing class of the third missing member
+   * @param name third member name
+   * @param enclosingClass enclosing class of the fourth missing member
+   * @param name fourth member name
+   * @param additionalCount the number of additional missing members that aren't listed
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_METHOD = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_METHOD', 29, "");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS', 40, "Missing inherited members '%s.%s', '%s.%s', '%s.%s', '%s.%s' and %d more");
+
+  /**
+   * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
+   * abstract method.
+   * <p>
+   * 7.10 Superinterfaces: It is a static warning if the implicit interface of a non-abstract class
+   * <i>C</i> includes an instance member <i>m</i> and <i>C</i> does not declare or inherit a
+   * corresponding instance member <i>m</i>.
+   * @param enclosingClass enclosing class of the first missing member
+   * @param name first member name
+   * @param enclosingClass enclosing class of the second missing member
+   * @param name second member name
+   * @param enclosingClass enclosing class of the third missing member
+   * @param name third member name
+   * @param enclosingClass enclosing class of the fourth missing member
+   * @param name fourth member name
+   */
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR', 41, "Missing inherited members '%s.%s', '%s.%s', '%s.%s' and '%s.%s'");
+
+  /**
+   * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
+   * abstract method.
+   * <p>
+   * 7.10 Superinterfaces: It is a static warning if the implicit interface of a non-abstract class
+   * <i>C</i> includes an instance member <i>m</i> and <i>C</i> does not declare or inherit a
+   * corresponding instance member <i>m</i>.
+   * @param enclosingClass enclosing class of the missing member
+   * @param name member name
+   */
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE', 42, "Missing inherited member '%s.%s'");
+
+  /**
+   * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
+   * abstract method.
+   * <p>
+   * 7.10 Superinterfaces: It is a static warning if the implicit interface of a non-abstract class
+   * <i>C</i> includes an instance member <i>m</i> and <i>C</i> does not declare or inherit a
+   * corresponding instance member <i>m</i>.
+   * @param enclosingClass enclosing class of the first missing member
+   * @param name first member name
+   * @param enclosingClass enclosing class of the second missing member
+   * @param name second member name
+   * @param enclosingClass enclosing class of the third missing member
+   * @param name third member name
+   */
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE', 43, "Missing inherited members '%s.%s', '%s.%s' and '%s.%s'");
+
+  /**
+   * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
+   * abstract method.
+   * <p>
+   * 7.10 Superinterfaces: It is a static warning if the implicit interface of a non-abstract class
+   * <i>C</i> includes an instance member <i>m</i> and <i>C</i> does not declare or inherit a
+   * corresponding instance member <i>m</i>.
+   * @param enclosingClass enclosing class of the first missing member
+   * @param name first member name
+   * @param enclosingClass enclosing class of the second missing member
+   * @param name second member name
+   */
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO', 44, "Missing inherited members '%s.%s' and '%s.%s'");
+
   /**
    * 12.31 Type Test: It is a static warning if <i>T</i> does not denote a type available in the
    * current lexical scope.
    */
-  static final StaticWarningCode NON_TYPE = new StaticWarningCode('NON_TYPE', 30, "");
+  static final StaticWarningCode NON_TYPE = new StaticWarningCode('NON_TYPE', 45, "");
+
   /**
-   * 13.10 Try: An on-catch clause of the form <i>on T catch (p<sub>1</sub>, p<sub>2</sub>) s</i> or
+   * 13.11 Try: An on-catch clause of the form <i>on T catch (p<sub>1</sub>, p<sub>2</sub>) s</i> or
    * <i>on T s</i> matches an object <i>o</i> if the type of <i>o</i> is a subtype of <i>T</i>. It
    * is a static warning if <i>T</i> does not denote a type available in the lexical scope of the
    * catch clause.
+   * @param name the name of the non-type element
    */
-  static final StaticWarningCode NON_TYPE_IN_CATCH_CLAUSE = new StaticWarningCode('NON_TYPE_IN_CATCH_CLAUSE', 31, "");
+  static final StaticWarningCode NON_TYPE_IN_CATCH_CLAUSE = new StaticWarningCode('NON_TYPE_IN_CATCH_CLAUSE', 46, "The name '%s' is not a type and cannot be used in an on-catch clause");
+
   /**
    * 7.1.1 Operators: It is a static warning if the return type of the user-declared operator \[\]= is
    * explicitly declared and not void.
    */
-  static final StaticWarningCode NON_VOID_RETURN_FOR_OPERATOR = new StaticWarningCode('NON_VOID_RETURN_FOR_OPERATOR', 32, "");
+  static final StaticWarningCode NON_VOID_RETURN_FOR_OPERATOR = new StaticWarningCode('NON_VOID_RETURN_FOR_OPERATOR', 47, "The return type of the operator []= must be 'void'");
+
   /**
    * 7.3 Setters: It is a static warning if a setter declares a return type other than void.
    */
-  static final StaticWarningCode NON_VOID_RETURN_FOR_SETTER = new StaticWarningCode('NON_VOID_RETURN_FOR_SETTER', 33, "");
+  static final StaticWarningCode NON_VOID_RETURN_FOR_SETTER = new StaticWarningCode('NON_VOID_RETURN_FOR_SETTER', 48, "The return type of the setter must be 'void'");
+
   /**
-   * 8 Interfaces: It is a static warning if an interface member <i>m1</i> overrides an interface
-   * member <i>m2</i> and the type of <i>m1</i> is not a subtype of the type of <i>m2</i>.
+   * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m < h</i> or if <i>m > n</i>.
+   * @param requiredCount the expected number of required arguments
+   * @param argumentCount the actual number of positional arguments given
    */
-  static final StaticWarningCode OVERRIDE_NOT_SUBTYPE = new StaticWarningCode('OVERRIDE_NOT_SUBTYPE', 34, "");
-  /**
-   * 8 Interfaces: It is a static warning if an interface method <i>m1</i> overrides an interface
-   * method <i>m2</i>, the signature of <i>m2</i> explicitly specifies a default value for a formal
-   * parameter <i>p</i> and the signature of <i>m1</i> specifies a different default value for
-   * <i>p</i>.
-   */
-  static final StaticWarningCode OVERRIDE_WITH_DIFFERENT_DEFAULT = new StaticWarningCode('OVERRIDE_WITH_DIFFERENT_DEFAULT', 35, "");
+  static final StaticWarningCode NOT_ENOUGH_REQUIRED_ARGUMENTS = new StaticWarningCode('NOT_ENOUGH_REQUIRED_ARGUMENTS', 49, "%d required argument(s) expected, but %d found");
+
   /**
    * 14.3 Parts: It is a static warning if the referenced part declaration <i>p</i> names a library
    * other than the current library as the library to which <i>p</i> belongs.
    * @param expectedLibraryName the name of expected library name
    * @param actualLibraryName the non-matching actual library name from the "part of" declaration
    */
-  static final StaticWarningCode PART_OF_DIFFERENT_LIBRARY = new StaticWarningCode('PART_OF_DIFFERENT_LIBRARY', 36, "Expected this library to be part of '%s', not '%s'");
+  static final StaticWarningCode PART_OF_DIFFERENT_LIBRARY = new StaticWarningCode('PART_OF_DIFFERENT_LIBRARY', 50, "Expected this library to be part of '%s', not '%s'");
+
   /**
    * 7.6.2 Factories: It is a static warning if the function type of <i>k'</i> is not a subtype of
    * the type of <i>k</i>.
+   * @param redirectedName the name of the redirected constructor
+   * @param redirectingName the name of the redirecting constructor
    */
-  static final StaticWarningCode REDIRECT_TO_INVALID_RETURN_TYPE = new StaticWarningCode('REDIRECT_TO_INVALID_RETURN_TYPE', 37, "");
+  static final StaticWarningCode REDIRECT_TO_INVALID_FUNCTION_TYPE = new StaticWarningCode('REDIRECT_TO_INVALID_FUNCTION_TYPE', 51, "The redirected constructor '%s' has incompatible parameters with '%s'");
+
+  /**
+   * 7.6.2 Factories: It is a static warning if the function type of <i>k'</i> is not a subtype of
+   * the type of <i>k</i>.
+   * @param redirectedName the name of the redirected constructor return type
+   * @param redirectingName the name of the redirecting constructor return type
+   */
+  static final StaticWarningCode REDIRECT_TO_INVALID_RETURN_TYPE = new StaticWarningCode('REDIRECT_TO_INVALID_RETURN_TYPE', 52, "The return type '%s' of the redirected constructor is not a subclass of '%s'");
+
   /**
    * 7.6.2 Factories: It is a static warning if type does not denote a class accessible in the
    * current scope; if type does denote such a class <i>C</i> it is a static warning if the
    * referenced constructor (be it <i>type</i> or <i>type.id</i>) is not a constructor of <i>C</i>.
    */
-  static final StaticWarningCode REDIRECT_TO_MISSING_CONSTRUCTOR = new StaticWarningCode('REDIRECT_TO_MISSING_CONSTRUCTOR', 38, "");
+  static final StaticWarningCode REDIRECT_TO_MISSING_CONSTRUCTOR = new StaticWarningCode('REDIRECT_TO_MISSING_CONSTRUCTOR', 53, "");
+
   /**
    * 7.6.2 Factories: It is a static warning if type does not denote a class accessible in the
    * current scope; if type does denote such a class <i>C</i> it is a static warning if the
    * referenced constructor (be it <i>type</i> or <i>type.id</i>) is not a constructor of <i>C</i>.
    */
-  static final StaticWarningCode REDIRECT_TO_NON_CLASS = new StaticWarningCode('REDIRECT_TO_NON_CLASS', 39, "");
+  static final StaticWarningCode REDIRECT_TO_NON_CLASS = new StaticWarningCode('REDIRECT_TO_NON_CLASS', 54, "");
+
   /**
    * 13.11 Return: Let <i>f</i> be the function immediately enclosing a return statement of the form
    * <i>return;</i> It is a static warning if both of the following conditions hold:
@@ -1304,23 +2047,34 @@
    * <li>The return type of <i>f</i> may not be assigned to void.
    * </ol>
    */
-  static final StaticWarningCode RETURN_WITHOUT_VALUE = new StaticWarningCode('RETURN_WITHOUT_VALUE', 40, "Missing return value after 'return'");
+  static final StaticWarningCode RETURN_WITHOUT_VALUE = new StaticWarningCode('RETURN_WITHOUT_VALUE', 55, "Missing return value after 'return'");
+
+  /**
+   * 12.15.3 Static Invocation: It is a static warning if <i>C</i> does not declare a static method
+   * or getter <i>m</i>.
+   * @param memberName the name of the instance member
+   */
+  static final StaticWarningCode STATIC_ACCESS_TO_INSTANCE_MEMBER = new StaticWarningCode('STATIC_ACCESS_TO_INSTANCE_MEMBER', 56, "Instance member '%s' cannot be accessed using static access");
+
   /**
    * 13.9 Switch: It is a static warning if the type of <i>e</i> may not be assigned to the type of
    * <i>e<sub>k</sub></i>.
    */
-  static final StaticWarningCode SWITCH_EXPRESSION_NOT_ASSIGNABLE = new StaticWarningCode('SWITCH_EXPRESSION_NOT_ASSIGNABLE', 41, "");
+  static final StaticWarningCode SWITCH_EXPRESSION_NOT_ASSIGNABLE = new StaticWarningCode('SWITCH_EXPRESSION_NOT_ASSIGNABLE', 57, "Type '%s' of the switch expression is not assignable to the type '%s' of case expressions");
+
   /**
    * 12.15.3 Static Invocation: A static method invocation <i>i</i> has the form
    * <i>C.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip;
    * x<sub>n+k</sub>: a<sub>n+k</sub>)</i>. It is a static warning if <i>C</i> does not denote a
    * class in the current scope.
    */
-  static final StaticWarningCode UNDEFINED_CLASS = new StaticWarningCode('UNDEFINED_CLASS', 42, "Undefined class '%s'");
+  static final StaticWarningCode UNDEFINED_CLASS = new StaticWarningCode('UNDEFINED_CLASS', 58, "Undefined class '%s'");
+
   /**
    * Same as {@link #UNDEFINED_CLASS}, but to catch using "boolean" instead of "bool".
    */
-  static final StaticWarningCode UNDEFINED_CLASS_BOOLEAN = new StaticWarningCode('UNDEFINED_CLASS_BOOLEAN', 43, "Undefined class 'boolean'; did you mean 'bool'?");
+  static final StaticWarningCode UNDEFINED_CLASS_BOOLEAN = new StaticWarningCode('UNDEFINED_CLASS_BOOLEAN', 59, "Undefined class 'boolean'; did you mean 'bool'?");
+
   /**
    * 12.17 Getter Invocation: It is a static warning if there is no class <i>C</i> in the enclosing
    * lexical scope of <i>i</i>, or if <i>C</i> does not declare, implicitly or explicitly, a getter
@@ -1328,23 +2082,24 @@
    * @param getterName the name of the getter
    * @param enclosingType the name of the enclosing type where the getter is being looked for
    */
-  static final StaticWarningCode UNDEFINED_GETTER = new StaticWarningCode('UNDEFINED_GETTER', 44, "There is no such getter '%s' in '%s'");
+  static final StaticWarningCode UNDEFINED_GETTER = new StaticWarningCode('UNDEFINED_GETTER', 60, "There is no such getter '%s' in '%s'");
+
   /**
    * 12.30 Identifier Reference: It is as static warning if an identifier expression of the form
    * <i>id</i> occurs inside a top level or static function (be it function, method, getter, or
    * setter) or variable initializer and there is no declaration <i>d</i> with name <i>id</i> in the
    * lexical scope enclosing the expression.
    */
-  static final StaticWarningCode UNDEFINED_IDENTIFIER = new StaticWarningCode('UNDEFINED_IDENTIFIER', 45, "Undefined name '%s'");
+  static final StaticWarningCode UNDEFINED_IDENTIFIER = new StaticWarningCode('UNDEFINED_IDENTIFIER', 61, "Undefined name '%s'");
+
   /**
-   * 12.30 Identifier Reference: It is as static warning if an identifier expression of the form
-   * <i>id</i> occurs inside a top level or static function (be it function, method, getter, or
-   * setter) or variable initializer and there is no declaration <i>d</i> with name <i>id</i> in the
-   * lexical scope enclosing the expression.
-   * @param operator the name of the operator
-   * @param enclosingType the name of the enclosing type where the operator is being looked for
+   * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
+   * must have a corresponding named parameter in the set {<i>p<sub>n+1</sub></i> ...
+   * <i>p<sub>n+k</sub></i>} or a static warning occurs.
+   * @param name the name of the requested named parameter
    */
-  static final StaticWarningCode UNDEFINED_OPERATOR = new StaticWarningCode('UNDEFINED_OPERATOR', 46, "There is no such operator '%s' in '%s'");
+  static final StaticWarningCode UNDEFINED_NAMED_PARAMETER = new StaticWarningCode('UNDEFINED_NAMED_PARAMETER', 62, "The named parameter '%s' is not defined");
+
   /**
    * 12.18 Assignment: It is as static warning if an assignment of the form <i>v = e</i> occurs
    * inside a top level or static function (be it function, method, getter, or setter) or variable
@@ -1357,55 +2112,64 @@
    * @param setterName the name of the getter
    * @param enclosingType the name of the enclosing type where the setter is being looked for
    */
-  static final StaticWarningCode UNDEFINED_SETTER = new StaticWarningCode('UNDEFINED_SETTER', 47, "There is no such setter '%s' in '%s'");
+  static final StaticWarningCode UNDEFINED_SETTER = new StaticWarningCode('UNDEFINED_SETTER', 63, "There is no such setter '%s' in '%s'");
+
   /**
    * 12.15.3 Static Invocation: It is a static warning if <i>C</i> does not declare a static method
    * or getter <i>m</i>.
    * @param methodName the name of the method
    * @param enclosingType the name of the enclosing type where the method is being looked for
    */
-  static final StaticWarningCode UNDEFINED_STATIC_METHOD_OR_GETTER = new StaticWarningCode('UNDEFINED_STATIC_METHOD_OR_GETTER', 48, "There is no such static method '%s' in '%s'");
-  static final List<StaticWarningCode> values = [ARGUMENT_TYPE_NOT_ASSIGNABLE, ASSIGNMENT_TO_FINAL, CASE_BLOCK_NOT_TERMINATED, CAST_TO_NON_TYPE, COMMENT_REFERENCE_CONSTRUCTOR_NOT_VISIBLE, COMMENT_REFERENCE_IDENTIFIER_NOT_VISIBLE, COMMENT_REFERENCE_UNDECLARED_CONSTRUCTOR, COMMENT_REFERENCE_UNDECLARED_IDENTIFIER, COMMENT_REFERENCE_URI_NOT_LIBRARY, CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER, CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER, CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER, CONFLICTING_STATIC_SETTER_AND_INSTANCE_GETTER, CONST_WITH_ABSTRACT_CLASS, EQUAL_KEYS_IN_MAP, FIELD_INITIALIZER_WITH_INVALID_TYPE, INCORRECT_NUMBER_OF_ARGUMENTS, INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, INVALID_FACTORY_NAME, INVALID_OVERRIDE_GETTER_TYPE, INVALID_OVERRIDE_RETURN_TYPE, INVALID_OVERRIDE_SETTER_RETURN_TYPE, INVOCATION_OF_NON_FUNCTION, MISMATCHED_GETTER_AND_SETTER_TYPES, NEW_WITH_ABSTRACT_CLASS, NEW_WITH_NON_TYPE, NEW_WITH_UNDEFINED_CONSTRUCTOR, NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER, NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_METHOD, NON_TYPE, NON_TYPE_IN_CATCH_CLAUSE, NON_VOID_RETURN_FOR_OPERATOR, NON_VOID_RETURN_FOR_SETTER, OVERRIDE_NOT_SUBTYPE, OVERRIDE_WITH_DIFFERENT_DEFAULT, PART_OF_DIFFERENT_LIBRARY, REDIRECT_TO_INVALID_RETURN_TYPE, REDIRECT_TO_MISSING_CONSTRUCTOR, REDIRECT_TO_NON_CLASS, RETURN_WITHOUT_VALUE, SWITCH_EXPRESSION_NOT_ASSIGNABLE, UNDEFINED_CLASS, UNDEFINED_CLASS_BOOLEAN, UNDEFINED_GETTER, UNDEFINED_IDENTIFIER, UNDEFINED_OPERATOR, UNDEFINED_SETTER, UNDEFINED_STATIC_METHOD_OR_GETTER];
-  final String __name;
-  final int __ordinal;
-  int get ordinal => __ordinal;
+  static final StaticWarningCode UNDEFINED_STATIC_METHOD_OR_GETTER = new StaticWarningCode('UNDEFINED_STATIC_METHOD_OR_GETTER', 64, "There is no such static method '%s' in '%s'");
+  static final List<StaticWarningCode> values = [AMBIGUOUS_IMPORT, ARGUMENT_TYPE_NOT_ASSIGNABLE, ASSIGNMENT_TO_FINAL, CASE_BLOCK_NOT_TERMINATED, CAST_TO_NON_TYPE, COMMENT_REFERENCE_CONSTRUCTOR_NOT_VISIBLE, COMMENT_REFERENCE_IDENTIFIER_NOT_VISIBLE, COMMENT_REFERENCE_UNDECLARED_CONSTRUCTOR, COMMENT_REFERENCE_UNDECLARED_IDENTIFIER, COMMENT_REFERENCE_URI_NOT_LIBRARY, CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER, CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER, CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER, CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER, CONST_WITH_ABSTRACT_CLASS, EQUAL_KEYS_IN_MAP, EXPORT_DUPLICATED_LIBRARY_NAME, EXTRA_POSITIONAL_ARGUMENTS, FIELD_INITIALIZER_NOT_ASSIGNABLE, FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, IMPORT_DUPLICATED_LIBRARY_NAME, INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD, INCORRECT_NUMBER_OF_ARGUMENTS, INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, INVALID_FACTORY_NAME, INVALID_GETTER_OVERRIDE_RETURN_TYPE, INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE, INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE, INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE, INVALID_METHOD_OVERRIDE_RETURN_TYPE, INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES, INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE, INVOCATION_OF_NON_FUNCTION, MALFORMED_TYPE, MISMATCHED_GETTER_AND_SETTER_TYPES, NEW_WITH_ABSTRACT_CLASS, NEW_WITH_NON_TYPE, NEW_WITH_UNDEFINED_CONSTRUCTOR, NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS, NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR, NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE, NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE, NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO, NON_TYPE, NON_TYPE_IN_CATCH_CLAUSE, NON_VOID_RETURN_FOR_OPERATOR, NON_VOID_RETURN_FOR_SETTER, NOT_ENOUGH_REQUIRED_ARGUMENTS, PART_OF_DIFFERENT_LIBRARY, REDIRECT_TO_INVALID_FUNCTION_TYPE, REDIRECT_TO_INVALID_RETURN_TYPE, REDIRECT_TO_MISSING_CONSTRUCTOR, REDIRECT_TO_NON_CLASS, RETURN_WITHOUT_VALUE, STATIC_ACCESS_TO_INSTANCE_MEMBER, SWITCH_EXPRESSION_NOT_ASSIGNABLE, UNDEFINED_CLASS, UNDEFINED_CLASS_BOOLEAN, UNDEFINED_GETTER, UNDEFINED_IDENTIFIER, UNDEFINED_NAMED_PARAMETER, UNDEFINED_SETTER, UNDEFINED_STATIC_METHOD_OR_GETTER];
+
+  /// 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 type and message.
    * @param message the message template used to create the message to be displayed for the error
    */
-  StaticWarningCode(this.__name, this.__ordinal, String message) {
+  StaticWarningCode(this.name, this.ordinal, String message) {
     this._message = message;
   }
   ErrorSeverity get errorSeverity => ErrorType.STATIC_WARNING.severity;
   String get message => _message;
   ErrorType get type => ErrorType.STATIC_WARNING;
-  bool needsRecompilation() => true;
-  int compareTo(StaticWarningCode other) => __ordinal - other.__ordinal;
-  String toString() => __name;
+  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
  */
 abstract class AnalysisErrorListener {
+
   /**
    * An error listener that ignores errors that are reported to it.
    */
-  static AnalysisErrorListener _NULL_LISTENER = new AnalysisErrorListener_4();
+  static AnalysisErrorListener _NULL_LISTENER = new AnalysisErrorListener_5();
+
   /**
    * This method is invoked when an error has been found by the analysis engine.
    * @param error the error that was just found (not {@code null})
    */
   void onError(AnalysisError error);
 }
-class AnalysisErrorListener_4 implements AnalysisErrorListener {
+class AnalysisErrorListener_5 implements AnalysisErrorListener {
   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
@@ -1414,38 +2178,47 @@
  * @coverage dart.engine.error
  */
 class HtmlWarningCode implements Comparable<HtmlWarningCode>, ErrorCode {
+
   /**
    * An error code indicating that the value of the 'src' attribute of a Dart script tag is not a
    * valid URI.
+   * @param uri the URI that is invalid
    */
-  static final HtmlWarningCode INVALID_URI = new HtmlWarningCode('INVALID_URI', 0, "");
+  static final HtmlWarningCode INVALID_URI = new HtmlWarningCode('INVALID_URI', 0, "Invalid URI syntax: '%s'");
+
   /**
    * An error code indicating that the value of the 'src' attribute of a Dart script tag references
    * a file that does not exist.
+   * @param uri the URI pointing to a non-existent file
    */
-  static final HtmlWarningCode URI_DOES_NOT_EXIST = new HtmlWarningCode('URI_DOES_NOT_EXIST', 1, "");
+  static final HtmlWarningCode URI_DOES_NOT_EXIST = new HtmlWarningCode('URI_DOES_NOT_EXIST', 1, "Target of URI does not exist: '%s'");
   static final List<HtmlWarningCode> values = [INVALID_URI, URI_DOES_NOT_EXIST];
-  final String __name;
-  final int __ordinal;
-  int get ordinal => __ordinal;
+
+  /// 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 type and message.
    * @param message the message template used to create the message to be displayed for the error
    */
-  HtmlWarningCode(this.__name, this.__ordinal, String message) {
+  HtmlWarningCode(this.name, this.ordinal, String message) {
     this._message = message;
   }
   ErrorSeverity get errorSeverity => ErrorSeverity.WARNING;
   String get message => _message;
   ErrorType get type => ErrorType.STATIC_WARNING;
-  bool needsRecompilation() => false;
-  int compareTo(HtmlWarningCode other) => __ordinal - other.__ordinal;
-  String toString() => __name;
+  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
@@ -1454,17 +2227,21 @@
  * @coverage dart.engine.error
  */
 class StaticTypeWarningCode implements Comparable<StaticTypeWarningCode>, ErrorCode {
+
   /**
    * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>. It is a static type
    * warning if <i>T</i> does not have an accessible instance setter named <i>v=</i>.
    * @see #UNDEFINED_SETTER
    */
   static final StaticTypeWarningCode INACCESSIBLE_SETTER = new StaticTypeWarningCode('INACCESSIBLE_SETTER', 0, "");
+
   /**
    * 8.1.1 Inheritance and Overriding: However, if there are multiple members <i>m<sub>1</sub>,
    * &hellip; m<sub>k</sub></i> with the same name <i>n</i> that would be inherited (because
    * identically named members existed in several superinterfaces) then at most one member is
-   * inherited. If the static types <i>T<sub>1</sub>, &hellip;, T<sub>k</sub></i> of the members
+   * inherited.
+   * <p>
+   * If the static types <i>T<sub>1</sub>, &hellip;, T<sub>k</sub></i> of the members
    * <i>m<sub>1</sub>, &hellip;, m<sub>k</sub></i> are not identical, then there must be a member
    * <i>m<sub>x</sub></i> such that <i>T<sub>x</sub> &lt; T<sub>i</sub>, 1 &lt;= x &lt;= k</i> for
    * all <i>i, 1 &lt;= i &lt; k</i>, or a static type warning occurs. The member that is inherited
@@ -1478,7 +2255,8 @@
    * <li>Otherwise none of the members <i>m<sub>1</sub>, &hellip;, m<sub>k</sub></i> is inherited.
    * </ol>
    */
-  static final StaticTypeWarningCode INCONSISTENT_METHOD_INHERITANCE = new StaticTypeWarningCode('INCONSISTENT_METHOD_INHERITANCE', 1, "");
+  static final StaticTypeWarningCode INCONSISTENT_METHOD_INHERITANCE = new StaticTypeWarningCode('INCONSISTENT_METHOD_INHERITANCE', 1, "'%s' is inherited by at least two interfaces inconsistently");
+
   /**
    * 12.18 Assignment: It is a static type warning if the static type of <i>e</i> may not be
    * assigned to the static type of <i>v</i>. The static type of the expression <i>v = e</i> is the
@@ -1494,6 +2272,7 @@
    * @param lhsTypeName the name of the left hand side type
    */
   static final StaticTypeWarningCode INVALID_ASSIGNMENT = new StaticTypeWarningCode('INVALID_ASSIGNMENT', 2, "A value of type '%s' cannot be assigned to a variable of type '%s'");
+
   /**
    * 12.14.4 Function Expression Invocation: 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>: a<sub>n+1</sub>,
@@ -1516,6 +2295,7 @@
    * @param nonFunctionIdentifier the name of the identifier that is not a function type
    */
   static final StaticTypeWarningCode INVOCATION_OF_NON_FUNCTION = new StaticTypeWarningCode('INVOCATION_OF_NON_FUNCTION', 3, "'%s' is not a method");
+
   /**
    * 12.19 Conditional: It is a static type warning if the type of <i>e<sub>1</sub></i> may not be
    * assigned to bool.
@@ -1528,21 +2308,25 @@
    * 13.8 Do: It is a static type warning if the type of <i>e</i> cannot be assigned to bool.
    */
   static final StaticTypeWarningCode NON_BOOL_CONDITION = new StaticTypeWarningCode('NON_BOOL_CONDITION', 4, "Conditions must have a static type of 'bool'");
+
   /**
    * 13.15 Assert: It is a static type warning if the type of <i>e</i> may not be assigned to either
    * bool or () &rarr; bool
    */
   static final StaticTypeWarningCode NON_BOOL_EXPRESSION = new StaticTypeWarningCode('NON_BOOL_EXPRESSION', 5, "Assertions must be on either a 'bool' or '() -> bool'");
+
   /**
    * 15.8 Parameterized Types: It is a static type warning if <i>A<sub>i</sub>, 1 &lt;= i &lt;=
    * n</i> does not denote a type in the enclosing lexical scope.
    */
   static final StaticTypeWarningCode NON_TYPE_AS_TYPE_ARGUMENT = new StaticTypeWarningCode('NON_TYPE_AS_TYPE_ARGUMENT', 6, "");
+
   /**
    * 7.6.2 Factories: It is a static type warning if any of the type arguments to <i>k'</i> are not
    * subtypes of the bounds of the corresponding formal type parameters of type.
    */
   static final StaticTypeWarningCode REDIRECT_WITH_INVALID_TYPE_PARAMETERS = new StaticTypeWarningCode('REDIRECT_WITH_INVALID_TYPE_PARAMETERS', 7, "");
+
   /**
    * 13.11 Return: It is a static type warning if the type of <i>e</i> may not be assigned to the
    * declared return type of the immediately enclosing function.
@@ -1551,6 +2335,7 @@
    * @param methodName the name of the method
    */
   static final StaticTypeWarningCode RETURN_OF_INVALID_TYPE = new StaticTypeWarningCode('RETURN_OF_INVALID_TYPE', 8, "The return type '%s' is not a '%s', as defined by the method '%s'");
+
   /**
    * 12.11 Instance Creation: It is a static type warning if any of the type arguments to a
    * constructor of a generic type <i>G</i> invoked by a new expression or a constant object
@@ -1561,6 +2346,7 @@
    * @param boundingTypeName the name of the bounding type
    */
   static final StaticTypeWarningCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = new StaticTypeWarningCode('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 9, "'%s' does not extend '%s'");
+
   /**
    * 10 Generics: It is a static type warning if a type parameter is a supertype of its upper bound.
    * <p>
@@ -1573,12 +2359,14 @@
    * A<sub>n</sub>/T<sub>1</sub>, &hellip;, T<sub>n</sub>\]B<sub>i</sub>, 1 &lt;= i &lt;= n</i>.
    */
   static final StaticTypeWarningCode TYPE_ARGUMENT_VIOLATES_BOUNDS = new StaticTypeWarningCode('TYPE_ARGUMENT_VIOLATES_BOUNDS', 10, "");
+
   /**
    * Specification reference needed. This is equivalent to {@link #UNDEFINED_METHOD}, but for
    * top-level functions.
    * @param methodName the name of the method that is undefined
    */
-  static final StaticTypeWarningCode UNDEFINED_FUNCTION = new StaticTypeWarningCode('UNDEFINED_FUNCTION', 11, "The FUNCTION '%s' is not defined");
+  static final StaticTypeWarningCode UNDEFINED_FUNCTION = new StaticTypeWarningCode('UNDEFINED_FUNCTION', 11, "The function '%s' is not defined");
+
   /**
    * 12.17 Getter Invocation: Let <i>T</i> be the static type of <i>e</i>. It is a static type
    * warning if <i>T</i> does not have a getter named <i>m</i>.
@@ -1586,6 +2374,7 @@
    * @param enclosingType the name of the enclosing type where the getter is being looked for
    */
   static final StaticTypeWarningCode UNDEFINED_GETTER = new StaticTypeWarningCode('UNDEFINED_GETTER', 12, "There is no such getter '%s' in '%s'");
+
   /**
    * 12.15.1 Ordinary Invocation: Let <i>T</i> be the static type of <i>o</i>. It is a static type
    * warning if <i>T</i> does not have an accessible instance member named <i>m</i>.
@@ -1593,6 +2382,24 @@
    * @param typeName the resolved type name that the method lookup is happening on
    */
   static final StaticTypeWarningCode UNDEFINED_METHOD = new StaticTypeWarningCode('UNDEFINED_METHOD', 13, "The method '%s' is not defined for the class '%s'");
+
+  /**
+   * 12.18 Assignment: Evaluation of an assignment of the form
+   * <i>e<sub>1</sub></i>\[<i>e<sub>2</sub></i>\] = <i>e<sub>3</sub></i> is equivalent to the
+   * evaluation of the expression (a, i, e){a.\[\]=(i, e); return e;} (<i>e<sub>1</sub></i>,
+   * <i>e<sub>2</sub></i>, <i>e<sub>2</sub></i>).
+   * <p>
+   * 12.29 Assignable Expressions: An assignable expression of the form
+   * <i>e<sub>1</sub></i>\[<i>e<sub>2</sub></i>\] is evaluated as a method invocation of the operator
+   * method \[\] on <i>e<sub>1</sub></i> with argument <i>e<sub>2</sub></i>.
+   * <p>
+   * 12.15.1 Ordinary Invocation: Let <i>T</i> be the static type of <i>o</i>. It is a static type
+   * warning if <i>T</i> does not have an accessible instance member named <i>m</i>.
+   * @param operator the name of the operator
+   * @param enclosingType the name of the enclosing type where the operator is being looked for
+   */
+  static final StaticTypeWarningCode UNDEFINED_OPERATOR = new StaticTypeWarningCode('UNDEFINED_OPERATOR', 14, "There is no such operator '%s' in '%s'");
+
   /**
    * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>. It is a static type
    * warning if <i>T</i> does not have an accessible instance setter named <i>v=</i>.
@@ -1600,7 +2407,8 @@
    * @param enclosingType the name of the enclosing type where the setter is being looked for
    * @see #INACCESSIBLE_SETTER
    */
-  static final StaticTypeWarningCode UNDEFINED_SETTER = new StaticTypeWarningCode('UNDEFINED_SETTER', 14, "There is no such setter '%s' in '%s'");
+  static final StaticTypeWarningCode UNDEFINED_SETTER = new StaticTypeWarningCode('UNDEFINED_SETTER', 15, "There is no such setter '%s' in '%s'");
+
   /**
    * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
    * <i>super.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip;
@@ -1609,7 +2417,8 @@
    * @param methodName the name of the method that is undefined
    * @param typeName the resolved type name that the method lookup is happening on
    */
-  static final StaticTypeWarningCode UNDEFINED_SUPER_METHOD = new StaticTypeWarningCode('UNDEFINED_SUPER_METHOD', 15, "There is no such method '%s' in '%s'");
+  static final StaticTypeWarningCode UNDEFINED_SUPER_METHOD = new StaticTypeWarningCode('UNDEFINED_SUPER_METHOD', 16, "There is no such method '%s' in '%s'");
+
   /**
    * 15.8 Parameterized Types: It is a static type warning if <i>G</i> is not an accessible generic
    * type declaration with <i>n</i> type parameters.
@@ -1617,26 +2426,30 @@
    * @param parameterCount the number of type parameters that were declared
    * @param argumentCount the number of type arguments provided
    */
-  static final StaticTypeWarningCode WRONG_NUMBER_OF_TYPE_ARGUMENTS = new StaticTypeWarningCode('WRONG_NUMBER_OF_TYPE_ARGUMENTS', 16, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
-  static final List<StaticTypeWarningCode> values = [INACCESSIBLE_SETTER, INCONSISTENT_METHOD_INHERITANCE, INVALID_ASSIGNMENT, INVOCATION_OF_NON_FUNCTION, NON_BOOL_CONDITION, NON_BOOL_EXPRESSION, NON_TYPE_AS_TYPE_ARGUMENT, REDIRECT_WITH_INVALID_TYPE_PARAMETERS, RETURN_OF_INVALID_TYPE, TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, TYPE_ARGUMENT_VIOLATES_BOUNDS, UNDEFINED_FUNCTION, UNDEFINED_GETTER, UNDEFINED_METHOD, UNDEFINED_SETTER, UNDEFINED_SUPER_METHOD, WRONG_NUMBER_OF_TYPE_ARGUMENTS];
-  final String __name;
-  final int __ordinal;
-  int get ordinal => __ordinal;
+  static final StaticTypeWarningCode WRONG_NUMBER_OF_TYPE_ARGUMENTS = new StaticTypeWarningCode('WRONG_NUMBER_OF_TYPE_ARGUMENTS', 17, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
+  static final List<StaticTypeWarningCode> values = [INACCESSIBLE_SETTER, INCONSISTENT_METHOD_INHERITANCE, INVALID_ASSIGNMENT, INVOCATION_OF_NON_FUNCTION, NON_BOOL_CONDITION, NON_BOOL_EXPRESSION, NON_TYPE_AS_TYPE_ARGUMENT, REDIRECT_WITH_INVALID_TYPE_PARAMETERS, RETURN_OF_INVALID_TYPE, TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, TYPE_ARGUMENT_VIOLATES_BOUNDS, UNDEFINED_FUNCTION, UNDEFINED_GETTER, UNDEFINED_METHOD, UNDEFINED_OPERATOR, UNDEFINED_SETTER, UNDEFINED_SUPER_METHOD, WRONG_NUMBER_OF_TYPE_ARGUMENTS];
+
+  /// 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 type and message.
    * @param message the message template used to create the message to be displayed for the error
    */
-  StaticTypeWarningCode(this.__name, this.__ordinal, String message) {
+  StaticTypeWarningCode(this.name, this.ordinal, String message) {
     this._message = message;
   }
   ErrorSeverity get errorSeverity => ErrorType.STATIC_TYPE_WARNING.severity;
   String get message => _message;
   ErrorType get type => ErrorType.STATIC_TYPE_WARNING;
-  bool needsRecompilation() => true;
-  int compareTo(StaticTypeWarningCode other) => __ordinal - other.__ordinal;
-  String toString() => __name;
+  int compareTo(StaticTypeWarningCode other) => ordinal - other.ordinal;
+  String toString() => name;
 }
\ No newline at end of file
diff --git a/pkg/analyzer_experimental/lib/src/generated/html.dart b/pkg/analyzer_experimental/lib/src/generated/html.dart
index 0c0d3cf..0de0d5b 100644
--- a/pkg/analyzer_experimental/lib/src/generated/html.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/html.dart
@@ -11,43 +11,51 @@
 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_151_impl(type, offset);
+    _jtd_constructor_154_impl(type, offset);
   }
-  _jtd_constructor_151_impl(TokenType type, int offset) {
-    _jtd_constructor_152_impl(type, offset, type.lexeme);
+  _jtd_constructor_154_impl(TokenType type, int offset) {
+    _jtd_constructor_155_impl(type, offset, type.lexeme);
   }
+  
   /**
    * Initialize a newly created token.
    * @param type the token type (not {@code null})
@@ -55,13 +63,14 @@
    * @param value the lexeme represented by this token (not {@code null})
    */
   Token.con2(TokenType type2, int offset2, String value2) {
-    _jtd_constructor_152_impl(type2, offset2, value2);
+    _jtd_constructor_155_impl(type2, offset2, value2);
   }
-  _jtd_constructor_152_impl(TokenType type2, int offset2, String value2) {
+  _jtd_constructor_155_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.
@@ -69,36 +78,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
@@ -106,6 +122,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.
@@ -118,6 +135,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
@@ -126,11 +144,13 @@
     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}).
    */
@@ -138,12 +158,14 @@
   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
@@ -168,26 +190,31 @@
     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
@@ -195,11 +222,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
@@ -212,6 +241,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.
@@ -225,6 +255,7 @@
     }
     return beginToken.offset;
   }
+  
   /**
    * Return this node's parent node, or {@code null} if this node is the root of an AST structure.
    * <p>
@@ -238,12 +269,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
@@ -259,6 +292,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
@@ -271,6 +305,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
@@ -279,6 +314,7 @@
     _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
@@ -290,6 +326,7 @@
   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.
@@ -297,26 +334,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
@@ -328,11 +371,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
@@ -340,17 +385,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
@@ -360,11 +408,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.
@@ -375,11 +425,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.
    */
@@ -549,19 +601,23 @@
     }
   }
 }
+
 /**
  * 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.
    */
@@ -571,40 +627,48 @@
     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
@@ -634,24 +698,29 @@
     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
@@ -678,16 +747,19 @@
     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.
@@ -737,6 +809,7 @@
     }
     return null;
   }
+  
   /**
    * Safely visit the given node.
    * @param node the node to be visited
@@ -747,12 +820,14 @@
     }
   }
 }
+
 /**
  * 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.
    */
@@ -769,30 +844,36 @@
   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];
-  final String __name;
-  final int __ordinal;
-  int get ordinal => __ordinal;
+  
+  /// 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.
    */
   String _lexeme;
-  TokenType(this.__name, this.__ordinal, String lexeme) {
+  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.
    * @return the lexeme that defines this type of token
    */
   String get lexeme => _lexeme;
-  int compareTo(TokenType other) => __ordinal - other.__ordinal;
-  String toString() => __name;
+  int compareTo(TokenType other) => ordinal - other.ordinal;
+  String toString() => name;
 }
 class TokenType_EOF extends TokenType {
-  TokenType_EOF(String ___name, int ___ordinal, String arg0) : super(___name, ___ordinal, arg0);
+  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
@@ -801,6 +882,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
@@ -816,16 +898,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
@@ -853,6 +938,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.
@@ -862,6 +948,7 @@
   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
@@ -871,6 +958,7 @@
   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:
@@ -883,22 +971,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})
@@ -918,26 +1011,31 @@
     _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
@@ -945,11 +1043,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.
@@ -957,6 +1057,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.
@@ -981,11 +1082,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})
@@ -997,6 +1100,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}.
@@ -1023,6 +1127,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}.
@@ -1048,6 +1153,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}.
@@ -1075,6 +1181,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}
@@ -1130,45 +1237,55 @@
     }
     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>
@@ -1181,15 +1298,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})
@@ -1223,24 +1343,53 @@
     this._nodeEnd = nodeEnd;
   }
   accept(XmlVisitor visitor) => visitor.visitXmlTagNode(this);
+  
+  /**
+   * Answer the attribute with the specified name.
+   * @param name the attribute name
+   * @return the attribute or {@code null} if no matching attribute is found
+   */
+  XmlAttributeNode getAttribute(String name2) {
+    for (XmlAttributeNode attribute in _attributes) {
+      if (attribute.name.lexeme == name2) {
+        return attribute;
+      }
+    }
+    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()}).
+   * @param name the attribute name
+   * @return the attribute text or {@code null} if no matching attribute is found
+   */
+  String getAttributeText(String name) {
+    XmlAttributeNode attribute = getAttribute(name);
+    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;',
@@ -1264,6 +1413,7 @@
     }
     return buffer.toString();
   }
+  
   /**
    * Answer the token (not {@code null}) after the content, which may be
    * <ul>
@@ -1298,21 +1448,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.
@@ -1327,6 +1481,7 @@
       node.accept(visitor);
     }
   }
+  
   /**
    * Same as {@link #becomeParentOf(List)}, but returns given "ifEmpty" if "children" is empty
    */
@@ -1337,6 +1492,7 @@
     return becomeParentOf(children);
   }
 }
+
 /**
  * Instances of the class {@code HtmlParser} are used to parse tokens into a AST structure comprised
  * of {@link XmlNode}s.
@@ -1344,12 +1500,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})
@@ -1361,6 +1519,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})
@@ -1373,28 +1532,34 @@
   }
   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})
@@ -1408,18 +1573,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 29c963d..8bcdd137 100644
--- a/pkg/analyzer_experimental/lib/src/generated/instrumentation.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/instrumentation.dart
@@ -5,6 +5,7 @@
 
 import 'java_core.dart';
 
+
 /**
  * The class {@code Instrumentation} implements support for logging instrumentation information.
  * <p>
@@ -31,46 +32,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
@@ -78,11 +88,6 @@
   static void set logger(InstrumentationLogger logger2) {
     _CURRENT_LOGGER = logger2 == null ? _NULL_LOGGER : logger2;
   }
-  /**
-   * Prevent the creation of instances of this class
-   */
-  Instrumentation() {
-  }
 }
 class InstrumentationBuilder_13 implements InstrumentationBuilder {
   InstrumentationBuilder data(String name, bool value) => this;
@@ -101,6 +106,7 @@
 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.
@@ -109,6 +115,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
@@ -118,6 +125,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
@@ -127,6 +135,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
@@ -136,6 +145,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
@@ -145,17 +155,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
@@ -165,6 +178,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
@@ -174,6 +188,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
@@ -183,6 +198,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
@@ -192,6 +208,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
@@ -201,6 +218,7 @@
    */
   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
@@ -208,22 +226,28 @@
  * @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];
-  final String __name;
-  final int __ordinal;
-  int get ordinal => __ordinal;
+  
+  /// 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) {
     if (str == "EVERYTHING") {
       return InstrumentationLevel.EVERYTHING;
@@ -236,11 +260,12 @@
     }
     throw new IllegalArgumentException("Unrecognised InstrumentationLevel");
   }
-  InstrumentationLevel(this.__name, this.__ordinal) {
+  InstrumentationLevel(this.name, this.ordinal) {
   }
-  int compareTo(InstrumentationLevel other) => __ordinal - other.__ordinal;
-  String toString() => __name;
+  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.
@@ -249,6 +274,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 445d6d7..c3dd970 100644
--- a/pkg/analyzer_experimental/lib/src/generated/java_core.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/java_core.dart
@@ -268,6 +268,15 @@
   String toString() => "NumberFormatException";
 }
 
+/// Parses given string to [Uri], throws [URISyntaxException] if invalid.
+Uri parseUriWithException(String str) {
+  Uri uri = Uri.parse(str);
+  if (uri.path.isEmpty) {
+    throw new URISyntaxException();
+  }
+  return uri;
+}
+
 class URISyntaxException implements Exception {
   String toString() => "URISyntaxException";
 }
@@ -421,17 +430,24 @@
 }
 
 class MapEntry<K, V> {
-  K _key;
+  final Map<K, V> _map;
+  final K _key;
   V _value;
-  MapEntry(this._key, this._value);
+  MapEntry(this._map, this._key, this._value);
   K getKey() => _key;
   V getValue() => _value;
+  V setValue(V v) {
+    V prevValue = _value;
+    _value = v;
+    _map[_key] = v;
+    return prevValue;
+  }
 }
 
 Set<MapEntry> getMapEntrySet(Map m) {
   Set<MapEntry> result = new Set();
   m.forEach((k, v) {
-    result.add(new MapEntry(k, v));
+    result.add(new MapEntry(m, k, v));
   });
   return result;
 }
diff --git a/pkg/analyzer_experimental/lib/src/generated/java_io.dart b/pkg/analyzer_experimental/lib/src/generated/java_io.dart
index f818d57..d0459a0 100644
--- a/pkg/analyzer_experimental/lib/src/generated/java_io.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/java_io.dart
@@ -21,6 +21,13 @@
       return '\n';
     }
     if (name == 'com.google.dart.sdk') {
+      String value = Platform.environment['DART_SDK'];
+      if (value != null) {
+        _properties[name] = value;
+        return value;
+      }
+    }
+    if (name == 'com.google.dart.sdk') {
       String exec = new Options().executable;
       if (exec.length != 0) {
         String sdkPath;
@@ -86,6 +93,14 @@
   Uri toURI() => new Uri(path: _path.toString());
   String readAsStringSync() => _newFile().readAsStringSync();
   int lastModified() => _newFile().lastModifiedSync().millisecondsSinceEpoch;
+  List<JavaFile> listFiles() {
+    List<JavaFile> files = [];
+    List<FileSystemEntity> entities = _newDirectory().listSync();
+    for (FileSystemEntity entity in entities) {
+      files.add(new JavaFile(entity.path));
+    }
+    return files;
+  }
   File _newFile() => new File.fromPath(_path);
   Directory _newDirectory() => new Directory.fromPath(_path);
 }
diff --git a/pkg/analyzer_experimental/lib/src/generated/parser.dart b/pkg/analyzer_experimental/lib/src/generated/parser.dart
index 42fb425..5388c43 100644
--- a/pkg/analyzer_experimental/lib/src/generated/parser.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/parser.dart
@@ -13,20 +13,24 @@
 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
@@ -36,31 +40,37 @@
     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
@@ -70,97 +80,110 @@
     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;
-  /**
-   * Initialize a newly created and empty set of modifiers.
-   */
-  Modifiers() : super() {
-  }
+  
   /**
    * 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'
@@ -168,6 +191,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'
@@ -175,6 +199,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'
@@ -182,6 +207,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'
@@ -189,6 +215,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'
@@ -196,6 +223,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'
@@ -203,6 +231,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'
@@ -221,6 +250,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.
@@ -240,27 +270,33 @@
     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.
    */
@@ -270,6 +306,7 @@
   static String _ON = "on";
   static String _SHOW = "show";
   static String _NATIVE = "native";
+  
   /**
    * Initialize a newly created parser.
    * @param source the source being parsed
@@ -280,6 +317,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
@@ -294,6 +332,7 @@
       instrumentation.log();
     }
   }
+  
   /**
    * Parse an expression, starting with the given token.
    * @param token the first token of the expression
@@ -309,6 +348,7 @@
       instrumentation.log();
     }
   }
+  
   /**
    * Parse a statement, starting with the given token.
    * @param token the first token of the statement
@@ -324,6 +364,7 @@
       instrumentation.log();
     }
   }
+  
   /**
    * Parse a sequence of statements, starting with the given token.
    * @param token the first token of the sequence of statement
@@ -342,12 +383,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
@@ -360,7 +403,7 @@
    */
   void appendScalarValue(JavaStringBuilder builder, String escapeSequence, int scalarValue, int startIndex, int endIndex) {
     if (scalarValue < 0 || scalarValue > Character.MAX_CODE_POINT || (scalarValue >= 0xD800 && scalarValue <= 0xDFFF)) {
-      reportError4(ParserErrorCode.INVALID_CODE_POINT, [escapeSequence]);
+      reportError7(ParserErrorCode.INVALID_CODE_POINT, [escapeSequence]);
       return;
     }
     if (scalarValue < Character.MAX_VALUE) {
@@ -369,6 +412,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
@@ -403,26 +447,69 @@
     }
     return builder.toString();
   }
+  
+  /**
+   * Convert the given method declaration into the nearest valid top-level function declaration.
+   * @param method the method to be converted
+   * @return the function declaration that most closely captures the components of the given method
+   * 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
+   * error while parsing a compilation unit member.
+   * @return {@code true} if the current token could be the start of a compilation unit member
+   */
+  bool couldBeStartOfCompilationUnitMember() {
+    if ((matches(Keyword.IMPORT) || matches(Keyword.EXPORT) || matches(Keyword.LIBRARY) || matches(Keyword.PART)) && !matches4(peek(), TokenType.PERIOD) && !matches4(peek(), TokenType.LT)) {
+      return true;
+    } else if (matches(Keyword.CLASS)) {
+      return true;
+    } else if (matches(Keyword.TYPEDEF) && !matches4(peek(), TokenType.PERIOD) && !matches4(peek(), TokenType.LT)) {
+      return true;
+    } else if (matches(Keyword.VOID) || ((matches(Keyword.GET) || matches(Keyword.SET)) && matchesIdentifier2(peek())) || (matches(Keyword.OPERATOR) && isOperator(peek()))) {
+      return true;
+    } else if (matchesIdentifier()) {
+      if (matches4(peek(), TokenType.OPEN_PAREN)) {
+        return true;
+      }
+      Token token = skipReturnType(_currentToken);
+      if (token == null) {
+        return false;
+      }
+      if (matches(Keyword.GET) || matches(Keyword.SET) || (matches(Keyword.OPERATOR) && isOperator(peek())) || matchesIdentifier()) {
+        return true;
+      }
+    }
+    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>
@@ -438,9 +525,10 @@
    */
   void ensureAssignable(Expression expression) {
     if (expression != null && !expression.isAssignable()) {
-      reportError4(ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE, []);
+      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.
@@ -451,9 +539,10 @@
     if (matches(keyword)) {
       return andAdvance;
     }
-    reportError4(ParserErrorCode.EXPECTED_TOKEN, [keyword.syntax]);
+    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.
@@ -465,12 +554,13 @@
       return andAdvance;
     }
     if (identical(type, TokenType.SEMICOLON)) {
-      reportError5(ParserErrorCode.EXPECTED_TOKEN, _currentToken.previous, [type.lexeme]);
+      reportError8(ParserErrorCode.EXPECTED_TOKEN, _currentToken.previous, [type.lexeme]);
     } else {
-      reportError4(ParserErrorCode.EXPECTED_TOKEN, [type.lexeme]);
+      reportError7(ParserErrorCode.EXPECTED_TOKEN, [type.lexeme]);
     }
     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.
@@ -488,6 +578,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
@@ -497,6 +588,7 @@
     advance();
     return token;
   }
+  
   /**
    * Return a list of the ranges of characters in the given comment string that should be treated as
    * code blocks.
@@ -538,6 +630,20 @@
     }
     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.
+   * @param beginToken the token that is expected to have an end token associated with it
+   * @return the end token associated with the begin token
+   */
+  Token getEndToken(Token beginToken) {
+    if (beginToken is BeginToken) {
+      return ((beginToken as BeginToken)).endToken;
+    }
+    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
@@ -553,6 +659,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
@@ -574,6 +681,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
@@ -586,12 +694,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
@@ -615,9 +725,12 @@
    * declaration
    */
   bool isInitializedVariableDeclaration() {
-    if (matches(Keyword.FINAL) || matches(Keyword.CONST) || matches(Keyword.VAR)) {
+    if (matches(Keyword.FINAL) || matches(Keyword.VAR)) {
       return true;
     }
+    if (matches(Keyword.CONST)) {
+      return !matchesAny(peek(), [TokenType.LT, TokenType.OPEN_CURLY_BRACKET, TokenType.OPEN_SQUARE_BRACKET, TokenType.INDEX]);
+    }
     Token token = skipTypeName(_currentToken);
     if (token == null) {
       return false;
@@ -629,6 +742,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
@@ -659,6 +773,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
@@ -674,6 +789,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
@@ -689,6 +805,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}.
@@ -705,23 +822,27 @@
         int offset2 = token.offset;
         if (offset2 < firstOffset) {
           first = token;
+          firstOffset = offset2;
         }
       }
     }
     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
@@ -729,6 +850,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
@@ -736,6 +858,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
@@ -783,6 +906,7 @@
     }
     return true;
   }
+  
   /**
    * Return {@code true} if the given token has any one of the given types.
    * @param token the token being tested
@@ -798,18 +922,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
@@ -822,6 +949,7 @@
     }
     return false;
   }
+  
   /**
    * Parse an additive expression.
    * <pre>
@@ -844,6 +972,7 @@
     }
     return expression;
   }
+  
   /**
    * Parse an annotation.
    * <pre>
@@ -867,6 +996,7 @@
     }
     return new Annotation.full(atSign, name, period, constructorName, arguments);
   }
+  
   /**
    * Parse an argument.
    * <pre>
@@ -887,6 +1017,7 @@
       return parseExpression2();
     }
   }
+  
   /**
    * Parse an argument definition test.
    * <pre>
@@ -900,6 +1031,7 @@
     SimpleIdentifier identifier = parseSimpleIdentifier();
     return new ArgumentDefinitionTest.full(question, identifier);
   }
+  
   /**
    * Parse a list of arguments.
    * <pre>
@@ -926,7 +1058,7 @@
       arguments.add(argument);
       if (foundNamedArgument) {
         if (!generatedError && argument is! NamedExpression) {
-          reportError4(ParserErrorCode.POSITIONAL_AFTER_NAMED_ARGUMENT, []);
+          reportError7(ParserErrorCode.POSITIONAL_AFTER_NAMED_ARGUMENT, []);
           generatedError = true;
         }
       } else if (argument is NamedExpression) {
@@ -936,6 +1068,7 @@
     Token rightParenthesis = expect2(TokenType.CLOSE_PAREN);
     return new ArgumentList.full(leftParenthesis, arguments, rightParenthesis);
   }
+  
   /**
    * Parse an assert statement.
    * <pre>
@@ -952,6 +1085,7 @@
     Token semicolon = expect2(TokenType.SEMICOLON);
     return new AssertStatement.full(keyword, leftParen, expression, rightParen, semicolon);
   }
+  
   /**
    * Parse an assignable expression.
    * <pre>
@@ -1000,6 +1134,7 @@
       isOptional = true;
     }
   }
+  
   /**
    * Parse an assignable selector.
    * <pre>
@@ -1022,11 +1157,12 @@
       return new PropertyAccess.full(prefix, period, parseSimpleIdentifier());
     } else {
       if (!optional) {
-        reportError4(ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR, []);
+        reportError7(ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR, []);
       }
       return prefix;
     }
   }
+  
   /**
    * Parse a bitwise and expression.
    * <pre>
@@ -1049,6 +1185,7 @@
     }
     return expression;
   }
+  
   /**
    * Parse a bitwise or expression.
    * <pre>
@@ -1071,6 +1208,7 @@
     }
     return expression;
   }
+  
   /**
    * Parse a bitwise exclusive-or expression.
    * <pre>
@@ -1093,6 +1231,7 @@
     }
     return expression;
   }
+  
   /**
    * Parse a block.
    * <pre>
@@ -1111,7 +1250,7 @@
         statements.add(statement);
       }
       if (identical(_currentToken, statementStart)) {
-        reportError5(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        reportError8(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
         advance();
       }
       statementStart = _currentToken;
@@ -1119,6 +1258,7 @@
     Token rightBracket = expect2(TokenType.CLOSE_CURLY_BRACKET);
     return new Block.full(leftBracket, statements, rightBracket);
   }
+  
   /**
    * Parse a break statement.
    * <pre>
@@ -1134,11 +1274,12 @@
       label = parseSimpleIdentifier();
     }
     if (!_inLoop && !_inSwitch && label == null) {
-      reportError5(ParserErrorCode.BREAK_OUTSIDE_OF_LOOP, breakKeyword, []);
+      reportError8(ParserErrorCode.BREAK_OUTSIDE_OF_LOOP, breakKeyword, []);
     }
     Token semicolon = expect2(TokenType.SEMICOLON);
     return new BreakStatement.full(breakKeyword, label, semicolon);
   }
+  
   /**
    * Parse a cascade section.
    * <pre>
@@ -1165,8 +1306,8 @@
       expression = new IndexExpression.forCascade_full(period, leftBracket, index, rightBracket);
       period = null;
     } else {
-      reportError5(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
-      return expression;
+      reportError8(ParserErrorCode.MISSING_IDENTIFIER, _currentToken, [_currentToken.lexeme]);
+      functionName = createSyntheticIdentifier();
     }
     if (identical(_currentToken.type, TokenType.OPEN_PAREN)) {
       while (identical(_currentToken.type, TokenType.OPEN_PAREN)) {
@@ -1175,7 +1316,7 @@
           period = null;
           functionName = null;
         } else if (expression == null) {
-          return null;
+          expression = new MethodInvocation.full(expression, period, createSyntheticIdentifier(), parseArgumentList());
         } else {
           expression = new FunctionExpressionInvocation.full(expression, parseArgumentList());
         }
@@ -1203,6 +1344,7 @@
     }
     return expression;
   }
+  
   /**
    * Parse a class declaration.
    * <pre>
@@ -1231,29 +1373,29 @@
         if (extendsClause == null) {
           extendsClause = parseExtendsClause();
           if (withClause != null) {
-            reportError5(ParserErrorCode.WITH_BEFORE_EXTENDS, withClause.withKeyword, []);
+            reportError8(ParserErrorCode.WITH_BEFORE_EXTENDS, withClause.withKeyword, []);
           } else if (implementsClause != null) {
-            reportError5(ParserErrorCode.IMPLEMENTS_BEFORE_EXTENDS, implementsClause.keyword, []);
+            reportError8(ParserErrorCode.IMPLEMENTS_BEFORE_EXTENDS, implementsClause.keyword, []);
           }
         } else {
-          reportError5(ParserErrorCode.MULTIPLE_EXTENDS_CLAUSES, extendsClause.keyword, []);
+          reportError8(ParserErrorCode.MULTIPLE_EXTENDS_CLAUSES, extendsClause.keyword, []);
           parseExtendsClause();
         }
       } else if (matches(Keyword.WITH)) {
         if (withClause == null) {
           withClause = parseWithClause();
           if (implementsClause != null) {
-            reportError5(ParserErrorCode.IMPLEMENTS_BEFORE_WITH, implementsClause.keyword, []);
+            reportError8(ParserErrorCode.IMPLEMENTS_BEFORE_WITH, implementsClause.keyword, []);
           }
         } else {
-          reportError5(ParserErrorCode.MULTIPLE_WITH_CLAUSES, withClause.withKeyword, []);
+          reportError8(ParserErrorCode.MULTIPLE_WITH_CLAUSES, withClause.withKeyword, []);
           parseWithClause();
         }
       } else if (matches(Keyword.IMPLEMENTS)) {
         if (implementsClause == null) {
           implementsClause = parseImplementsClause();
         } else {
-          reportError5(ParserErrorCode.MULTIPLE_IMPLEMENTS_CLAUSES, implementsClause.keyword, []);
+          reportError8(ParserErrorCode.MULTIPLE_IMPLEMENTS_CLAUSES, implementsClause.keyword, []);
           parseImplementsClause();
         }
       } else {
@@ -1261,7 +1403,7 @@
       }
     }
     if (withClause != null && extendsClause == null) {
-      reportError5(ParserErrorCode.WITH_WITHOUT_EXTENDS, withClause.withKeyword, []);
+      reportError8(ParserErrorCode.WITH_WITHOUT_EXTENDS, withClause.withKeyword, []);
     }
     if (matches2(_NATIVE) && matches4(peek(), TokenType.STRING)) {
       advance();
@@ -1272,15 +1414,16 @@
     Token rightBracket = null;
     if (matches5(TokenType.OPEN_CURLY_BRACKET)) {
       leftBracket = expect2(TokenType.OPEN_CURLY_BRACKET);
-      members = parseClassMembers(className, ((leftBracket as BeginToken)).endToken != null);
+      members = parseClassMembers(className, getEndToken(leftBracket));
       rightBracket = expect2(TokenType.CLOSE_CURLY_BRACKET);
     } else {
       leftBracket = createSyntheticToken2(TokenType.OPEN_CURLY_BRACKET);
       rightBracket = createSyntheticToken2(TokenType.CLOSE_CURLY_BRACKET);
-      reportError4(ParserErrorCode.MISSING_CLASS_BODY, []);
+      reportError7(ParserErrorCode.MISSING_CLASS_BODY, []);
     }
     return new ClassDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, abstractKeyword, keyword, name, typeParameters, extendsClause, withClause, implementsClause, leftBracket, members, rightBracket);
   }
+  
   /**
    * Parse a class member.
    * <pre>
@@ -1289,7 +1432,8 @@
    * | methodSignature functionBody
    * </pre>
    * @param className the name of the class containing the member being parsed
-   * @return the class member that was parsed
+   * @return the class member that was parsed, or {@code null} if what was found was not a valid
+   * class member
    */
   ClassMember parseClassMember(String className) {
     CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
@@ -1319,7 +1463,7 @@
           validateModifiersForOperator(modifiers);
           return parseOperator(commentAndMetadata, modifiers.externalKeyword, returnType);
         }
-        reportError5(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
+        reportError8(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
         return null;
       }
     } else if (matches(Keyword.GET) && matchesIdentifier2(peek())) {
@@ -1336,7 +1480,7 @@
         validateModifiersForOperator(modifiers);
         return parseOperator(commentAndMetadata, modifiers.externalKeyword, null);
       }
-      reportError5(ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken, []);
+      reportError8(ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken, []);
       return null;
     } else if (matches4(peek(), TokenType.PERIOD) && matchesIdentifier2(peek2(2)) && matches4(peek2(3), TokenType.OPEN_PAREN)) {
       return parseConstructor(commentAndMetadata, modifiers.externalKeyword, validateModifiersForConstructor(modifiers), modifiers.factoryKeyword, parseSimpleIdentifier(), andAdvance, parseSimpleIdentifier(), parseFormalParameterList());
@@ -1350,6 +1494,9 @@
       validateFormalParameterList(parameters);
       return parseMethodDeclaration2(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, null, methodName, parameters);
     } else if (matchesAny(peek(), [TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) {
+      if (modifiers.constKeyword == null && modifiers.finalKeyword == null && modifiers.varKeyword == null) {
+        reportError7(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, []);
+      }
       return parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, validateModifiersForField(modifiers), null);
     }
     TypeName type = parseTypeName();
@@ -1370,14 +1517,22 @@
         validateModifiersForOperator(modifiers);
         return parseOperator(commentAndMetadata, modifiers.externalKeyword, type);
       }
-      reportError5(ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken, []);
+      reportError8(ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken, []);
       return null;
     } else if (matches4(peek(), TokenType.OPEN_PAREN)) {
+      SimpleIdentifier methodName = parseSimpleIdentifier();
+      FormalParameterList parameters = parseFormalParameterList();
+      if (methodName.name == className) {
+        reportError(ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, type, []);
+        return parseConstructor(commentAndMetadata, modifiers.externalKeyword, validateModifiersForConstructor(modifiers), modifiers.factoryKeyword, methodName, null, null, parameters);
+      }
       validateModifiersForGetterOrSetterOrMethod(modifiers);
-      return parseMethodDeclaration(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, type);
+      validateFormalParameterList(parameters);
+      return parseMethodDeclaration2(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, type, methodName, parameters);
     }
     return parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, validateModifiersForField(modifiers), type);
   }
+  
   /**
    * Parse a list of class members.
    * <pre>
@@ -1385,16 +1540,16 @@
    * (metadata memberDefinition)
    * </pre>
    * @param className the name of the class whose members are being parsed
-   * @param balancedBrackets {@code true} if the opening and closing brackets for the class are
-   * balanced
+   * @param closingBracket the closing bracket for the class, or {@code null} if the closing bracket
+   * is missing
    * @return the list of class members that were parsed
    */
-  List<ClassMember> parseClassMembers(String className, bool balancedBrackets) {
+  List<ClassMember> parseClassMembers(String className, Token closingBracket) {
     List<ClassMember> members = new List<ClassMember>();
     Token memberStart = _currentToken;
-    while (!matches5(TokenType.EOF) && !matches5(TokenType.CLOSE_CURLY_BRACKET) && (balancedBrackets || (!matches(Keyword.CLASS) && !matches(Keyword.TYPEDEF)))) {
+    while (!matches5(TokenType.EOF) && !matches5(TokenType.CLOSE_CURLY_BRACKET) && (closingBracket != null || (!matches(Keyword.CLASS) && !matches(Keyword.TYPEDEF)))) {
       if (matches5(TokenType.SEMICOLON)) {
-        reportError5(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        reportError8(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
         advance();
       } else {
         ClassMember member = parseClassMember(className);
@@ -1403,13 +1558,14 @@
         }
       }
       if (identical(_currentToken, memberStart)) {
-        reportError5(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        reportError8(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
         advance();
       }
       memberStart = _currentToken;
     }
     return members;
   }
+  
   /**
    * Parse a class type alias.
    * <pre>
@@ -1423,7 +1579,7 @@
    * @return the class type alias that was parsed
    */
   ClassTypeAlias parseClassTypeAlias(CommentAndMetadata commentAndMetadata, Token keyword) {
-    SimpleIdentifier name = parseSimpleIdentifier();
+    SimpleIdentifier className = parseSimpleIdentifier();
     TypeParameterList typeParameters = null;
     if (matches5(TokenType.LT)) {
       typeParameters = parseTypeParameterList();
@@ -1442,9 +1598,23 @@
     if (matches(Keyword.IMPLEMENTS)) {
       implementsClause = parseImplementsClause();
     }
-    Token semicolon = expect2(TokenType.SEMICOLON);
-    return new ClassTypeAlias.full(commentAndMetadata.comment, commentAndMetadata.metadata, keyword, name, typeParameters, equals, abstractKeyword, superclass, withClause, implementsClause, semicolon);
+    Token semicolon;
+    if (matches5(TokenType.SEMICOLON)) {
+      semicolon = andAdvance;
+    } else {
+      if (matches5(TokenType.OPEN_CURLY_BRACKET)) {
+        reportError7(ParserErrorCode.EXPECTED_TOKEN, [TokenType.SEMICOLON.lexeme]);
+        Token leftBracket = andAdvance;
+        parseClassMembers(className.name, getEndToken(leftBracket));
+        expect2(TokenType.CLOSE_CURLY_BRACKET);
+      } else {
+        reportError8(ParserErrorCode.EXPECTED_TOKEN, _currentToken.previous, [TokenType.SEMICOLON.lexeme]);
+      }
+      semicolon = createSyntheticToken2(TokenType.SEMICOLON);
+    }
+    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>
@@ -1468,6 +1638,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
@@ -1490,6 +1661,7 @@
     }
     return new CommentAndMetadata(comment, metadata);
   }
+  
   /**
    * Parse a comment reference from the source between square brackets.
    * <pre>
@@ -1499,7 +1671,7 @@
    * @param referenceSource the source occurring between the square brackets within a documentation
    * comment
    * @param sourceOffset the offset of the first character of the reference source
-   * @return the comment reference that was parsed
+   * @return the comment reference that was parsed, or {@code null} if no reference could be found
    */
   CommentReference parseCommentReference(String referenceSource, int sourceOffset) {
     if (referenceSource.length == 0) {
@@ -1542,6 +1714,7 @@
     }
     return null;
   }
+  
   /**
    * Parse all of the comment references occurring in the given array of documentation comments.
    * <pre>
@@ -1586,6 +1759,7 @@
     }
     return references;
   }
+  
   /**
    * Parse a compilation unit.
    * <p>
@@ -1622,15 +1796,15 @@
       if ((matches(Keyword.IMPORT) || matches(Keyword.EXPORT) || matches(Keyword.LIBRARY) || matches(Keyword.PART)) && !matches4(peek(), TokenType.PERIOD) && !matches4(peek(), TokenType.LT)) {
         Directive directive = parseDirective(commentAndMetadata);
         if (declarations.length > 0 && !directiveFoundAfterDeclaration) {
-          reportError4(ParserErrorCode.DIRECTIVE_AFTER_DECLARATION, []);
+          reportError7(ParserErrorCode.DIRECTIVE_AFTER_DECLARATION, []);
           directiveFoundAfterDeclaration = true;
         }
         if (directive is LibraryDirective) {
           if (libraryDirectiveFound) {
-            reportError4(ParserErrorCode.MULTIPLE_LIBRARY_DIRECTIVES, []);
+            reportError7(ParserErrorCode.MULTIPLE_LIBRARY_DIRECTIVES, []);
           } else {
             if (directives.length > 0) {
-              reportError4(ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST, []);
+              reportError7(ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST, []);
             }
             libraryDirectiveFound = true;
           }
@@ -1638,28 +1812,28 @@
           partDirectiveFound = true;
         } else if (partDirectiveFound) {
           if (directive is ExportDirective) {
-            reportError4(ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE, []);
+            reportError8(ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE, ((directive as NamespaceDirective)).keyword, []);
           } else if (directive is ImportDirective) {
-            reportError4(ParserErrorCode.IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE, []);
+            reportError8(ParserErrorCode.IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE, ((directive as NamespaceDirective)).keyword, []);
           }
         }
         if (directive is PartOfDirective) {
           if (partOfDirectiveFound) {
-            reportError4(ParserErrorCode.MULTIPLE_PART_OF_DIRECTIVES, []);
+            reportError7(ParserErrorCode.MULTIPLE_PART_OF_DIRECTIVES, []);
           } else {
             for (Directive preceedingDirective in directives) {
-              reportError5(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART, preceedingDirective.keyword, []);
+              reportError8(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART, preceedingDirective.keyword, []);
             }
             partOfDirectiveFound = true;
           }
         } else {
           if (partOfDirectiveFound) {
-            reportError5(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART, directive.keyword, []);
+            reportError8(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART, directive.keyword, []);
           }
         }
         directives.add(directive);
       } else if (matches5(TokenType.SEMICOLON)) {
-        reportError5(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        reportError8(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
         advance();
       } else {
         CompilationUnitMember member = parseCompilationUnitMember(commentAndMetadata);
@@ -1668,13 +1842,17 @@
         }
       }
       if (identical(_currentToken, memberStart)) {
-        reportError5(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        reportError8(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
         advance();
+        while (!matches5(TokenType.EOF) && !couldBeStartOfCompilationUnitMember()) {
+          advance();
+        }
       }
       memberStart = _currentToken;
     }
     return new CompilationUnit.full(firstToken, scriptTag, directives, declarations, _currentToken);
   }
+  
   /**
    * Parse a compilation unit member.
    * <pre>
@@ -1690,7 +1868,8 @@
    * | variableDeclaration ';'
    * </pre>
    * @param commentAndMetadata the metadata to be associated with the member
-   * @return the compilation unit member that was parsed
+   * @return the compilation unit member that was parsed, or {@code null} if what was parsed could
+   * not be represented as a compilation unit member
    */
   CompilationUnitMember parseCompilationUnitMember(CommentAndMetadata commentAndMetadata) {
     Modifiers modifiers = parseModifiers();
@@ -1706,8 +1885,8 @@
         validateModifiersForTopLevelFunction(modifiers);
         return parseFunctionDeclaration(commentAndMetadata, modifiers.externalKeyword, null);
       } else if (matches(Keyword.OPERATOR) && isOperator(peek())) {
-        reportError5(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken, []);
-        return null;
+        reportError8(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken, []);
+        return convertToFunctionDeclaration(parseOperator(commentAndMetadata, modifiers.externalKeyword, returnType));
       } else if (matchesIdentifier() && matchesAny(peek(), [TokenType.OPEN_PAREN, TokenType.OPEN_CURLY_BRACKET, TokenType.FUNCTION])) {
         validateModifiersForTopLevelFunction(modifiers);
         return parseFunctionDeclaration(commentAndMetadata, modifiers.externalKeyword, returnType);
@@ -1718,22 +1897,25 @@
             return new TopLevelVariableDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, parseVariableDeclarationList2(null, validateModifiersForTopLevelVariable(modifiers), null), expect2(TokenType.SEMICOLON));
           }
         }
-        reportError5(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
+        reportError8(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
         return null;
       }
     } else if ((matches(Keyword.GET) || matches(Keyword.SET)) && matchesIdentifier2(peek())) {
       validateModifiersForTopLevelFunction(modifiers);
       return parseFunctionDeclaration(commentAndMetadata, modifiers.externalKeyword, null);
     } else if (matches(Keyword.OPERATOR) && isOperator(peek())) {
-      reportError5(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken, []);
-      return null;
+      reportError8(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken, []);
+      return convertToFunctionDeclaration(parseOperator(commentAndMetadata, modifiers.externalKeyword, null));
     } else if (!matchesIdentifier()) {
-      reportError5(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
+      reportError8(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
       return null;
     } else if (matches4(peek(), TokenType.OPEN_PAREN)) {
       validateModifiersForTopLevelFunction(modifiers);
       return parseFunctionDeclaration(commentAndMetadata, modifiers.externalKeyword, null);
     } else if (matchesAny(peek(), [TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) {
+      if (modifiers.constKeyword == null && modifiers.finalKeyword == null && modifiers.varKeyword == null) {
+        reportError7(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, []);
+      }
       return new TopLevelVariableDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, parseVariableDeclarationList2(null, validateModifiersForTopLevelVariable(modifiers), null), expect2(TokenType.SEMICOLON));
     }
     TypeName returnType = parseReturnType();
@@ -1741,10 +1923,10 @@
       validateModifiersForTopLevelFunction(modifiers);
       return parseFunctionDeclaration(commentAndMetadata, modifiers.externalKeyword, returnType);
     } else if (matches(Keyword.OPERATOR) && isOperator(peek())) {
-      reportError5(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken, []);
-      return null;
+      reportError8(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken, []);
+      return convertToFunctionDeclaration(parseOperator(commentAndMetadata, modifiers.externalKeyword, returnType));
     } else if (!matchesIdentifier()) {
-      reportError5(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
+      reportError8(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
       return null;
     }
     if (matchesAny(peek(), [TokenType.OPEN_PAREN, TokenType.FUNCTION, TokenType.OPEN_CURLY_BRACKET])) {
@@ -1753,6 +1935,7 @@
     }
     return new TopLevelVariableDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, parseVariableDeclarationList2(null, validateModifiersForTopLevelVariable(modifiers), returnType), expect2(TokenType.SEMICOLON));
   }
+  
   /**
    * Parse a conditional expression.
    * <pre>
@@ -1772,6 +1955,7 @@
     Expression elseExpression = parseExpressionWithoutCascade();
     return new ConditionalExpression.full(condition, question, thenExpression, colon, elseExpression);
   }
+  
   /**
    * Parse a const expression.
    * <pre>
@@ -1825,13 +2009,24 @@
       redirectedConstructor = parseConstructorName();
       body = new EmptyFunctionBody.full(expect2(TokenType.SEMICOLON));
     } else {
-      body = parseFunctionBody(true, false);
-      if (!bodyAllowed && body is! EmptyFunctionBody) {
-        reportError4(ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY, []);
+      body = parseFunctionBody(true, ParserErrorCode.MISSING_FUNCTION_BODY, false);
+      if (constKeyword != null && factoryKeyword != null) {
+        reportError8(ParserErrorCode.CONST_FACTORY, factoryKeyword, []);
+      } else if (body is EmptyFunctionBody) {
+        if (factoryKeyword != null && externalKeyword == null) {
+          reportError8(ParserErrorCode.FACTORY_WITHOUT_BODY, factoryKeyword, []);
+        }
+      } else {
+        if (constKeyword != null) {
+          reportError(ParserErrorCode.CONST_CONSTRUCTOR_WITH_BODY, body, []);
+        } else if (!bodyAllowed) {
+          reportError(ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY, body, []);
+        }
       }
     }
     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>
@@ -1864,6 +2059,7 @@
     }
     return new ConstructorFieldInitializer.full(keyword, period, fieldName, equals, expression);
   }
+  
   /**
    * Parse the name of a constructor.
    * <pre>
@@ -1882,6 +2078,7 @@
     }
     return new ConstructorName.full(type, period, name);
   }
+  
   /**
    * Parse a continue statement.
    * <pre>
@@ -1893,18 +2090,19 @@
   Statement parseContinueStatement() {
     Token continueKeyword = expect(Keyword.CONTINUE);
     if (!_inLoop && !_inSwitch) {
-      reportError5(ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, continueKeyword, []);
+      reportError8(ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, continueKeyword, []);
     }
     SimpleIdentifier label = null;
     if (matchesIdentifier()) {
       label = parseSimpleIdentifier();
     }
     if (_inSwitch && !_inLoop && label == null) {
-      reportError5(ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE, continueKeyword, []);
+      reportError8(ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE, continueKeyword, []);
     }
     Token semicolon = expect2(TokenType.SEMICOLON);
     return new ContinueStatement.full(continueKeyword, label, semicolon);
   }
+  
   /**
    * Parse a directive.
    * <pre>
@@ -1927,9 +2125,10 @@
     } else if (matches(Keyword.PART)) {
       return parsePartDirective(commentAndMetadata);
     } else {
-      return null;
+      throw new IllegalStateException("parseDirective invoked in an invalid state; currentToken = ${_currentToken}");
     }
   }
+  
   /**
    * Parse a documentation comment.
    * <pre>
@@ -1965,6 +2164,7 @@
     List<CommentReference> references = parseCommentReferences(tokens);
     return Comment.createDocumentationComment2(tokens, references);
   }
+  
   /**
    * Parse a do statement.
    * <pre>
@@ -1989,6 +2189,7 @@
       _inLoop = wasInLoop;
     }
   }
+  
   /**
    * Parse an empty statement.
    * <pre>
@@ -1998,6 +2199,7 @@
    * @return the empty statement that was parsed
    */
   Statement parseEmptyStatement() => new EmptyStatement.full(andAdvance);
+  
   /**
    * Parse an equality expression.
    * <pre>
@@ -2020,6 +2222,7 @@
     }
     return expression;
   }
+  
   /**
    * Parse an export directive.
    * <pre>
@@ -2036,6 +2239,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>
@@ -2071,6 +2275,7 @@
     }
     return expression;
   }
+  
   /**
    * Parse a list of expressions.
    * <pre>
@@ -2087,6 +2292,7 @@
     }
     return expressions;
   }
+  
   /**
    * Parse an expression that does not contain any cascades.
    * <pre>
@@ -2111,6 +2317,7 @@
     }
     return expression;
   }
+  
   /**
    * Parse a class extends clause.
    * <pre>
@@ -2124,6 +2331,7 @@
     TypeName superclass = parseTypeName();
     return new ExtendsClause.full(keyword, superclass);
   }
+  
   /**
    * Parse the 'final', 'const', 'var' or type preceding a variable declaration.
    * <pre>
@@ -2141,7 +2349,7 @@
     TypeName type = null;
     if (matches(Keyword.FINAL) || matches(Keyword.CONST)) {
       keyword = andAdvance;
-      if (matchesIdentifier2(peek()) || matches4(peek(), TokenType.LT) || matches3(peek(), Keyword.THIS)) {
+      if (matchesIdentifier2(peek()) || matches4(peek(), TokenType.LT) || matches3(peek(), Keyword.THIS) || (matches4(peek(), TokenType.PERIOD) && matchesIdentifier2(peek2(2)) && (matchesIdentifier2(peek2(3)) || matches4(peek2(3), TokenType.LT) || matches3(peek2(3), Keyword.THIS)))) {
         type = parseTypeName();
       }
     } else if (matches(Keyword.VAR)) {
@@ -2150,11 +2358,12 @@
       if (matchesIdentifier2(peek()) || matches4(peek(), TokenType.LT) || matches3(peek(), Keyword.THIS) || (matches4(peek(), TokenType.PERIOD) && matchesIdentifier2(peek2(2)) && (matchesIdentifier2(peek2(3)) || matches4(peek2(3), TokenType.LT) || matches3(peek2(3), Keyword.THIS)))) {
         type = parseReturnType();
       } else if (!optional) {
-        reportError4(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, []);
+        reportError7(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, []);
       }
     }
     return new FinalConstVarOrType(keyword, type);
   }
+  
   /**
    * Parse a formal parameter. At most one of {@code isOptional} and {@code isNamed} can be{@code true}.
    * <pre>
@@ -2173,7 +2382,7 @@
       Token seperator = andAdvance;
       Expression defaultValue = parseExpression2();
       if (identical(kind, ParameterKind.NAMED)) {
-        reportError5(ParserErrorCode.WRONG_SEPARATOR_FOR_NAMED_PARAMETER, seperator, []);
+        reportError8(ParserErrorCode.WRONG_SEPARATOR_FOR_NAMED_PARAMETER, seperator, []);
       } else if (identical(kind, ParameterKind.REQUIRED)) {
         reportError(ParserErrorCode.POSITIONAL_PARAMETER_OUTSIDE_GROUP, parameter, []);
       }
@@ -2182,7 +2391,7 @@
       Token seperator = andAdvance;
       Expression defaultValue = parseExpression2();
       if (identical(kind, ParameterKind.POSITIONAL)) {
-        reportError5(ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER, seperator, []);
+        reportError8(ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER, seperator, []);
       } else if (identical(kind, ParameterKind.REQUIRED)) {
         reportError(ParserErrorCode.NAMED_PARAMETER_OUTSIDE_GROUP, parameter, []);
       }
@@ -2192,6 +2401,7 @@
     }
     return parameter;
   }
+  
   /**
    * Parse a list of formal parameters.
    * <pre>
@@ -2235,21 +2445,21 @@
       if (firstParameter) {
         firstParameter = false;
       } else if (!optional(TokenType.COMMA)) {
-        if ((leftParenthesis is BeginToken) && ((leftParenthesis as BeginToken)).endToken != null) {
-          reportError4(ParserErrorCode.EXPECTED_TOKEN, [TokenType.COMMA.lexeme]);
+        if (getEndToken(leftParenthesis) != null) {
+          reportError7(ParserErrorCode.EXPECTED_TOKEN, [TokenType.COMMA.lexeme]);
         } else {
-          reportError5(ParserErrorCode.MISSING_CLOSING_PARENTHESIS, _currentToken.previous, []);
+          reportError8(ParserErrorCode.MISSING_CLOSING_PARENTHESIS, _currentToken.previous, []);
           break;
         }
       }
       initialToken = _currentToken;
       if (matches5(TokenType.OPEN_SQUARE_BRACKET)) {
         if (leftSquareBracket != null && !reportedMuliplePositionalGroups) {
-          reportError4(ParserErrorCode.MULTIPLE_POSITIONAL_PARAMETER_GROUPS, []);
+          reportError7(ParserErrorCode.MULTIPLE_POSITIONAL_PARAMETER_GROUPS, []);
           reportedMuliplePositionalGroups = true;
         }
         if (leftCurlyBracket != null && !reportedMixedGroups) {
-          reportError4(ParserErrorCode.MIXED_PARAMETER_GROUPS, []);
+          reportError7(ParserErrorCode.MIXED_PARAMETER_GROUPS, []);
           reportedMixedGroups = true;
         }
         leftSquareBracket = andAdvance;
@@ -2257,11 +2467,11 @@
         kind = ParameterKind.POSITIONAL;
       } else if (matches5(TokenType.OPEN_CURLY_BRACKET)) {
         if (leftCurlyBracket != null && !reportedMulipleNamedGroups) {
-          reportError4(ParserErrorCode.MULTIPLE_NAMED_PARAMETER_GROUPS, []);
+          reportError7(ParserErrorCode.MULTIPLE_NAMED_PARAMETER_GROUPS, []);
           reportedMulipleNamedGroups = true;
         }
         if (leftSquareBracket != null && !reportedMixedGroups) {
-          reportError4(ParserErrorCode.MIXED_PARAMETER_GROUPS, []);
+          reportError7(ParserErrorCode.MIXED_PARAMETER_GROUPS, []);
           reportedMixedGroups = true;
         }
         leftCurlyBracket = andAdvance;
@@ -2276,11 +2486,11 @@
         currentParameters = normalParameters;
         if (leftSquareBracket == null) {
           if (leftCurlyBracket != null) {
-            reportError4(ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
+            reportError7(ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
             rightCurlyBracket = rightSquareBracket;
             rightSquareBracket = null;
           } else {
-            reportError4(ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, ["["]);
+            reportError7(ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, ["["]);
           }
         }
         kind = ParameterKind.REQUIRED;
@@ -2289,11 +2499,11 @@
         currentParameters = normalParameters;
         if (leftCurlyBracket == null) {
           if (leftSquareBracket != null) {
-            reportError4(ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]);
+            reportError7(ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]);
             rightSquareBracket = rightCurlyBracket;
             rightCurlyBracket = null;
           } else {
-            reportError4(ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, ["{"]);
+            reportError7(ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, ["{"]);
           }
         }
         kind = ParameterKind.REQUIRED;
@@ -2301,10 +2511,10 @@
     } while (!matches5(TokenType.CLOSE_PAREN) && initialToken != _currentToken);
     Token rightParenthesis = expect2(TokenType.CLOSE_PAREN);
     if (leftSquareBracket != null && rightSquareBracket == null) {
-      reportError4(ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]);
+      reportError7(ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]);
     }
     if (leftCurlyBracket != null && rightCurlyBracket == null) {
-      reportError4(ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
+      reportError7(ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
     }
     if (leftSquareBracket == null) {
       leftSquareBracket = leftCurlyBracket;
@@ -2314,6 +2524,7 @@
     }
     return new FormalParameterList.full(leftParenthesis, parameters, leftSquareBracket, rightSquareBracket, rightParenthesis);
   }
+  
   /**
    * Parse a for statement.
    * <pre>
@@ -2352,15 +2563,15 @@
         if (matches(Keyword.IN)) {
           DeclaredIdentifier loopVariable = null;
           if (variableList == null) {
-            reportError4(ParserErrorCode.MISSING_VARIABLE_IN_FOR_EACH, []);
+            reportError7(ParserErrorCode.MISSING_VARIABLE_IN_FOR_EACH, []);
           } else {
             NodeList<VariableDeclaration> variables2 = variableList.variables;
             if (variables2.length > 1) {
-              reportError4(ParserErrorCode.MULTIPLE_VARIABLES_IN_FOR_EACH, [variables2.length.toString()]);
+              reportError7(ParserErrorCode.MULTIPLE_VARIABLES_IN_FOR_EACH, [variables2.length.toString()]);
             }
             VariableDeclaration variable = variables2[0];
             if (variable.initializer != null) {
-              reportError4(ParserErrorCode.INITIALIZED_VARIABLE_IN_FOR_EACH, []);
+              reportError7(ParserErrorCode.INITIALIZED_VARIABLE_IN_FOR_EACH, []);
             }
             loopVariable = new DeclaredIdentifier.full(commentAndMetadata.comment, commentAndMetadata.metadata, variableList.keyword, variableList.type, variable.name);
           }
@@ -2388,6 +2599,7 @@
       _inLoop = wasInLoop;
     }
   }
+  
   /**
    * Parse a function body.
    * <pre>
@@ -2399,11 +2611,12 @@
    * | block
    * </pre>
    * @param mayBeEmpty {@code true} if the function body is allowed to be empty
+   * @param emptyErrorCode the error code to report if function body expecte, but not found
    * @param inExpression {@code true} if the function body is being parsed as part of an expression
    * and therefore does not have a terminating semicolon
    * @return the function body that was parsed
    */
-  FunctionBody parseFunctionBody(bool mayBeEmpty, bool inExpression) {
+  FunctionBody parseFunctionBody(bool mayBeEmpty, ParserErrorCode emptyErrorCode, bool inExpression) {
     bool wasInLoop = _inLoop;
     bool wasInSwitch = _inSwitch;
     _inLoop = false;
@@ -2411,7 +2624,7 @@
     try {
       if (matches5(TokenType.SEMICOLON)) {
         if (!mayBeEmpty) {
-          reportError4(ParserErrorCode.MISSING_FUNCTION_BODY, []);
+          reportError7(emptyErrorCode, []);
         }
         return new EmptyFunctionBody.full(andAdvance);
       } else if (matches5(TokenType.FUNCTION)) {
@@ -2432,7 +2645,7 @@
         }
         return new NativeFunctionBody.full(nativeToken, stringLiteral, expect2(TokenType.SEMICOLON));
       } else {
-        reportError4(ParserErrorCode.MISSING_FUNCTION_BODY, []);
+        reportError7(emptyErrorCode, []);
         return new EmptyFunctionBody.full(createSyntheticToken2(TokenType.SEMICOLON));
       }
     } finally {
@@ -2440,6 +2653,7 @@
       _inSwitch = wasInSwitch;
     }
   }
+  
   /**
    * Parse a function declaration.
    * <pre>
@@ -2470,20 +2684,21 @@
         parameters = parseFormalParameterList();
         validateFormalParameterList(parameters);
       } else {
-        reportError4(ParserErrorCode.MISSING_FUNCTION_PARAMETERS, []);
+        reportError7(ParserErrorCode.MISSING_FUNCTION_PARAMETERS, []);
       }
     } else if (matches5(TokenType.OPEN_PAREN)) {
-      reportError4(ParserErrorCode.GETTER_WITH_PARAMETERS, []);
+      reportError7(ParserErrorCode.GETTER_WITH_PARAMETERS, []);
       parseFormalParameterList();
     }
     FunctionBody body;
     if (externalKeyword == null) {
-      body = parseFunctionBody(false, false);
+      body = parseFunctionBody(false, ParserErrorCode.MISSING_FUNCTION_BODY, false);
     } else {
       body = new EmptyFunctionBody.full(expect2(TokenType.SEMICOLON));
     }
     return new FunctionDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, externalKeyword, returnType, keyword, name, new FunctionExpression.full(parameters, body));
   }
+  
   /**
    * Parse a function declaration statement.
    * <pre>
@@ -2493,6 +2708,7 @@
    * @return the function declaration statement that was parsed
    */
   Statement parseFunctionDeclarationStatement() => parseFunctionDeclarationStatement2(parseCommentAndMetadata(), parseOptionalReturnType());
+  
   /**
    * Parse a function declaration statement.
    * <pre>
@@ -2505,6 +2721,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>
@@ -2516,9 +2733,10 @@
   FunctionExpression parseFunctionExpression() {
     FormalParameterList parameters = parseFormalParameterList();
     validateFormalParameterList(parameters);
-    FunctionBody body = parseFunctionBody(false, true);
+    FunctionBody body = parseFunctionBody(false, ParserErrorCode.MISSING_FUNCTION_BODY, true);
     return new FunctionExpression.full(parameters, body);
   }
+  
   /**
    * Parse a function type alias.
    * <pre>
@@ -2542,19 +2760,20 @@
       typeParameters = parseTypeParameterList();
     }
     if (matches5(TokenType.SEMICOLON) || matches5(TokenType.EOF)) {
-      reportError4(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS, []);
+      reportError7(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS, []);
       FormalParameterList parameters = new FormalParameterList.full(createSyntheticToken2(TokenType.OPEN_PAREN), null, null, null, createSyntheticToken2(TokenType.CLOSE_PAREN));
       Token semicolon = expect2(TokenType.SEMICOLON);
       return new FunctionTypeAlias.full(commentAndMetadata.comment, commentAndMetadata.metadata, keyword, returnType, name, typeParameters, parameters, semicolon);
     } else if (!matches5(TokenType.OPEN_PAREN)) {
-      reportError4(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS, []);
-      return null;
+      reportError7(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS, []);
+      return new FunctionTypeAlias.full(commentAndMetadata.comment, commentAndMetadata.metadata, keyword, returnType, name, typeParameters, new FormalParameterList.full(createSyntheticToken2(TokenType.OPEN_PAREN), null, null, null, createSyntheticToken2(TokenType.CLOSE_PAREN)), createSyntheticToken2(TokenType.SEMICOLON));
     }
     FormalParameterList parameters = parseFormalParameterList();
     validateFormalParameterList(parameters);
     Token semicolon = expect2(TokenType.SEMICOLON);
     return new FunctionTypeAlias.full(commentAndMetadata.comment, commentAndMetadata.metadata, keyword, returnType, name, typeParameters, parameters, semicolon);
   }
+  
   /**
    * Parse a getter.
    * <pre>
@@ -2575,16 +2794,17 @@
     Token propertyKeyword = expect(Keyword.GET);
     SimpleIdentifier name = parseSimpleIdentifier();
     if (matches5(TokenType.OPEN_PAREN) && matches4(peek(), TokenType.CLOSE_PAREN)) {
-      reportError4(ParserErrorCode.GETTER_WITH_PARAMETERS, []);
+      reportError7(ParserErrorCode.GETTER_WITH_PARAMETERS, []);
       advance();
       advance();
     }
-    FunctionBody body = parseFunctionBody(true, false);
+    FunctionBody body = parseFunctionBody(externalKeyword != null || staticKeyword == null, ParserErrorCode.STATIC_GETTER_WITHOUT_BODY, false);
     if (externalKeyword != null && body is! EmptyFunctionBody) {
-      reportError4(ParserErrorCode.EXTERNAL_GETTER_WITH_BODY, []);
+      reportError7(ParserErrorCode.EXTERNAL_GETTER_WITH_BODY, []);
     }
     return new MethodDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, externalKeyword, staticKeyword, returnType, propertyKeyword, null, name, null, body);
   }
+  
   /**
    * Parse a list of identifiers.
    * <pre>
@@ -2602,6 +2822,7 @@
     }
     return identifiers;
   }
+  
   /**
    * Parse an if statement.
    * <pre>
@@ -2624,6 +2845,7 @@
     }
     return new IfStatement.full(ifKeyword, leftParenthesis, condition, rightParenthesis, thenStatement, elseKeyword, elseStatement);
   }
+  
   /**
    * Parse an implements clause.
    * <pre>
@@ -2641,6 +2863,7 @@
     }
     return new ImplementsClause.full(keyword, interfaces);
   }
+  
   /**
    * Parse an import directive.
    * <pre>
@@ -2663,6 +2886,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>
@@ -2686,6 +2910,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>
@@ -2700,6 +2925,7 @@
     ArgumentList argumentList = parseArgumentList();
     return new InstanceCreationExpression.full(keyword, constructorName, argumentList);
   }
+  
   /**
    * Parse a library directive.
    * <pre>
@@ -2715,6 +2941,7 @@
     Token semicolon = expect2(TokenType.SEMICOLON);
     return new LibraryDirective.full(commentAndMetadata.comment, commentAndMetadata.metadata, keyword, libraryName, semicolon);
   }
+  
   /**
    * Parse a library identifier.
    * <pre>
@@ -2732,6 +2959,7 @@
     }
     return new LibraryIdentifier.full(components);
   }
+  
   /**
    * Parse a library name.
    * <pre>
@@ -2750,12 +2978,13 @@
       StringLiteral string = parseStringLiteral();
       reportError(ParserErrorCode.NON_IDENTIFIER_LIBRARY_NAME, string, []);
     } else {
-      reportError5(missingNameError, missingNameToken, []);
+      reportError8(missingNameError, missingNameToken, []);
     }
     List<SimpleIdentifier> components = new List<SimpleIdentifier>();
     components.add(createSyntheticIdentifier());
     return new LibraryIdentifier.full(components);
   }
+  
   /**
    * Parse a list literal.
    * <pre>
@@ -2794,6 +3023,7 @@
     Token rightBracket = expect2(TokenType.CLOSE_SQUARE_BRACKET);
     return new ListLiteral.full(modifier, typeArguments, leftBracket, elements, rightBracket);
   }
+  
   /**
    * Parse a list or map literal.
    * <pre>
@@ -2815,9 +3045,10 @@
     } else if (matches5(TokenType.OPEN_SQUARE_BRACKET) || matches5(TokenType.INDEX)) {
       return parseListLiteral(modifier, typeArguments);
     }
-    reportError4(ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL, []);
+    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>
@@ -2834,6 +3065,7 @@
     }
     return expression;
   }
+  
   /**
    * Parse a logical or expression.
    * <pre>
@@ -2850,6 +3082,7 @@
     }
     return expression;
   }
+  
   /**
    * Parse a map literal.
    * <pre>
@@ -2863,6 +3096,12 @@
    * @return the map literal that was parsed
    */
   MapLiteral parseMapLiteral(Token modifier, TypeArgumentList typeArguments) {
+    if (typeArguments != null) {
+      int num = typeArguments.arguments.length;
+      if (num != 2) {
+        reportError(ParserErrorCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS, typeArguments, [num]);
+      }
+    }
     Token leftBracket = expect2(TokenType.OPEN_CURLY_BRACKET);
     List<MapLiteralEntry> entries = new List<MapLiteralEntry>();
     if (matches5(TokenType.CLOSE_CURLY_BRACKET)) {
@@ -2878,20 +3117,22 @@
     Token rightBracket = expect2(TokenType.CLOSE_CURLY_BRACKET);
     return new MapLiteral.full(modifier, typeArguments, leftBracket, entries, rightBracket);
   }
+  
   /**
    * Parse a map literal entry.
    * <pre>
    * mapLiteralEntry ::=
-   * stringLiteral ':' expression
+   * expression ':' expression
    * </pre>
    * @return the map literal entry that was parsed
    */
   MapLiteralEntry parseMapLiteralEntry() {
-    StringLiteral key = parseStringLiteral();
+    Expression key = parseExpression2();
     Token separator = expect2(TokenType.COLON);
     Expression value = parseExpression2();
     return new MapLiteralEntry.full(key, separator, value);
   }
+  
   /**
    * Parse a method declaration.
    * <pre>
@@ -2912,6 +3153,7 @@
     validateFormalParameterList(parameters);
     return parseMethodDeclaration2(commentAndMetadata, externalKeyword, staticKeyword, returnType, methodName, parameters);
   }
+  
   /**
    * Parse a method declaration.
    * <pre>
@@ -2929,7 +3171,7 @@
    * @return the method declaration that was parsed
    */
   MethodDeclaration parseMethodDeclaration2(CommentAndMetadata commentAndMetadata, Token externalKeyword, Token staticKeyword, TypeName returnType, SimpleIdentifier name, FormalParameterList parameters) {
-    FunctionBody body = parseFunctionBody(externalKeyword != null || staticKeyword == null, false);
+    FunctionBody body = parseFunctionBody(externalKeyword != null || staticKeyword == null, ParserErrorCode.MISSING_FUNCTION_BODY, false);
     if (externalKeyword != null) {
       if (body is! EmptyFunctionBody) {
         reportError(ParserErrorCode.EXTERNAL_METHOD_WITH_BODY, body, []);
@@ -2941,6 +3183,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
@@ -2958,49 +3201,49 @@
     while (progress) {
       if (matches(Keyword.ABSTRACT) && !matches4(peek(), TokenType.PERIOD) && !matches4(peek(), TokenType.LT)) {
         if (modifiers.abstractKeyword != null) {
-          reportError4(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          reportError7(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
           advance();
         } else {
           modifiers.abstractKeyword = andAdvance;
         }
       } else if (matches(Keyword.CONST)) {
         if (modifiers.constKeyword != null) {
-          reportError4(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          reportError7(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
           advance();
         } else {
           modifiers.constKeyword = andAdvance;
         }
       } else if (matches(Keyword.EXTERNAL) && !matches4(peek(), TokenType.PERIOD) && !matches4(peek(), TokenType.LT)) {
         if (modifiers.externalKeyword != null) {
-          reportError4(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          reportError7(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
           advance();
         } else {
           modifiers.externalKeyword = andAdvance;
         }
       } else if (matches(Keyword.FACTORY) && !matches4(peek(), TokenType.PERIOD) && !matches4(peek(), TokenType.LT)) {
         if (modifiers.factoryKeyword != null) {
-          reportError4(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          reportError7(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
           advance();
         } else {
           modifiers.factoryKeyword = andAdvance;
         }
       } else if (matches(Keyword.FINAL)) {
         if (modifiers.finalKeyword != null) {
-          reportError4(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          reportError7(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
           advance();
         } else {
           modifiers.finalKeyword = andAdvance;
         }
       } else if (matches(Keyword.STATIC) && !matches4(peek(), TokenType.PERIOD) && !matches4(peek(), TokenType.LT)) {
         if (modifiers.staticKeyword != null) {
-          reportError4(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          reportError7(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
           advance();
         } else {
           modifiers.staticKeyword = andAdvance;
         }
       } else if (matches(Keyword.VAR)) {
         if (modifiers.varKeyword != null) {
-          reportError4(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          reportError7(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
           advance();
         } else {
           modifiers.varKeyword = andAdvance;
@@ -3011,6 +3254,7 @@
     }
     return modifiers;
   }
+  
   /**
    * Parse a multiplicative expression.
    * <pre>
@@ -3033,6 +3277,7 @@
     }
     return expression;
   }
+  
   /**
    * Parse a new expression.
    * <pre>
@@ -3042,6 +3287,7 @@
    * @return the new expression that was parsed
    */
   InstanceCreationExpression parseNewExpression() => parseInstanceCreationExpression(expect(Keyword.NEW));
+  
   /**
    * Parse a non-labeled statement.
    * <pre>
@@ -3114,8 +3360,8 @@
           } else if (matches5(TokenType.CLOSE_CURLY_BRACKET)) {
             return parseVariableDeclarationStatement2(commentAndMetadata, null, returnType);
           }
-          reportError4(ParserErrorCode.MISSING_STATEMENT, []);
-          return null;
+          reportError7(ParserErrorCode.MISSING_STATEMENT, []);
+          return new EmptyStatement.full(createSyntheticToken2(TokenType.SEMICOLON));
         }
       } else if (identical(keyword2, Keyword.CONST)) {
         if (matchesAny(peek(), [TokenType.LT, TokenType.OPEN_CURLY_BRACKET, TokenType.OPEN_SQUARE_BRACKET, TokenType.INDEX])) {
@@ -3132,8 +3378,8 @@
       } else if (identical(keyword2, Keyword.NEW) || identical(keyword2, Keyword.TRUE) || identical(keyword2, Keyword.FALSE) || identical(keyword2, Keyword.NULL) || identical(keyword2, Keyword.SUPER) || identical(keyword2, Keyword.THIS)) {
         return new ExpressionStatement.full(parseExpression2(), expect2(TokenType.SEMICOLON));
       } else {
-        reportError4(ParserErrorCode.MISSING_STATEMENT, []);
-        return null;
+        reportError7(ParserErrorCode.MISSING_STATEMENT, []);
+        return new EmptyStatement.full(createSyntheticToken2(TokenType.SEMICOLON));
       }
     } else if (matches5(TokenType.SEMICOLON)) {
       return parseEmptyStatement();
@@ -3142,12 +3388,13 @@
     } else if (isFunctionDeclaration()) {
       return parseFunctionDeclarationStatement();
     } else if (matches5(TokenType.CLOSE_CURLY_BRACKET)) {
-      reportError4(ParserErrorCode.MISSING_STATEMENT, []);
+      reportError7(ParserErrorCode.MISSING_STATEMENT, []);
       return new EmptyStatement.full(createSyntheticToken2(TokenType.SEMICOLON));
     } else {
       return new ExpressionStatement.full(parseExpression2(), expect2(TokenType.SEMICOLON));
     }
   }
+  
   /**
    * Parse a normal formal parameter.
    * <pre>
@@ -3183,13 +3430,14 @@
     }
     TypeName type2 = holder.type;
     if (type2 != null && matches3(type2.name.beginToken, Keyword.VOID)) {
-      reportError5(ParserErrorCode.VOID_PARAMETER, type2.name.beginToken, []);
+      reportError8(ParserErrorCode.VOID_PARAMETER, type2.name.beginToken, []);
     }
     if (thisKeyword != null) {
       return new FieldFormalParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, holder.keyword, holder.type, thisKeyword, period, identifier);
     }
     return new SimpleFormalParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, holder.keyword, holder.type, identifier);
   }
+  
   /**
    * Parse an operator declaration.
    * <pre>
@@ -3210,28 +3458,29 @@
     if (matches(Keyword.OPERATOR)) {
       operatorKeyword = andAdvance;
     } else {
-      reportError5(ParserErrorCode.MISSING_KEYWORD_OPERATOR, _currentToken, []);
+      reportError8(ParserErrorCode.MISSING_KEYWORD_OPERATOR, _currentToken, []);
       operatorKeyword = createSyntheticToken(Keyword.OPERATOR);
     }
     if (!_currentToken.isUserDefinableOperator()) {
-      reportError4(ParserErrorCode.NON_USER_DEFINABLE_OPERATOR, [_currentToken.lexeme]);
+      reportError7(ParserErrorCode.NON_USER_DEFINABLE_OPERATOR, [_currentToken.lexeme]);
     }
     SimpleIdentifier name = new SimpleIdentifier.full(andAdvance);
     if (matches5(TokenType.EQ)) {
       Token previous2 = _currentToken.previous;
       if ((matches4(previous2, TokenType.EQ_EQ) || matches4(previous2, TokenType.BANG_EQ)) && _currentToken.offset == previous2.offset + 2) {
-        reportError4(ParserErrorCode.INVALID_OPERATOR, ["${previous2.lexeme}${_currentToken.lexeme}"]);
+        reportError7(ParserErrorCode.INVALID_OPERATOR, ["${previous2.lexeme}${_currentToken.lexeme}"]);
         advance();
       }
     }
     FormalParameterList parameters = parseFormalParameterList();
     validateFormalParameterList(parameters);
-    FunctionBody body = parseFunctionBody(true, false);
+    FunctionBody body = parseFunctionBody(true, ParserErrorCode.MISSING_FUNCTION_BODY, false);
     if (externalKeyword != null && body is! EmptyFunctionBody) {
-      reportError4(ParserErrorCode.EXTERNAL_OPERATOR_WITH_BODY, []);
+      reportError7(ParserErrorCode.EXTERNAL_OPERATOR_WITH_BODY, []);
     }
     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
@@ -3246,6 +3495,7 @@
     }
     return null;
   }
+  
   /**
    * Parse a part or part-of directive.
    * <pre>
@@ -3269,6 +3519,7 @@
     Token semicolon = expect2(TokenType.SEMICOLON);
     return new PartDirective.full(commentAndMetadata.comment, commentAndMetadata.metadata, partKeyword, partUri, semicolon);
   }
+  
   /**
    * Parse a postfix expression.
    * <pre>
@@ -3303,11 +3554,12 @@
       return operand;
     }
     if (operand is FunctionExpressionInvocation) {
-      reportError4(ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR, []);
+      reportError7(ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR, []);
     }
     Token operator = andAdvance;
     return new PostfixExpression.full(operand, operator);
   }
+  
   /**
    * Parse a prefixed identifier.
    * <pre>
@@ -3325,6 +3577,7 @@
     SimpleIdentifier qualified = parseSimpleIdentifier();
     return new PrefixedIdentifier.full(qualifier, period, qualified);
   }
+  
   /**
    * Parse a primary expression.
    * <pre>
@@ -3408,13 +3661,15 @@
     } else if (matches5(TokenType.QUESTION)) {
       return parseArgumentDefinitionTest();
     } else if (matches(Keyword.VOID)) {
-      reportError4(ParserErrorCode.UNEXPECTED_TOKEN, [_currentToken.lexeme]);
+      reportError7(ParserErrorCode.UNEXPECTED_TOKEN, [_currentToken.lexeme]);
       advance();
       return parsePrimaryExpression();
     } else {
+      reportError7(ParserErrorCode.MISSING_IDENTIFIER, []);
       return createSyntheticIdentifier();
     }
   }
+  
   /**
    * Parse a redirecting constructor invocation.
    * <pre>
@@ -3434,6 +3689,7 @@
     ArgumentList argumentList = parseArgumentList();
     return new RedirectingConstructorInvocation.full(keyword, period, constructorName, argumentList);
   }
+  
   /**
    * Parse a relational expression.
    * <pre>
@@ -3467,6 +3723,7 @@
     }
     return expression;
   }
+  
   /**
    * Parse a rethrow expression.
    * <pre>
@@ -3476,6 +3733,7 @@
    * @return the rethrow expression that was parsed
    */
   Expression parseRethrowExpression() => new RethrowExpression.full(expect(Keyword.RETHROW));
+  
   /**
    * Parse a return statement.
    * <pre>
@@ -3493,6 +3751,7 @@
     Token semicolon = expect2(TokenType.SEMICOLON);
     return new ReturnStatement.full(returnKeyword, expression, semicolon);
   }
+  
   /**
    * Parse a return type.
    * <pre>
@@ -3509,6 +3768,7 @@
       return parseTypeName();
     }
   }
+  
   /**
    * Parse a setter.
    * <pre>
@@ -3530,12 +3790,13 @@
     SimpleIdentifier name = parseSimpleIdentifier();
     FormalParameterList parameters = parseFormalParameterList();
     validateFormalParameterList(parameters);
-    FunctionBody body = parseFunctionBody(true, false);
+    FunctionBody body = parseFunctionBody(externalKeyword != null || staticKeyword == null, ParserErrorCode.STATIC_SETTER_WITHOUT_BODY, false);
     if (externalKeyword != null && body is! EmptyFunctionBody) {
-      reportError4(ParserErrorCode.EXTERNAL_SETTER_WITH_BODY, []);
+      reportError7(ParserErrorCode.EXTERNAL_SETTER_WITH_BODY, []);
     }
     return new MethodDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, externalKeyword, staticKeyword, returnType, propertyKeyword, null, name, parameters, body);
   }
+  
   /**
    * Parse a shift expression.
    * <pre>
@@ -3558,6 +3819,7 @@
     }
     return expression;
   }
+  
   /**
    * Parse a simple identifier.
    * <pre>
@@ -3570,9 +3832,10 @@
     if (matchesIdentifier()) {
       return new SimpleIdentifier.full(andAdvance);
     }
-    reportError4(ParserErrorCode.MISSING_IDENTIFIER, []);
+    reportError7(ParserErrorCode.MISSING_IDENTIFIER, []);
     return createSyntheticIdentifier();
   }
+  
   /**
    * Parse a statement.
    * <pre>
@@ -3594,6 +3857,7 @@
     }
     return new LabeledStatement.full(labels, statement);
   }
+  
   /**
    * Parse a list of statements within a switch statement.
    * <pre>
@@ -3608,13 +3872,14 @@
     while (!matches5(TokenType.EOF) && !matches5(TokenType.CLOSE_CURLY_BRACKET) && !isSwitchMember()) {
       statements.add(parseStatement2());
       if (identical(_currentToken, statementStart)) {
-        reportError5(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        reportError8(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
         advance();
       }
       statementStart = _currentToken;
     }
     return statements;
   }
+  
   /**
    * Parse a string literal that contains interpolations.
    * @return the string literal that was parsed
@@ -3645,6 +3910,7 @@
     }
     return new StringInterpolation.full(elements);
   }
+  
   /**
    * Parse a string literal.
    * <pre>
@@ -3665,7 +3931,7 @@
       }
     }
     if (strings.length < 1) {
-      reportError4(ParserErrorCode.EXPECTED_STRING_LITERAL, []);
+      reportError7(ParserErrorCode.EXPECTED_STRING_LITERAL, []);
       return createSyntheticStringLiteral();
     } else if (strings.length == 1) {
       return strings[0];
@@ -3673,6 +3939,7 @@
       return new AdjacentStrings.full(strings);
     }
   }
+  
   /**
    * Parse a super constructor invocation.
    * <pre>
@@ -3692,6 +3959,7 @@
     ArgumentList argumentList = parseArgumentList();
     return new SuperConstructorInvocation.full(keyword, period, constructorName, argumentList);
   }
+  
   /**
    * Parse a switch statement.
    * <pre>
@@ -3722,7 +3990,7 @@
           SimpleIdentifier identifier = parseSimpleIdentifier();
           String label = identifier.token.lexeme;
           if (definedLabels.contains(label)) {
-            reportError5(ParserErrorCode.DUPLICATE_LABEL_IN_SWITCH_STATEMENT, identifier.token, [label]);
+            reportError8(ParserErrorCode.DUPLICATE_LABEL_IN_SWITCH_STATEMENT, identifier.token, [label]);
           } else {
             javaSetAdd(definedLabels, label);
           }
@@ -3735,17 +4003,17 @@
           Token colon = expect2(TokenType.COLON);
           members.add(new SwitchCase.full(labels, caseKeyword, caseExpression, colon, parseStatements2()));
           if (defaultKeyword != null) {
-            reportError5(ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE, caseKeyword, []);
+            reportError8(ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE, caseKeyword, []);
           }
         } else if (matches(Keyword.DEFAULT)) {
           if (defaultKeyword != null) {
-            reportError5(ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES, peek(), []);
+            reportError8(ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES, peek(), []);
           }
           defaultKeyword = andAdvance;
           Token colon = expect2(TokenType.COLON);
           members.add(new SwitchDefault.full(labels, defaultKeyword, colon, parseStatements2()));
         } else {
-          reportError4(ParserErrorCode.EXPECTED_CASE_OR_DEFAULT, []);
+          reportError7(ParserErrorCode.EXPECTED_CASE_OR_DEFAULT, []);
           while (!matches5(TokenType.EOF) && !matches5(TokenType.CLOSE_CURLY_BRACKET) && !matches(Keyword.CASE) && !matches(Keyword.DEFAULT)) {
             advance();
           }
@@ -3757,6 +4025,7 @@
       _inSwitch = wasInSwitch;
     }
   }
+  
   /**
    * Parse a throw expression.
    * <pre>
@@ -3768,11 +4037,13 @@
   Expression parseThrowExpression() {
     Token keyword = expect(Keyword.THROW);
     if (matches5(TokenType.SEMICOLON) || matches5(TokenType.CLOSE_PAREN)) {
-      return new ThrowExpression.full(keyword, null);
+      reportError8(ParserErrorCode.MISSING_EXPRESSION_IN_THROW, _currentToken, []);
+      return new ThrowExpression.full(keyword, createSyntheticIdentifier());
     }
     Expression expression = parseExpression2();
     return new ThrowExpression.full(keyword, expression);
   }
+  
   /**
    * Parse a throw expression.
    * <pre>
@@ -3784,11 +4055,13 @@
   Expression parseThrowExpressionWithoutCascade() {
     Token keyword = expect(Keyword.THROW);
     if (matches5(TokenType.SEMICOLON) || matches5(TokenType.CLOSE_PAREN)) {
-      return new ThrowExpression.full(keyword, null);
+      reportError8(ParserErrorCode.MISSING_EXPRESSION_IN_THROW, _currentToken, []);
+      return new ThrowExpression.full(keyword, createSyntheticIdentifier());
     }
     Expression expression = parseExpressionWithoutCascade();
     return new ThrowExpression.full(keyword, expression);
   }
+  
   /**
    * Parse a try statement.
    * <pre>
@@ -3841,11 +4114,12 @@
       finallyClause = parseBlock();
     } else {
       if (catchClauses.isEmpty) {
-        reportError4(ParserErrorCode.MISSING_CATCH_OR_FINALLY, []);
+        reportError7(ParserErrorCode.MISSING_CATCH_OR_FINALLY, []);
       }
     }
     return new TryStatement.full(tryKeyword, body, catchClauses, finallyKeyword, finallyClause);
   }
+  
   /**
    * Parse a type alias.
    * <pre>
@@ -3881,6 +4155,7 @@
     }
     return parseFunctionTypeAlias(commentAndMetadata, keyword);
   }
+  
   /**
    * Parse a list of type arguments.
    * <pre>
@@ -3901,6 +4176,7 @@
     Token rightBracket = expect2(TokenType.GT);
     return new TypeArgumentList.full(leftBracket, arguments, rightBracket);
   }
+  
   /**
    * Parse a type name.
    * <pre>
@@ -3910,13 +4186,23 @@
    * @return the type name that was parsed
    */
   TypeName parseTypeName() {
-    Identifier typeName = parsePrefixedIdentifier();
+    Identifier typeName;
+    if (matches(Keyword.VAR)) {
+      reportError7(ParserErrorCode.VAR_AS_TYPE_NAME, []);
+      typeName = new SimpleIdentifier.full(andAdvance);
+    } else if (matchesIdentifier()) {
+      typeName = parsePrefixedIdentifier();
+    } else {
+      typeName = createSyntheticIdentifier();
+      reportError7(ParserErrorCode.EXPECTED_TYPE_NAME, []);
+    }
     TypeArgumentList typeArguments = null;
     if (matches5(TokenType.LT)) {
       typeArguments = parseTypeArgumentList();
     }
     return new TypeName.full(typeName, typeArguments);
   }
+  
   /**
    * Parse a type parameter.
    * <pre>
@@ -3935,6 +4221,7 @@
     }
     return new TypeParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, name, null, null);
   }
+  
   /**
    * Parse a list of type parameters.
    * <pre>
@@ -3953,6 +4240,7 @@
     Token rightBracket = expect2(TokenType.GT);
     return new TypeParameterList.full(leftBracket, typeParameters, rightBracket);
   }
+  
   /**
    * Parse a unary expression.
    * <pre>
@@ -3990,16 +4278,18 @@
           operator.previous.setNext(firstOperator);
           return new PrefixExpression.full(firstOperator, new PrefixExpression.full(secondOperator, new SuperExpression.full(andAdvance)));
         } else {
-          reportError4(ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, [operator.lexeme]);
+          reportError7(ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, [operator.lexeme]);
           return new PrefixExpression.full(operator, new SuperExpression.full(andAdvance));
         }
       }
       return new PrefixExpression.full(operator, parseAssignableExpression(false));
     } else if (matches5(TokenType.PLUS)) {
-      reportError4(ParserErrorCode.USE_OF_UNARY_PLUS_OPERATOR, []);
+      reportError7(ParserErrorCode.MISSING_IDENTIFIER, []);
+      return createSyntheticIdentifier();
     }
     return parsePostfixExpression();
   }
+  
   /**
    * Parse a variable declaration.
    * <pre>
@@ -4019,6 +4309,7 @@
     }
     return new VariableDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, name, equals, initializer);
   }
+  
   /**
    * Parse a variable declaration list.
    * <pre>
@@ -4032,6 +4323,7 @@
     FinalConstVarOrType holder = parseFinalConstVarOrType(false);
     return parseVariableDeclarationList2(commentAndMetadata, holder.keyword, holder.type);
   }
+  
   /**
    * Parse a variable declaration list.
    * <pre>
@@ -4053,6 +4345,7 @@
     }
     return new VariableDeclarationList.full(commentAndMetadata != null ? commentAndMetadata.comment : null, commentAndMetadata != null ? commentAndMetadata.metadata : null, keyword, type, variables);
   }
+  
   /**
    * Parse a variable declaration statement.
    * <pre>
@@ -4068,6 +4361,7 @@
     Token semicolon = expect2(TokenType.SEMICOLON);
     return new VariableDeclarationStatement.full(variableList, semicolon);
   }
+  
   /**
    * Parse a variable declaration statement.
    * <pre>
@@ -4086,6 +4380,7 @@
     Token semicolon = expect2(TokenType.SEMICOLON);
     return new VariableDeclarationStatement.full(variableList, semicolon);
   }
+  
   /**
    * Parse a while statement.
    * <pre>
@@ -4108,6 +4403,7 @@
       _inLoop = wasInLoop;
     }
   }
+  
   /**
    * Parse a with clause.
    * <pre>
@@ -4125,11 +4421,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.
@@ -4142,6 +4440,7 @@
     }
     return token;
   }
+  
   /**
    * Report an error with the given error code and arguments.
    * @param errorCode the error code of the error to be reported
@@ -4151,23 +4450,26 @@
   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
    * @param arguments the arguments to the error, used to compose the error message
    */
-  void reportError4(ParserErrorCode errorCode, List<Object> arguments) {
-    reportError5(errorCode, _currentToken, arguments);
+  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
    * @param token the token specifying the location of the error
    * @param arguments the arguments to the error, used to compose the error message
    */
-  void reportError5(ParserErrorCode errorCode, Token token, List<Object> arguments) {
+  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
@@ -4199,6 +4501,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
@@ -4256,6 +4559,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}.
@@ -4272,6 +4576,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
@@ -4295,6 +4600,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.
@@ -4315,6 +4621,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
@@ -4335,6 +4642,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
@@ -4387,6 +4695,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,
@@ -4415,6 +4724,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,
@@ -4454,6 +4764,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.
@@ -4476,6 +4787,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
@@ -4526,6 +4838,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.
@@ -4560,13 +4873,13 @@
       builder.appendChar(0xB);
     } else if (currentChar == 0x78) {
       if (currentIndex + 2 >= length2) {
-        reportError4(ParserErrorCode.INVALID_HEX_ESCAPE, []);
+        reportError7(ParserErrorCode.INVALID_HEX_ESCAPE, []);
         return length2;
       }
       int firstDigit = lexeme.codeUnitAt(currentIndex + 1);
       int secondDigit = lexeme.codeUnitAt(currentIndex + 2);
       if (!isHexDigit(firstDigit) || !isHexDigit(secondDigit)) {
-        reportError4(ParserErrorCode.INVALID_HEX_ESCAPE, []);
+        reportError7(ParserErrorCode.INVALID_HEX_ESCAPE, []);
       } else {
         builder.appendChar((((Character.digit(firstDigit, 16) << 4) + Character.digit(secondDigit, 16)) as int));
       }
@@ -4574,14 +4887,14 @@
     } else if (currentChar == 0x75) {
       currentIndex++;
       if (currentIndex >= length2) {
-        reportError4(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+        reportError7(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
         return length2;
       }
       currentChar = lexeme.codeUnitAt(currentIndex);
       if (currentChar == 0x7B) {
         currentIndex++;
         if (currentIndex >= length2) {
-          reportError4(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+          reportError7(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
           return length2;
         }
         currentChar = lexeme.codeUnitAt(currentIndex);
@@ -4589,7 +4902,7 @@
         int value = 0;
         while (currentChar != 0x7D) {
           if (!isHexDigit(currentChar)) {
-            reportError4(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+            reportError7(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
             currentIndex++;
             while (currentIndex < length2 && lexeme.codeUnitAt(currentIndex) != 0x7D) {
               currentIndex++;
@@ -4600,19 +4913,19 @@
           value = (value << 4) + Character.digit(currentChar, 16);
           currentIndex++;
           if (currentIndex >= length2) {
-            reportError4(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+            reportError7(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
             return length2;
           }
           currentChar = lexeme.codeUnitAt(currentIndex);
         }
         if (digitCount < 1 || digitCount > 6) {
-          reportError4(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+          reportError7(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
         }
         appendScalarValue(builder, lexeme.substring(index, currentIndex + 1), value, index, currentIndex);
         return currentIndex + 1;
       } else {
         if (currentIndex + 3 >= length2) {
-          reportError4(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+          reportError7(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
           return length2;
         }
         int firstDigit = currentChar;
@@ -4620,7 +4933,7 @@
         int thirdDigit = lexeme.codeUnitAt(currentIndex + 2);
         int fourthDigit = lexeme.codeUnitAt(currentIndex + 3);
         if (!isHexDigit(firstDigit) || !isHexDigit(secondDigit) || !isHexDigit(thirdDigit) || !isHexDigit(fourthDigit)) {
-          reportError4(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+          reportError7(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
         } else {
           appendScalarValue(builder, lexeme.substring(index, currentIndex + 1), ((((((Character.digit(firstDigit, 16) << 4) + Character.digit(secondDigit, 16)) << 4) + Character.digit(thirdDigit, 16)) << 4) + Character.digit(fourthDigit, 16)), index, currentIndex + 3);
         }
@@ -4631,6 +4944,7 @@
     }
     return currentIndex + 1;
   }
+  
   /**
    * Validate that the given parameter list does not contain any field initializers.
    * @param parameterList the parameter list to be validated
@@ -4642,6 +4956,7 @@
       }
     }
   }
+  
   /**
    * Validate that the given set of modifiers is appropriate for a class and return the 'abstract'
    * keyword if there is one.
@@ -4650,19 +4965,20 @@
   Token validateModifiersForClass(Modifiers modifiers) {
     validateModifiersForTopLevelDeclaration(modifiers);
     if (modifiers.constKeyword != null) {
-      reportError5(ParserErrorCode.CONST_CLASS, modifiers.constKeyword, []);
+      reportError8(ParserErrorCode.CONST_CLASS, modifiers.constKeyword, []);
     }
     if (modifiers.externalKeyword != null) {
-      reportError5(ParserErrorCode.EXTERNAL_CLASS, modifiers.externalKeyword, []);
+      reportError8(ParserErrorCode.EXTERNAL_CLASS, modifiers.externalKeyword, []);
     }
     if (modifiers.finalKeyword != null) {
-      reportError5(ParserErrorCode.FINAL_CLASS, modifiers.finalKeyword, []);
+      reportError8(ParserErrorCode.FINAL_CLASS, modifiers.finalKeyword, []);
     }
     if (modifiers.varKeyword != null) {
-      reportError5(ParserErrorCode.VAR_CLASS, modifiers.varKeyword, []);
+      reportError8(ParserErrorCode.VAR_CLASS, modifiers.varKeyword, []);
     }
     return modifiers.abstractKeyword;
   }
+  
   /**
    * Validate that the given set of modifiers is appropriate for a constructor and return the
    * 'const' keyword if there is one.
@@ -4671,28 +4987,29 @@
    */
   Token validateModifiersForConstructor(Modifiers modifiers) {
     if (modifiers.abstractKeyword != null) {
-      reportError4(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
+      reportError7(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
     }
     if (modifiers.finalKeyword != null) {
-      reportError5(ParserErrorCode.FINAL_CONSTRUCTOR, modifiers.finalKeyword, []);
+      reportError8(ParserErrorCode.FINAL_CONSTRUCTOR, modifiers.finalKeyword, []);
     }
     if (modifiers.staticKeyword != null) {
-      reportError5(ParserErrorCode.STATIC_CONSTRUCTOR, modifiers.staticKeyword, []);
+      reportError8(ParserErrorCode.STATIC_CONSTRUCTOR, modifiers.staticKeyword, []);
     }
     if (modifiers.varKeyword != null) {
-      reportError5(ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, modifiers.varKeyword, []);
+      reportError8(ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, modifiers.varKeyword, []);
     }
     Token externalKeyword2 = modifiers.externalKeyword;
     Token constKeyword2 = modifiers.constKeyword;
     Token factoryKeyword2 = modifiers.factoryKeyword;
     if (externalKeyword2 != null && constKeyword2 != null && constKeyword2.offset < externalKeyword2.offset) {
-      reportError5(ParserErrorCode.EXTERNAL_AFTER_CONST, externalKeyword2, []);
+      reportError8(ParserErrorCode.EXTERNAL_AFTER_CONST, externalKeyword2, []);
     }
     if (externalKeyword2 != null && factoryKeyword2 != null && factoryKeyword2.offset < externalKeyword2.offset) {
-      reportError5(ParserErrorCode.EXTERNAL_AFTER_FACTORY, externalKeyword2, []);
+      reportError8(ParserErrorCode.EXTERNAL_AFTER_FACTORY, externalKeyword2, []);
     }
     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.
@@ -4701,13 +5018,13 @@
    */
   Token validateModifiersForField(Modifiers modifiers) {
     if (modifiers.abstractKeyword != null) {
-      reportError4(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
+      reportError7(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
     }
     if (modifiers.externalKeyword != null) {
-      reportError5(ParserErrorCode.EXTERNAL_FIELD, modifiers.externalKeyword, []);
+      reportError8(ParserErrorCode.EXTERNAL_FIELD, modifiers.externalKeyword, []);
     }
     if (modifiers.factoryKeyword != null) {
-      reportError5(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword, []);
+      reportError8(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword, []);
     }
     Token staticKeyword2 = modifiers.staticKeyword;
     Token constKeyword2 = modifiers.constKeyword;
@@ -4715,88 +5032,92 @@
     Token varKeyword2 = modifiers.varKeyword;
     if (constKeyword2 != null) {
       if (finalKeyword2 != null) {
-        reportError5(ParserErrorCode.CONST_AND_FINAL, finalKeyword2, []);
+        reportError8(ParserErrorCode.CONST_AND_FINAL, finalKeyword2, []);
       }
       if (varKeyword2 != null) {
-        reportError5(ParserErrorCode.CONST_AND_VAR, varKeyword2, []);
+        reportError8(ParserErrorCode.CONST_AND_VAR, varKeyword2, []);
       }
       if (staticKeyword2 != null && constKeyword2.offset < staticKeyword2.offset) {
-        reportError5(ParserErrorCode.STATIC_AFTER_CONST, staticKeyword2, []);
+        reportError8(ParserErrorCode.STATIC_AFTER_CONST, staticKeyword2, []);
       }
     } else if (finalKeyword2 != null) {
       if (varKeyword2 != null) {
-        reportError5(ParserErrorCode.FINAL_AND_VAR, varKeyword2, []);
+        reportError8(ParserErrorCode.FINAL_AND_VAR, varKeyword2, []);
       }
       if (staticKeyword2 != null && finalKeyword2.offset < staticKeyword2.offset) {
-        reportError5(ParserErrorCode.STATIC_AFTER_FINAL, staticKeyword2, []);
+        reportError8(ParserErrorCode.STATIC_AFTER_FINAL, staticKeyword2, []);
       }
     } else if (varKeyword2 != null && staticKeyword2 != null && varKeyword2.offset < staticKeyword2.offset) {
-      reportError5(ParserErrorCode.STATIC_AFTER_VAR, staticKeyword2, []);
+      reportError8(ParserErrorCode.STATIC_AFTER_VAR, staticKeyword2, []);
     }
     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
    */
   void validateModifiersForGetterOrSetterOrMethod(Modifiers modifiers) {
     if (modifiers.abstractKeyword != null) {
-      reportError4(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
+      reportError7(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
     }
     if (modifiers.constKeyword != null) {
-      reportError5(ParserErrorCode.CONST_METHOD, modifiers.constKeyword, []);
+      reportError8(ParserErrorCode.CONST_METHOD, modifiers.constKeyword, []);
     }
     if (modifiers.factoryKeyword != null) {
-      reportError5(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword, []);
+      reportError8(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword, []);
     }
     if (modifiers.finalKeyword != null) {
-      reportError5(ParserErrorCode.FINAL_METHOD, modifiers.finalKeyword, []);
+      reportError8(ParserErrorCode.FINAL_METHOD, modifiers.finalKeyword, []);
     }
     if (modifiers.varKeyword != null) {
-      reportError5(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword, []);
+      reportError8(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword, []);
     }
     Token externalKeyword2 = modifiers.externalKeyword;
     Token staticKeyword2 = modifiers.staticKeyword;
     if (externalKeyword2 != null && staticKeyword2 != null && staticKeyword2.offset < externalKeyword2.offset) {
-      reportError5(ParserErrorCode.EXTERNAL_AFTER_STATIC, externalKeyword2, []);
+      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
    */
   void validateModifiersForOperator(Modifiers modifiers) {
     if (modifiers.abstractKeyword != null) {
-      reportError4(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
+      reportError7(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
     }
     if (modifiers.constKeyword != null) {
-      reportError5(ParserErrorCode.CONST_METHOD, modifiers.constKeyword, []);
+      reportError8(ParserErrorCode.CONST_METHOD, modifiers.constKeyword, []);
     }
     if (modifiers.factoryKeyword != null) {
-      reportError5(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword, []);
+      reportError8(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword, []);
     }
     if (modifiers.finalKeyword != null) {
-      reportError5(ParserErrorCode.FINAL_METHOD, modifiers.finalKeyword, []);
+      reportError8(ParserErrorCode.FINAL_METHOD, modifiers.finalKeyword, []);
     }
     if (modifiers.staticKeyword != null) {
-      reportError5(ParserErrorCode.STATIC_OPERATOR, modifiers.staticKeyword, []);
+      reportError8(ParserErrorCode.STATIC_OPERATOR, modifiers.staticKeyword, []);
     }
     if (modifiers.varKeyword != null) {
-      reportError5(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword, []);
+      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
    */
   void validateModifiersForTopLevelDeclaration(Modifiers modifiers) {
     if (modifiers.factoryKeyword != null) {
-      reportError5(ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION, modifiers.factoryKeyword, []);
+      reportError8(ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION, modifiers.factoryKeyword, []);
     }
     if (modifiers.staticKeyword != null) {
-      reportError5(ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION, modifiers.staticKeyword, []);
+      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
@@ -4804,18 +5125,19 @@
   void validateModifiersForTopLevelFunction(Modifiers modifiers) {
     validateModifiersForTopLevelDeclaration(modifiers);
     if (modifiers.abstractKeyword != null) {
-      reportError4(ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION, []);
+      reportError7(ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION, []);
     }
     if (modifiers.constKeyword != null) {
-      reportError5(ParserErrorCode.CONST_CLASS, modifiers.constKeyword, []);
+      reportError8(ParserErrorCode.CONST_CLASS, modifiers.constKeyword, []);
     }
     if (modifiers.finalKeyword != null) {
-      reportError5(ParserErrorCode.FINAL_CLASS, modifiers.finalKeyword, []);
+      reportError8(ParserErrorCode.FINAL_CLASS, modifiers.finalKeyword, []);
     }
     if (modifiers.varKeyword != null) {
-      reportError5(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword, []);
+      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.
@@ -4825,28 +5147,29 @@
   Token validateModifiersForTopLevelVariable(Modifiers modifiers) {
     validateModifiersForTopLevelDeclaration(modifiers);
     if (modifiers.abstractKeyword != null) {
-      reportError4(ParserErrorCode.ABSTRACT_TOP_LEVEL_VARIABLE, []);
+      reportError7(ParserErrorCode.ABSTRACT_TOP_LEVEL_VARIABLE, []);
     }
     if (modifiers.externalKeyword != null) {
-      reportError5(ParserErrorCode.EXTERNAL_FIELD, modifiers.externalKeyword, []);
+      reportError8(ParserErrorCode.EXTERNAL_FIELD, modifiers.externalKeyword, []);
     }
     Token constKeyword2 = modifiers.constKeyword;
     Token finalKeyword2 = modifiers.finalKeyword;
     Token varKeyword2 = modifiers.varKeyword;
     if (constKeyword2 != null) {
       if (finalKeyword2 != null) {
-        reportError5(ParserErrorCode.CONST_AND_FINAL, finalKeyword2, []);
+        reportError8(ParserErrorCode.CONST_AND_FINAL, finalKeyword2, []);
       }
       if (varKeyword2 != null) {
-        reportError5(ParserErrorCode.CONST_AND_VAR, varKeyword2, []);
+        reportError8(ParserErrorCode.CONST_AND_VAR, varKeyword2, []);
       }
     } else if (finalKeyword2 != null) {
       if (varKeyword2 != null) {
-        reportError5(ParserErrorCode.FINAL_AND_VAR, varKeyword2, []);
+        reportError8(ParserErrorCode.FINAL_AND_VAR, varKeyword2, []);
       }
     }
     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.
@@ -4855,19 +5178,19 @@
   void validateModifiersForTypedef(Modifiers modifiers) {
     validateModifiersForTopLevelDeclaration(modifiers);
     if (modifiers.abstractKeyword != null) {
-      reportError5(ParserErrorCode.ABSTRACT_TYPEDEF, modifiers.abstractKeyword, []);
+      reportError8(ParserErrorCode.ABSTRACT_TYPEDEF, modifiers.abstractKeyword, []);
     }
     if (modifiers.constKeyword != null) {
-      reportError5(ParserErrorCode.CONST_TYPEDEF, modifiers.constKeyword, []);
+      reportError8(ParserErrorCode.CONST_TYPEDEF, modifiers.constKeyword, []);
     }
     if (modifiers.externalKeyword != null) {
-      reportError5(ParserErrorCode.EXTERNAL_TYPEDEF, modifiers.externalKeyword, []);
+      reportError8(ParserErrorCode.EXTERNAL_TYPEDEF, modifiers.externalKeyword, []);
     }
     if (modifiers.finalKeyword != null) {
-      reportError5(ParserErrorCode.FINAL_TYPEDEF, modifiers.finalKeyword, []);
+      reportError8(ParserErrorCode.FINAL_TYPEDEF, modifiers.finalKeyword, []);
     }
     if (modifiers.varKeyword != null) {
-      reportError5(ParserErrorCode.VAR_TYPEDEF, modifiers.varKeyword, []);
+      reportError8(ParserErrorCode.VAR_TYPEDEF, modifiers.varKeyword, []);
     }
   }
 }
@@ -4882,6 +5205,7 @@
     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
@@ -4899,162 +5223,177 @@
   static final ParserErrorCode CONST_AND_FINAL = new ParserErrorCode.con2('CONST_AND_FINAL', 6, "Members cannot be declared to be both 'const' and 'final'");
   static final ParserErrorCode CONST_AND_VAR = new ParserErrorCode.con2('CONST_AND_VAR', 7, "Members cannot be declared to be both 'const' and 'var'");
   static final ParserErrorCode CONST_CLASS = new ParserErrorCode.con2('CONST_CLASS', 8, "Classes cannot be declared to be 'const'");
-  static final ParserErrorCode CONST_METHOD = new ParserErrorCode.con2('CONST_METHOD', 9, "Getters, setters and methods cannot be declared to be 'const'");
-  static final ParserErrorCode CONST_TYPEDEF = new ParserErrorCode.con2('CONST_TYPEDEF', 10, "Type aliases cannot be declared to be 'const'");
-  static final ParserErrorCode CONSTRUCTOR_WITH_RETURN_TYPE = new ParserErrorCode.con2('CONSTRUCTOR_WITH_RETURN_TYPE', 11, "Constructors cannot have a return type");
-  static final ParserErrorCode CONTINUE_OUTSIDE_OF_LOOP = new ParserErrorCode.con2('CONTINUE_OUTSIDE_OF_LOOP', 12, "A continue statement cannot be used outside of a loop or switch statement");
-  static final ParserErrorCode CONTINUE_WITHOUT_LABEL_IN_CASE = new ParserErrorCode.con2('CONTINUE_WITHOUT_LABEL_IN_CASE', 13, "A continue statement in a switch statement must have a label as a target");
-  static final ParserErrorCode DIRECTIVE_AFTER_DECLARATION = new ParserErrorCode.con2('DIRECTIVE_AFTER_DECLARATION', 14, "Directives must appear before any declarations");
-  static final ParserErrorCode DUPLICATE_LABEL_IN_SWITCH_STATEMENT = new ParserErrorCode.con2('DUPLICATE_LABEL_IN_SWITCH_STATEMENT', 15, "The label %s was already used in this switch statement");
-  static final ParserErrorCode DUPLICATED_MODIFIER = new ParserErrorCode.con2('DUPLICATED_MODIFIER', 16, "The modifier '%s' was already specified.");
-  static final ParserErrorCode EXPECTED_CASE_OR_DEFAULT = new ParserErrorCode.con2('EXPECTED_CASE_OR_DEFAULT', 17, "Expected 'case' or 'default'");
-  static final ParserErrorCode EXPECTED_CLASS_MEMBER = new ParserErrorCode.con2('EXPECTED_CLASS_MEMBER', 18, "Expected a class member");
-  static final ParserErrorCode EXPECTED_EXECUTABLE = new ParserErrorCode.con2('EXPECTED_EXECUTABLE', 19, "Expected a method, getter, setter or operator declaration");
-  static final ParserErrorCode EXPECTED_LIST_OR_MAP_LITERAL = new ParserErrorCode.con2('EXPECTED_LIST_OR_MAP_LITERAL', 20, "Expected a list or map literal");
-  static final ParserErrorCode EXPECTED_STRING_LITERAL = new ParserErrorCode.con2('EXPECTED_STRING_LITERAL', 21, "Expected a string literal");
-  static final ParserErrorCode EXPECTED_TOKEN = new ParserErrorCode.con2('EXPECTED_TOKEN', 22, "Expected to find '%s'");
-  static final ParserErrorCode EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = new ParserErrorCode.con2('EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 23, "Export directives must preceed part directives");
-  static final ParserErrorCode EXTERNAL_AFTER_CONST = new ParserErrorCode.con2('EXTERNAL_AFTER_CONST', 24, "The modifier 'external' should be before the modifier 'const'");
-  static final ParserErrorCode EXTERNAL_AFTER_FACTORY = new ParserErrorCode.con2('EXTERNAL_AFTER_FACTORY', 25, "The modifier 'external' should be before the modifier 'factory'");
-  static final ParserErrorCode EXTERNAL_AFTER_STATIC = new ParserErrorCode.con2('EXTERNAL_AFTER_STATIC', 26, "The modifier 'external' should be before the modifier 'static'");
-  static final ParserErrorCode EXTERNAL_CLASS = new ParserErrorCode.con2('EXTERNAL_CLASS', 27, "Classes cannot be declared to be 'external'");
-  static final ParserErrorCode EXTERNAL_CONSTRUCTOR_WITH_BODY = new ParserErrorCode.con2('EXTERNAL_CONSTRUCTOR_WITH_BODY', 28, "External constructors cannot have a body");
-  static final ParserErrorCode EXTERNAL_FIELD = new ParserErrorCode.con2('EXTERNAL_FIELD', 29, "Fields cannot be declared to be 'external'");
-  static final ParserErrorCode EXTERNAL_GETTER_WITH_BODY = new ParserErrorCode.con2('EXTERNAL_GETTER_WITH_BODY', 30, "External getters cannot have a body");
-  static final ParserErrorCode EXTERNAL_METHOD_WITH_BODY = new ParserErrorCode.con2('EXTERNAL_METHOD_WITH_BODY', 31, "External methods cannot have a body");
-  static final ParserErrorCode EXTERNAL_OPERATOR_WITH_BODY = new ParserErrorCode.con2('EXTERNAL_OPERATOR_WITH_BODY', 32, "External operators cannot have a body");
-  static final ParserErrorCode EXTERNAL_SETTER_WITH_BODY = new ParserErrorCode.con2('EXTERNAL_SETTER_WITH_BODY', 33, "External setters cannot have a body");
-  static final ParserErrorCode EXTERNAL_TYPEDEF = new ParserErrorCode.con2('EXTERNAL_TYPEDEF', 34, "Type aliases cannot be declared to be 'external'");
-  static final ParserErrorCode FACTORY_TOP_LEVEL_DECLARATION = new ParserErrorCode.con2('FACTORY_TOP_LEVEL_DECLARATION', 35, "Top-level declarations cannot be declared to be 'factory'");
-  static final ParserErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = new ParserErrorCode.con2('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 36, "Field initializers can only be used in a constructor");
-  static final ParserErrorCode FINAL_AND_VAR = new ParserErrorCode.con2('FINAL_AND_VAR', 37, "Members cannot be declared to be both 'final' and 'var'");
-  static final ParserErrorCode FINAL_CLASS = new ParserErrorCode.con2('FINAL_CLASS', 38, "Classes cannot be declared to be 'final'");
-  static final ParserErrorCode FINAL_CONSTRUCTOR = new ParserErrorCode.con2('FINAL_CONSTRUCTOR', 39, "A constructor cannot be declared to be 'final'");
-  static final ParserErrorCode FINAL_METHOD = new ParserErrorCode.con2('FINAL_METHOD', 40, "Getters, setters and methods cannot be declared to be 'final'");
-  static final ParserErrorCode FINAL_TYPEDEF = new ParserErrorCode.con2('FINAL_TYPEDEF', 41, "Type aliases cannot be declared to be 'final'");
-  static final ParserErrorCode GETTER_WITH_PARAMETERS = new ParserErrorCode.con2('GETTER_WITH_PARAMETERS', 42, "Getter should be declared without a parameter list");
-  static final ParserErrorCode ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE = new ParserErrorCode.con2('ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE', 43, "Illegal assignment to non-assignable expression");
-  static final ParserErrorCode IMPLEMENTS_BEFORE_EXTENDS = new ParserErrorCode.con2('IMPLEMENTS_BEFORE_EXTENDS', 44, "The extends clause must be before the implements clause");
-  static final ParserErrorCode IMPLEMENTS_BEFORE_WITH = new ParserErrorCode.con2('IMPLEMENTS_BEFORE_WITH', 45, "The with clause must be before the implements clause");
-  static final ParserErrorCode IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = new ParserErrorCode.con2('IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 46, "Import directives must preceed part directives");
-  static final ParserErrorCode INITIALIZED_VARIABLE_IN_FOR_EACH = new ParserErrorCode.con2('INITIALIZED_VARIABLE_IN_FOR_EACH', 47, "The loop variable in a for-each loop cannot be initialized");
-  static final ParserErrorCode INVALID_CODE_POINT = new ParserErrorCode.con2('INVALID_CODE_POINT', 48, "The escape sequence '%s' is not a valid code point");
-  static final ParserErrorCode INVALID_COMMENT_REFERENCE = new ParserErrorCode.con2('INVALID_COMMENT_REFERENCE', 49, "Comment references should contain a possibly prefixed identifier and can start with 'new', but should not contain anything else");
-  static final ParserErrorCode INVALID_HEX_ESCAPE = new ParserErrorCode.con2('INVALID_HEX_ESCAPE', 50, "An escape sequence starting with '\\x' must be followed by 2 hexidecimal digits");
-  static final ParserErrorCode INVALID_OPERATOR = new ParserErrorCode.con2('INVALID_OPERATOR', 51, "The string '%s' is not a valid operator");
-  static final ParserErrorCode INVALID_OPERATOR_FOR_SUPER = new ParserErrorCode.con2('INVALID_OPERATOR_FOR_SUPER', 52, "The operator '%s' cannot be used with 'super'");
-  static final ParserErrorCode INVALID_UNICODE_ESCAPE = new ParserErrorCode.con2('INVALID_UNICODE_ESCAPE', 53, "An escape sequence starting with '\\u' must be followed by 4 hexidecimal digits or from 1 to 6 digits between '{' and '}'");
-  static final ParserErrorCode LIBRARY_DIRECTIVE_NOT_FIRST = new ParserErrorCode.con2('LIBRARY_DIRECTIVE_NOT_FIRST', 54, "The library directive must appear before all other directives");
-  static final ParserErrorCode MISSING_ASSIGNABLE_SELECTOR = new ParserErrorCode.con2('MISSING_ASSIGNABLE_SELECTOR', 55, "Missing selector such as \".<identifier>\" or \"[0]\"");
-  static final ParserErrorCode MISSING_CATCH_OR_FINALLY = new ParserErrorCode.con2('MISSING_CATCH_OR_FINALLY', 56, "A try statement must have either a catch or finally clause");
-  static final ParserErrorCode MISSING_CLASS_BODY = new ParserErrorCode.con2('MISSING_CLASS_BODY', 57, "A class definition must have a body, even if it is empty");
-  static final ParserErrorCode MISSING_CLOSING_PARENTHESIS = new ParserErrorCode.con2('MISSING_CLOSING_PARENTHESIS', 58, "The closing parenthesis is missing");
-  static final ParserErrorCode MISSING_CONST_FINAL_VAR_OR_TYPE = new ParserErrorCode.con2('MISSING_CONST_FINAL_VAR_OR_TYPE', 59, "Variables must be declared using the keywords 'const', 'final', 'var' or a type name");
-  static final ParserErrorCode MISSING_EXPRESSION_IN_THROW = new ParserErrorCode.con2('MISSING_EXPRESSION_IN_THROW', 60, "Throw expressions must compute the object to be thrown");
-  static final ParserErrorCode MISSING_FUNCTION_BODY = new ParserErrorCode.con2('MISSING_FUNCTION_BODY', 61, "A function body must be provided");
-  static final ParserErrorCode MISSING_FUNCTION_PARAMETERS = new ParserErrorCode.con2('MISSING_FUNCTION_PARAMETERS', 62, "Functions must have an explicit list of parameters");
-  static final ParserErrorCode MISSING_IDENTIFIER = new ParserErrorCode.con2('MISSING_IDENTIFIER', 63, "Expected an identifier");
-  static final ParserErrorCode MISSING_KEYWORD_OPERATOR = new ParserErrorCode.con2('MISSING_KEYWORD_OPERATOR', 64, "Operator declarations must be preceeded by the keyword 'operator'");
-  static final ParserErrorCode MISSING_NAME_IN_LIBRARY_DIRECTIVE = new ParserErrorCode.con2('MISSING_NAME_IN_LIBRARY_DIRECTIVE', 65, "Library directives must include a library name");
-  static final ParserErrorCode MISSING_NAME_IN_PART_OF_DIRECTIVE = new ParserErrorCode.con2('MISSING_NAME_IN_PART_OF_DIRECTIVE', 66, "Library directives must include a library name");
-  static final ParserErrorCode MISSING_STATEMENT = new ParserErrorCode.con2('MISSING_STATEMENT', 67, "Expected a statement");
-  static final ParserErrorCode MISSING_TERMINATOR_FOR_PARAMETER_GROUP = new ParserErrorCode.con2('MISSING_TERMINATOR_FOR_PARAMETER_GROUP', 68, "There is no '%s' to close the parameter group");
-  static final ParserErrorCode MISSING_TYPEDEF_PARAMETERS = new ParserErrorCode.con2('MISSING_TYPEDEF_PARAMETERS', 69, "Type aliases for functions must have an explicit list of parameters");
-  static final ParserErrorCode MISSING_VARIABLE_IN_FOR_EACH = new ParserErrorCode.con2('MISSING_VARIABLE_IN_FOR_EACH', 70, "A loop variable must be declared in a for-each loop before the 'in', but none were found");
-  static final ParserErrorCode MIXED_PARAMETER_GROUPS = new ParserErrorCode.con2('MIXED_PARAMETER_GROUPS', 71, "Cannot have both positional and named parameters in a single parameter list");
-  static final ParserErrorCode MULTIPLE_EXTENDS_CLAUSES = new ParserErrorCode.con2('MULTIPLE_EXTENDS_CLAUSES', 72, "Each class definition can have at most one extends clause");
-  static final ParserErrorCode MULTIPLE_IMPLEMENTS_CLAUSES = new ParserErrorCode.con2('MULTIPLE_IMPLEMENTS_CLAUSES', 73, "Each class definition can have at most one implements clause");
-  static final ParserErrorCode MULTIPLE_LIBRARY_DIRECTIVES = new ParserErrorCode.con2('MULTIPLE_LIBRARY_DIRECTIVES', 74, "Only one library directive may be declared in a file");
-  static final ParserErrorCode MULTIPLE_NAMED_PARAMETER_GROUPS = new ParserErrorCode.con2('MULTIPLE_NAMED_PARAMETER_GROUPS', 75, "Cannot have multiple groups of named parameters in a single parameter list");
-  static final ParserErrorCode MULTIPLE_PART_OF_DIRECTIVES = new ParserErrorCode.con2('MULTIPLE_PART_OF_DIRECTIVES', 76, "Only one part-of directive may be declared in a file");
-  static final ParserErrorCode MULTIPLE_POSITIONAL_PARAMETER_GROUPS = new ParserErrorCode.con2('MULTIPLE_POSITIONAL_PARAMETER_GROUPS', 77, "Cannot have multiple groups of positional parameters in a single parameter list");
-  static final ParserErrorCode MULTIPLE_VARIABLES_IN_FOR_EACH = new ParserErrorCode.con2('MULTIPLE_VARIABLES_IN_FOR_EACH', 78, "A single loop variable must be declared in a for-each loop before the 'in', but %s were found");
-  static final ParserErrorCode MULTIPLE_WITH_CLAUSES = new ParserErrorCode.con2('MULTIPLE_WITH_CLAUSES', 79, "Each class definition can have at most one with clause");
-  static final ParserErrorCode NAMED_FUNCTION_EXPRESSION = new ParserErrorCode.con2('NAMED_FUNCTION_EXPRESSION', 80, "Function expressions cannot be named");
-  static final ParserErrorCode NAMED_PARAMETER_OUTSIDE_GROUP = new ParserErrorCode.con2('NAMED_PARAMETER_OUTSIDE_GROUP', 81, "Named parameters must be enclosed in curly braces ('{' and '}')");
-  static final ParserErrorCode NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE = new ParserErrorCode.con2('NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE', 82, "Native functions can only be declared in the SDK and code that is loaded through native extensions");
-  static final ParserErrorCode NON_CONSTRUCTOR_FACTORY = new ParserErrorCode.con2('NON_CONSTRUCTOR_FACTORY', 83, "Only constructors can be declared to be a 'factory'");
-  static final ParserErrorCode NON_IDENTIFIER_LIBRARY_NAME = new ParserErrorCode.con2('NON_IDENTIFIER_LIBRARY_NAME', 84, "The name of a library must be an identifier");
-  static final ParserErrorCode NON_PART_OF_DIRECTIVE_IN_PART = new ParserErrorCode.con2('NON_PART_OF_DIRECTIVE_IN_PART', 85, "The part-of directive must be the only directive in a part");
-  static final ParserErrorCode NON_USER_DEFINABLE_OPERATOR = new ParserErrorCode.con2('NON_USER_DEFINABLE_OPERATOR', 86, "The operator '%s' is not user definable");
-  static final ParserErrorCode POSITIONAL_AFTER_NAMED_ARGUMENT = new ParserErrorCode.con2('POSITIONAL_AFTER_NAMED_ARGUMENT', 87, "Positional arguments must occur before named arguments");
-  static final ParserErrorCode POSITIONAL_PARAMETER_OUTSIDE_GROUP = new ParserErrorCode.con2('POSITIONAL_PARAMETER_OUTSIDE_GROUP', 88, "Positional parameters must be enclosed in square brackets ('[' and ']')");
-  static final ParserErrorCode STATIC_AFTER_CONST = new ParserErrorCode.con2('STATIC_AFTER_CONST', 89, "The modifier 'static' should be before the modifier 'const'");
-  static final ParserErrorCode STATIC_AFTER_FINAL = new ParserErrorCode.con2('STATIC_AFTER_FINAL', 90, "The modifier 'static' should be before the modifier 'final'");
-  static final ParserErrorCode STATIC_AFTER_VAR = new ParserErrorCode.con2('STATIC_AFTER_VAR', 91, "The modifier 'static' should be before the modifier 'var'");
-  static final ParserErrorCode STATIC_CONSTRUCTOR = new ParserErrorCode.con2('STATIC_CONSTRUCTOR', 92, "Constructors cannot be static");
-  static final ParserErrorCode STATIC_OPERATOR = new ParserErrorCode.con2('STATIC_OPERATOR', 93, "Operators cannot be static");
-  static final ParserErrorCode STATIC_TOP_LEVEL_DECLARATION = new ParserErrorCode.con2('STATIC_TOP_LEVEL_DECLARATION', 94, "Top-level declarations cannot be declared to be 'static'");
-  static final ParserErrorCode SWITCH_HAS_CASE_AFTER_DEFAULT_CASE = new ParserErrorCode.con2('SWITCH_HAS_CASE_AFTER_DEFAULT_CASE', 95, "The 'default' case should be the last case in a switch statement");
-  static final ParserErrorCode SWITCH_HAS_MULTIPLE_DEFAULT_CASES = new ParserErrorCode.con2('SWITCH_HAS_MULTIPLE_DEFAULT_CASES', 96, "The 'default' case can only be declared once");
-  static final ParserErrorCode TOP_LEVEL_OPERATOR = new ParserErrorCode.con2('TOP_LEVEL_OPERATOR', 97, "Operators must be declared within a class");
-  static final ParserErrorCode UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP = new ParserErrorCode.con2('UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP', 98, "There is no '%s' to open a parameter group");
-  static final ParserErrorCode UNEXPECTED_TOKEN = new ParserErrorCode.con2('UNEXPECTED_TOKEN', 99, "Unexpected token '%s'");
-  static final ParserErrorCode USE_OF_UNARY_PLUS_OPERATOR = new ParserErrorCode.con2('USE_OF_UNARY_PLUS_OPERATOR', 100, "There is no unary plus operator in Dart");
-  static final ParserErrorCode WITH_BEFORE_EXTENDS = new ParserErrorCode.con2('WITH_BEFORE_EXTENDS', 101, "The extends clause must be before the with clause");
-  static final ParserErrorCode WITH_WITHOUT_EXTENDS = new ParserErrorCode.con2('WITH_WITHOUT_EXTENDS', 102, "The with clause cannot be used without an extends clause");
-  static final ParserErrorCode WRONG_SEPARATOR_FOR_NAMED_PARAMETER = new ParserErrorCode.con2('WRONG_SEPARATOR_FOR_NAMED_PARAMETER', 103, "The default value of a named parameter should be preceeded by ':'");
-  static final ParserErrorCode WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER = new ParserErrorCode.con2('WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER', 104, "The default value of a positional parameter should be preceeded by '='");
-  static final ParserErrorCode WRONG_TERMINATOR_FOR_PARAMETER_GROUP = new ParserErrorCode.con2('WRONG_TERMINATOR_FOR_PARAMETER_GROUP', 105, "Expected '%s' to close parameter group");
-  static final ParserErrorCode VAR_CLASS = new ParserErrorCode.con2('VAR_CLASS', 106, "Classes cannot be declared to be 'var'");
-  static final ParserErrorCode VAR_RETURN_TYPE = new ParserErrorCode.con2('VAR_RETURN_TYPE', 107, "The return type cannot be 'var'");
-  static final ParserErrorCode VAR_TYPEDEF = new ParserErrorCode.con2('VAR_TYPEDEF', 108, "Type aliases cannot be declared to be 'var'");
-  static final ParserErrorCode VOID_PARAMETER = new ParserErrorCode.con2('VOID_PARAMETER', 109, "Parameters cannot have a type of 'void'");
-  static final ParserErrorCode VOID_VARIABLE = new ParserErrorCode.con2('VOID_VARIABLE', 110, "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_METHOD, CONST_TYPEDEF, CONSTRUCTOR_WITH_RETURN_TYPE, CONTINUE_OUTSIDE_OF_LOOP, CONTINUE_WITHOUT_LABEL_IN_CASE, 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, 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, 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_OPERATOR, 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, USE_OF_UNARY_PLUS_OPERATOR, WITH_BEFORE_EXTENDS, WITH_WITHOUT_EXTENDS, WRONG_SEPARATOR_FOR_NAMED_PARAMETER, WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER, WRONG_TERMINATOR_FOR_PARAMETER_GROUP, VAR_CLASS, VAR_RETURN_TYPE, VAR_TYPEDEF, VOID_PARAMETER, VOID_VARIABLE];
-  String __name;
-  int __ordinal = 0;
-  int get ordinal => __ordinal;
+  static final ParserErrorCode CONST_CONSTRUCTOR_WITH_BODY = new ParserErrorCode.con2('CONST_CONSTRUCTOR_WITH_BODY', 9, "'const' constructors cannot have a body");
+  static final ParserErrorCode CONST_FACTORY = new ParserErrorCode.con2('CONST_FACTORY', 10, "Only redirecting factory constructors can be declared to be 'const'");
+  static final ParserErrorCode CONST_METHOD = new ParserErrorCode.con2('CONST_METHOD', 11, "Getters, setters and methods cannot be declared to be 'const'");
+  static final ParserErrorCode CONST_TYPEDEF = new ParserErrorCode.con2('CONST_TYPEDEF', 12, "Type aliases cannot be declared to be 'const'");
+  static final ParserErrorCode CONSTRUCTOR_WITH_RETURN_TYPE = new ParserErrorCode.con2('CONSTRUCTOR_WITH_RETURN_TYPE', 13, "Constructors cannot have a return type");
+  static final ParserErrorCode CONTINUE_OUTSIDE_OF_LOOP = new ParserErrorCode.con2('CONTINUE_OUTSIDE_OF_LOOP', 14, "A continue statement cannot be used outside of a loop or switch statement");
+  static final ParserErrorCode CONTINUE_WITHOUT_LABEL_IN_CASE = new ParserErrorCode.con2('CONTINUE_WITHOUT_LABEL_IN_CASE', 15, "A continue statement in a switch statement must have a label as a target");
+  static final ParserErrorCode DEPRECATED_ARGUMENT_DEFINITION_TEST = new ParserErrorCode.con2('DEPRECATED_ARGUMENT_DEFINITION_TEST', 16, "The argument definition test ('?' operator) has been deprecated");
+  static final ParserErrorCode DIRECTIVE_AFTER_DECLARATION = new ParserErrorCode.con2('DIRECTIVE_AFTER_DECLARATION', 17, "Directives must appear before any declarations");
+  static final ParserErrorCode DUPLICATE_LABEL_IN_SWITCH_STATEMENT = new ParserErrorCode.con2('DUPLICATE_LABEL_IN_SWITCH_STATEMENT', 18, "The label %s was already used in this switch statement");
+  static final ParserErrorCode DUPLICATED_MODIFIER = new ParserErrorCode.con2('DUPLICATED_MODIFIER', 19, "The modifier '%s' was already specified.");
+  static final ParserErrorCode EXPECTED_CASE_OR_DEFAULT = new ParserErrorCode.con2('EXPECTED_CASE_OR_DEFAULT', 20, "Expected 'case' or 'default'");
+  static final ParserErrorCode EXPECTED_CLASS_MEMBER = new ParserErrorCode.con2('EXPECTED_CLASS_MEMBER', 21, "Expected a class member");
+  static final ParserErrorCode EXPECTED_EXECUTABLE = new ParserErrorCode.con2('EXPECTED_EXECUTABLE', 22, "Expected a method, getter, setter or operator declaration");
+  static final ParserErrorCode EXPECTED_LIST_OR_MAP_LITERAL = new ParserErrorCode.con2('EXPECTED_LIST_OR_MAP_LITERAL', 23, "Expected a list or map literal");
+  static final ParserErrorCode EXPECTED_STRING_LITERAL = new ParserErrorCode.con2('EXPECTED_STRING_LITERAL', 24, "Expected a string literal");
+  static final ParserErrorCode EXPECTED_TOKEN = new ParserErrorCode.con2('EXPECTED_TOKEN', 25, "Expected to find '%s'");
+  static final ParserErrorCode EXPECTED_TWO_MAP_TYPE_ARGUMENTS = new ParserErrorCode.con2('EXPECTED_TWO_MAP_TYPE_ARGUMENTS', 26, "Map literal requires exactly two type arguments or none, but %d found");
+  static final ParserErrorCode EXPECTED_TYPE_NAME = new ParserErrorCode.con2('EXPECTED_TYPE_NAME', 27, "Expected a type name");
+  static final ParserErrorCode EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = new ParserErrorCode.con2('EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 28, "Export directives must preceed part directives");
+  static final ParserErrorCode EXTERNAL_AFTER_CONST = new ParserErrorCode.con2('EXTERNAL_AFTER_CONST', 29, "The modifier 'external' should be before the modifier 'const'");
+  static final ParserErrorCode EXTERNAL_AFTER_FACTORY = new ParserErrorCode.con2('EXTERNAL_AFTER_FACTORY', 30, "The modifier 'external' should be before the modifier 'factory'");
+  static final ParserErrorCode EXTERNAL_AFTER_STATIC = new ParserErrorCode.con2('EXTERNAL_AFTER_STATIC', 31, "The modifier 'external' should be before the modifier 'static'");
+  static final ParserErrorCode EXTERNAL_CLASS = new ParserErrorCode.con2('EXTERNAL_CLASS', 32, "Classes cannot be declared to be 'external'");
+  static final ParserErrorCode EXTERNAL_CONSTRUCTOR_WITH_BODY = new ParserErrorCode.con2('EXTERNAL_CONSTRUCTOR_WITH_BODY', 33, "External constructors cannot have a body");
+  static final ParserErrorCode EXTERNAL_FIELD = new ParserErrorCode.con2('EXTERNAL_FIELD', 34, "Fields cannot be declared to be 'external'");
+  static final ParserErrorCode EXTERNAL_GETTER_WITH_BODY = new ParserErrorCode.con2('EXTERNAL_GETTER_WITH_BODY', 35, "External getters cannot have a body");
+  static final ParserErrorCode EXTERNAL_METHOD_WITH_BODY = new ParserErrorCode.con2('EXTERNAL_METHOD_WITH_BODY', 36, "External methods cannot have a body");
+  static final ParserErrorCode EXTERNAL_OPERATOR_WITH_BODY = new ParserErrorCode.con2('EXTERNAL_OPERATOR_WITH_BODY', 37, "External operators cannot have a body");
+  static final ParserErrorCode EXTERNAL_SETTER_WITH_BODY = new ParserErrorCode.con2('EXTERNAL_SETTER_WITH_BODY', 38, "External setters cannot have a body");
+  static final ParserErrorCode EXTERNAL_TYPEDEF = new ParserErrorCode.con2('EXTERNAL_TYPEDEF', 39, "Type aliases cannot be declared to be 'external'");
+  static final ParserErrorCode FACTORY_TOP_LEVEL_DECLARATION = new ParserErrorCode.con2('FACTORY_TOP_LEVEL_DECLARATION', 40, "Top-level declarations cannot be declared to be 'factory'");
+  static final ParserErrorCode FACTORY_WITHOUT_BODY = new ParserErrorCode.con2('FACTORY_WITHOUT_BODY', 41, "A non-redirecting 'factory' constructor must have a body");
+  static final ParserErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = new ParserErrorCode.con2('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 42, "Field initializers can only be used in a constructor");
+  static final ParserErrorCode FINAL_AND_VAR = new ParserErrorCode.con2('FINAL_AND_VAR', 43, "Members cannot be declared to be both 'final' and 'var'");
+  static final ParserErrorCode FINAL_CLASS = new ParserErrorCode.con2('FINAL_CLASS', 44, "Classes cannot be declared to be 'final'");
+  static final ParserErrorCode FINAL_CONSTRUCTOR = new ParserErrorCode.con2('FINAL_CONSTRUCTOR', 45, "A constructor cannot be declared to be 'final'");
+  static final ParserErrorCode FINAL_METHOD = new ParserErrorCode.con2('FINAL_METHOD', 46, "Getters, setters and methods cannot be declared to be 'final'");
+  static final ParserErrorCode FINAL_TYPEDEF = new ParserErrorCode.con2('FINAL_TYPEDEF', 47, "Type aliases cannot be declared to be 'final'");
+  static final ParserErrorCode GETTER_WITH_PARAMETERS = new ParserErrorCode.con2('GETTER_WITH_PARAMETERS', 48, "Getter should be declared without a parameter list");
+  static final ParserErrorCode ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE = new ParserErrorCode.con2('ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE', 49, "Illegal assignment to non-assignable expression");
+  static final ParserErrorCode IMPLEMENTS_BEFORE_EXTENDS = new ParserErrorCode.con2('IMPLEMENTS_BEFORE_EXTENDS', 50, "The extends clause must be before the implements clause");
+  static final ParserErrorCode IMPLEMENTS_BEFORE_WITH = new ParserErrorCode.con2('IMPLEMENTS_BEFORE_WITH', 51, "The with clause must be before the implements clause");
+  static final ParserErrorCode IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = new ParserErrorCode.con2('IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 52, "Import directives must preceed part directives");
+  static final ParserErrorCode INITIALIZED_VARIABLE_IN_FOR_EACH = new ParserErrorCode.con2('INITIALIZED_VARIABLE_IN_FOR_EACH', 53, "The loop variable in a for-each loop cannot be initialized");
+  static final ParserErrorCode INVALID_CODE_POINT = new ParserErrorCode.con2('INVALID_CODE_POINT', 54, "The escape sequence '%s' is not a valid code point");
+  static final ParserErrorCode INVALID_COMMENT_REFERENCE = new ParserErrorCode.con2('INVALID_COMMENT_REFERENCE', 55, "Comment references should contain a possibly prefixed identifier and can start with 'new', but should not contain anything else");
+  static final ParserErrorCode INVALID_HEX_ESCAPE = new ParserErrorCode.con2('INVALID_HEX_ESCAPE', 56, "An escape sequence starting with '\\x' must be followed by 2 hexidecimal digits");
+  static final ParserErrorCode INVALID_OPERATOR = new ParserErrorCode.con2('INVALID_OPERATOR', 57, "The string '%s' is not a valid operator");
+  static final ParserErrorCode INVALID_OPERATOR_FOR_SUPER = new ParserErrorCode.con2('INVALID_OPERATOR_FOR_SUPER', 58, "The operator '%s' cannot be used with 'super'");
+  static final ParserErrorCode INVALID_UNICODE_ESCAPE = new ParserErrorCode.con2('INVALID_UNICODE_ESCAPE', 59, "An escape sequence starting with '\\u' must be followed by 4 hexidecimal digits or from 1 to 6 digits between '{' and '}'");
+  static final ParserErrorCode LIBRARY_DIRECTIVE_NOT_FIRST = new ParserErrorCode.con2('LIBRARY_DIRECTIVE_NOT_FIRST', 60, "The library directive must appear before all other directives");
+  static final ParserErrorCode MISSING_ASSIGNABLE_SELECTOR = new ParserErrorCode.con2('MISSING_ASSIGNABLE_SELECTOR', 61, "Missing selector such as \".<identifier>\" or \"[0]\"");
+  static final ParserErrorCode MISSING_CATCH_OR_FINALLY = new ParserErrorCode.con2('MISSING_CATCH_OR_FINALLY', 62, "A try statement must have either a catch or finally clause");
+  static final ParserErrorCode MISSING_CLASS_BODY = new ParserErrorCode.con2('MISSING_CLASS_BODY', 63, "A class definition must have a body, even if it is empty");
+  static final ParserErrorCode MISSING_CLOSING_PARENTHESIS = new ParserErrorCode.con2('MISSING_CLOSING_PARENTHESIS', 64, "The closing parenthesis is missing");
+  static final ParserErrorCode MISSING_CONST_FINAL_VAR_OR_TYPE = new ParserErrorCode.con2('MISSING_CONST_FINAL_VAR_OR_TYPE', 65, "Variables must be declared using the keywords 'const', 'final', 'var' or a type name");
+  static final ParserErrorCode MISSING_EXPRESSION_IN_THROW = new ParserErrorCode.con2('MISSING_EXPRESSION_IN_THROW', 66, "Throw expressions must compute the object to be thrown");
+  static final ParserErrorCode MISSING_FUNCTION_BODY = new ParserErrorCode.con2('MISSING_FUNCTION_BODY', 67, "A function body must be provided");
+  static final ParserErrorCode MISSING_FUNCTION_PARAMETERS = new ParserErrorCode.con2('MISSING_FUNCTION_PARAMETERS', 68, "Functions must have an explicit list of parameters");
+  static final ParserErrorCode MISSING_IDENTIFIER = new ParserErrorCode.con2('MISSING_IDENTIFIER', 69, "Expected an identifier");
+  static final ParserErrorCode MISSING_KEYWORD_OPERATOR = new ParserErrorCode.con2('MISSING_KEYWORD_OPERATOR', 70, "Operator declarations must be preceeded by the keyword 'operator'");
+  static final ParserErrorCode MISSING_NAME_IN_LIBRARY_DIRECTIVE = new ParserErrorCode.con2('MISSING_NAME_IN_LIBRARY_DIRECTIVE', 71, "Library directives must include a library name");
+  static final ParserErrorCode MISSING_NAME_IN_PART_OF_DIRECTIVE = new ParserErrorCode.con2('MISSING_NAME_IN_PART_OF_DIRECTIVE', 72, "Library directives must include a library name");
+  static final ParserErrorCode MISSING_STATEMENT = new ParserErrorCode.con2('MISSING_STATEMENT', 73, "Expected a statement");
+  static final ParserErrorCode MISSING_TERMINATOR_FOR_PARAMETER_GROUP = new ParserErrorCode.con2('MISSING_TERMINATOR_FOR_PARAMETER_GROUP', 74, "There is no '%s' to close the parameter group");
+  static final ParserErrorCode MISSING_TYPEDEF_PARAMETERS = new ParserErrorCode.con2('MISSING_TYPEDEF_PARAMETERS', 75, "Type aliases for functions must have an explicit list of parameters");
+  static final ParserErrorCode MISSING_VARIABLE_IN_FOR_EACH = new ParserErrorCode.con2('MISSING_VARIABLE_IN_FOR_EACH', 76, "A loop variable must be declared in a for-each loop before the 'in', but none were found");
+  static final ParserErrorCode MIXED_PARAMETER_GROUPS = new ParserErrorCode.con2('MIXED_PARAMETER_GROUPS', 77, "Cannot have both positional and named parameters in a single parameter list");
+  static final ParserErrorCode MULTIPLE_EXTENDS_CLAUSES = new ParserErrorCode.con2('MULTIPLE_EXTENDS_CLAUSES', 78, "Each class definition can have at most one extends clause");
+  static final ParserErrorCode MULTIPLE_IMPLEMENTS_CLAUSES = new ParserErrorCode.con2('MULTIPLE_IMPLEMENTS_CLAUSES', 79, "Each class definition can have at most one implements clause");
+  static final ParserErrorCode MULTIPLE_LIBRARY_DIRECTIVES = new ParserErrorCode.con2('MULTIPLE_LIBRARY_DIRECTIVES', 80, "Only one library directive may be declared in a file");
+  static final ParserErrorCode MULTIPLE_NAMED_PARAMETER_GROUPS = new ParserErrorCode.con2('MULTIPLE_NAMED_PARAMETER_GROUPS', 81, "Cannot have multiple groups of named parameters in a single parameter list");
+  static final ParserErrorCode MULTIPLE_PART_OF_DIRECTIVES = new ParserErrorCode.con2('MULTIPLE_PART_OF_DIRECTIVES', 82, "Only one part-of directive may be declared in a file");
+  static final ParserErrorCode MULTIPLE_POSITIONAL_PARAMETER_GROUPS = new ParserErrorCode.con2('MULTIPLE_POSITIONAL_PARAMETER_GROUPS', 83, "Cannot have multiple groups of positional parameters in a single parameter list");
+  static final ParserErrorCode MULTIPLE_VARIABLES_IN_FOR_EACH = new ParserErrorCode.con2('MULTIPLE_VARIABLES_IN_FOR_EACH', 84, "A single loop variable must be declared in a for-each loop before the 'in', but %s were found");
+  static final ParserErrorCode MULTIPLE_WITH_CLAUSES = new ParserErrorCode.con2('MULTIPLE_WITH_CLAUSES', 85, "Each class definition can have at most one with clause");
+  static final ParserErrorCode NAMED_FUNCTION_EXPRESSION = new ParserErrorCode.con2('NAMED_FUNCTION_EXPRESSION', 86, "Function expressions cannot be named");
+  static final ParserErrorCode NAMED_PARAMETER_OUTSIDE_GROUP = new ParserErrorCode.con2('NAMED_PARAMETER_OUTSIDE_GROUP', 87, "Named parameters must be enclosed in curly braces ('{' and '}')");
+  static final ParserErrorCode NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE = new ParserErrorCode.con2('NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE', 88, "Native functions can only be declared in the SDK and code that is loaded through native extensions");
+  static final ParserErrorCode NON_CONSTRUCTOR_FACTORY = new ParserErrorCode.con2('NON_CONSTRUCTOR_FACTORY', 89, "Only constructors can be declared to be a 'factory'");
+  static final ParserErrorCode NON_IDENTIFIER_LIBRARY_NAME = new ParserErrorCode.con2('NON_IDENTIFIER_LIBRARY_NAME', 90, "The name of a library must be an identifier");
+  static final ParserErrorCode NON_PART_OF_DIRECTIVE_IN_PART = new ParserErrorCode.con2('NON_PART_OF_DIRECTIVE_IN_PART', 91, "The part-of directive must be the only directive in a part");
+  static final ParserErrorCode NON_USER_DEFINABLE_OPERATOR = new ParserErrorCode.con2('NON_USER_DEFINABLE_OPERATOR', 92, "The operator '%s' is not user definable");
+  static final ParserErrorCode POSITIONAL_AFTER_NAMED_ARGUMENT = new ParserErrorCode.con2('POSITIONAL_AFTER_NAMED_ARGUMENT', 93, "Positional arguments must occur before named arguments");
+  static final ParserErrorCode POSITIONAL_PARAMETER_OUTSIDE_GROUP = new ParserErrorCode.con2('POSITIONAL_PARAMETER_OUTSIDE_GROUP', 94, "Positional parameters must be enclosed in square brackets ('[' and ']')");
+  static final ParserErrorCode STATIC_AFTER_CONST = new ParserErrorCode.con2('STATIC_AFTER_CONST', 95, "The modifier 'static' should be before the modifier 'const'");
+  static final ParserErrorCode STATIC_AFTER_FINAL = new ParserErrorCode.con2('STATIC_AFTER_FINAL', 96, "The modifier 'static' should be before the modifier 'final'");
+  static final ParserErrorCode STATIC_AFTER_VAR = new ParserErrorCode.con2('STATIC_AFTER_VAR', 97, "The modifier 'static' should be before the modifier 'var'");
+  static final ParserErrorCode STATIC_CONSTRUCTOR = new ParserErrorCode.con2('STATIC_CONSTRUCTOR', 98, "Constructors cannot be static");
+  static final ParserErrorCode STATIC_GETTER_WITHOUT_BODY = new ParserErrorCode.con2('STATIC_GETTER_WITHOUT_BODY', 99, "A 'static' getter must have a body");
+  static final ParserErrorCode STATIC_OPERATOR = new ParserErrorCode.con2('STATIC_OPERATOR', 100, "Operators cannot be static");
+  static final ParserErrorCode STATIC_SETTER_WITHOUT_BODY = new ParserErrorCode.con2('STATIC_SETTER_WITHOUT_BODY', 101, "A 'static' setter must have a body");
+  static final ParserErrorCode STATIC_TOP_LEVEL_DECLARATION = new ParserErrorCode.con2('STATIC_TOP_LEVEL_DECLARATION', 102, "Top-level declarations cannot be declared to be 'static'");
+  static final ParserErrorCode SWITCH_HAS_CASE_AFTER_DEFAULT_CASE = new ParserErrorCode.con2('SWITCH_HAS_CASE_AFTER_DEFAULT_CASE', 103, "The 'default' case should be the last case in a switch statement");
+  static final ParserErrorCode SWITCH_HAS_MULTIPLE_DEFAULT_CASES = new ParserErrorCode.con2('SWITCH_HAS_MULTIPLE_DEFAULT_CASES', 104, "The 'default' case can only be declared once");
+  static final ParserErrorCode TOP_LEVEL_OPERATOR = new ParserErrorCode.con2('TOP_LEVEL_OPERATOR', 105, "Operators must be declared within a class");
+  static final ParserErrorCode UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP = new ParserErrorCode.con2('UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP', 106, "There is no '%s' to open a parameter group");
+  static final ParserErrorCode UNEXPECTED_TOKEN = new ParserErrorCode.con2('UNEXPECTED_TOKEN', 107, "Unexpected token '%s'");
+  static final ParserErrorCode WITH_BEFORE_EXTENDS = new ParserErrorCode.con2('WITH_BEFORE_EXTENDS', 108, "The extends clause must be before the with clause");
+  static final ParserErrorCode WITH_WITHOUT_EXTENDS = new ParserErrorCode.con2('WITH_WITHOUT_EXTENDS', 109, "The with clause cannot be used without an extends clause");
+  static final ParserErrorCode WRONG_SEPARATOR_FOR_NAMED_PARAMETER = new ParserErrorCode.con2('WRONG_SEPARATOR_FOR_NAMED_PARAMETER', 110, "The default value of a named parameter should be preceeded by ':'");
+  static final ParserErrorCode WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER = new ParserErrorCode.con2('WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER', 111, "The default value of a positional parameter should be preceeded by '='");
+  static final ParserErrorCode WRONG_TERMINATOR_FOR_PARAMETER_GROUP = new ParserErrorCode.con2('WRONG_TERMINATOR_FOR_PARAMETER_GROUP', 112, "Expected '%s' to close parameter group");
+  static final ParserErrorCode VAR_AS_TYPE_NAME = new ParserErrorCode.con2('VAR_AS_TYPE_NAME', 113, "The keyword 'var' cannot be used as a type name");
+  static final ParserErrorCode VAR_CLASS = new ParserErrorCode.con2('VAR_CLASS', 114, "Classes cannot be declared to be 'var'");
+  static final ParserErrorCode VAR_RETURN_TYPE = new ParserErrorCode.con2('VAR_RETURN_TYPE', 115, "The return type cannot be 'var'");
+  static final ParserErrorCode VAR_TYPEDEF = new ParserErrorCode.con2('VAR_TYPEDEF', 116, "Type aliases cannot be declared to be 'var'");
+  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(String ___name, int ___ordinal, ErrorSeverity severity2, String message2) {
-    _jtd_constructor_302_impl(___name, ___ordinal, severity2, message2);
+  ParserErrorCode.con1(this.name, this.ordinal, ErrorSeverity severity2, String message2) {
+    _jtd_constructor_309_impl(severity2, message2);
   }
-  _jtd_constructor_302_impl(String ___name, int ___ordinal, ErrorSeverity severity2, String message2) {
-    __name = ___name;
-    __ordinal = ___ordinal;
+  _jtd_constructor_309_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(String ___name, int ___ordinal, String message) {
-    _jtd_constructor_303_impl(___name, ___ordinal, message);
+  ParserErrorCode.con2(this.name, this.ordinal, String message) {
+    _jtd_constructor_310_impl(message);
   }
-  _jtd_constructor_303_impl(String ___name, int ___ordinal, String message) {
-    _jtd_constructor_302_impl(___name, ___ordinal, ErrorSeverity.ERROR, message);
+  _jtd_constructor_310_impl(String message) {
+    _jtd_constructor_309_impl(ErrorSeverity.ERROR, message);
   }
   ErrorSeverity get errorSeverity => _severity;
   String get message => _message;
   ErrorType get type => ErrorType.SYNTACTIC_ERROR;
-  bool needsRecompilation() => true;
-  int compareTo(ParserErrorCode other) => __ordinal - other.__ordinal;
-  String toString() => __name;
+  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.
@@ -5199,6 +5538,9 @@
       for (String line in StringUtils.split(token.lexeme, "\n")) {
         if (firstLine) {
           firstLine = false;
+          if (node.isDocumentation()) {
+            nl2();
+          }
         } else {
           line = " ${line.trim()}";
           line = StringUtils.replace(line, "/*", "/ *");
@@ -5816,6 +6158,7 @@
     nl();
     indent();
   }
+  
   /**
    * Safely visit the given node.
    * @param node the node to be visited
@@ -5825,6 +6168,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
@@ -5836,6 +6180,7 @@
       _writer.print(suffix);
     }
   }
+  
   /**
    * Safely visit the given node, printing the prefix before the node if it is non-<code>null</code>
    * .
@@ -5848,6 +6193,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
@@ -5859,6 +6205,7 @@
       _writer.print(suffix);
     }
   }
+  
   /**
    * Print a list of nodes without any separation.
    * @param nodes the nodes to be printed
@@ -5867,6 +6214,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
@@ -5886,6 +6234,7 @@
       }
     }
   }
+  
   /**
    * Print a list of nodes, separated by the given separator.
    * @param nodes the nodes to be printed
@@ -5906,6 +6255,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 42147fa..b87c5af 100644
--- a/pkg/analyzer_experimental/lib/src/generated/resolver.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/resolver.dart
@@ -13,25 +13,21 @@
 import 'utilities_dart.dart';
 import 'ast.dart';
 import 'parser.dart' show Parser, ParserErrorCode;
-import 'sdk.dart' show DartSdk;
-import 'element.dart' hide HideCombinator, ShowCombinator;
+import 'sdk.dart' show DartSdk, SdkLibrary;
+import 'element.dart' hide Annotation, HideCombinator, ShowCombinator;
 import 'html.dart' as ht;
 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 {
-  /**
-   * Initialize a newly created compilation unit element builder.
-   * @param analysisContext the analysis context in which the element model will be built
-   */
-  CompilationUnitBuilder() : super() {
-  }
+  
   /**
    * Build the compilation unit element for the given source.
    * @param source the source describing the compilation unit
@@ -57,28 +53,34 @@
     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
@@ -123,12 +125,7 @@
     element.type = interfaceType;
     List<ConstructorElement> constructors2 = holder.constructors;
     if (constructors2.length == 0) {
-      ConstructorElementImpl constructor = new ConstructorElementImpl(null);
-      constructor.synthetic = true;
-      FunctionTypeImpl type = new FunctionTypeImpl.con1(constructor);
-      type.returnType = interfaceType;
-      constructor.type = type;
-      constructors2 = <ConstructorElement> [constructor];
+      constructors2 = createDefaultConstructors(interfaceType);
     }
     element.abstract = node.abstractKeyword != null;
     element.accessors = holder.accessors;
@@ -153,6 +150,7 @@
     InterfaceTypeImpl interfaceType = new InterfaceTypeImpl.con1(element);
     interfaceType.typeArguments = createTypeVariableTypes(typeVariables2);
     element.type = interfaceType;
+    element.constructors = createDefaultConstructors(interfaceType);
     _currentHolder.addType(element);
     className.element = element;
     return null;
@@ -248,7 +246,6 @@
       SimpleIdentifier parameterName = node.identifier;
       FieldFormalParameterElementImpl parameter = new FieldFormalParameterElementImpl(parameterName);
       parameter.const3 = node.isConst();
-      parameter.initializingFormal = true;
       parameter.final2 = node.isFinal();
       parameter.parameterKind = node.kind;
       _currentHolder.addParameter(parameter);
@@ -290,6 +287,7 @@
         if (field == null) {
           field = new FieldElementImpl.con2(node.name.name);
           field.final2 = true;
+          field.static = true;
           _currentHolder.addField(field);
         }
         if (matches(property, sc.Keyword.GET)) {
@@ -299,6 +297,7 @@
           getter.localVariables = holder.localVariables;
           getter.variable = field;
           getter.getter = true;
+          getter.static = true;
           field.getter = getter;
           _currentHolder.addAccessor(getter);
           propertyNameNode.element = getter;
@@ -310,6 +309,7 @@
           setter.parameters = holder.parameters;
           setter.variable = field;
           setter.setter = true;
+          setter.static = true;
           field.setter = setter;
           field.final2 = false;
           _currentHolder.addAccessor(setter);
@@ -395,6 +395,7 @@
     } finally {
       _inFunction = wasInFunction;
     }
+    bool isStatic2 = node.isStatic();
     sc.Token property = node.propertyKeyword;
     if (property == null) {
       SimpleIdentifier methodName = node.name;
@@ -408,7 +409,7 @@
       element.labels = holder.labels;
       element.localVariables = holder.localVariables;
       element.parameters = holder.parameters;
-      element.static = node.isStatic();
+      element.static = isStatic2;
       _currentHolder.addMethod(element);
       methodName.element = element;
     } else {
@@ -418,7 +419,7 @@
       if (field == null) {
         field = new FieldElementImpl.con2(node.name.name);
         field.final2 = true;
-        field.static = matches(node.modifierKeyword, sc.Keyword.STATIC);
+        field.static = isStatic2;
         _currentHolder.addField(field);
       }
       if (matches(property, sc.Keyword.GET)) {
@@ -427,7 +428,9 @@
         getter.labels = holder.labels;
         getter.localVariables = holder.localVariables;
         getter.variable = field;
+        getter.abstract = node.body is EmptyFunctionBody && node.externalKeyword == null;
         getter.getter = true;
+        getter.static = isStatic2;
         field.getter = getter;
         _currentHolder.addAccessor(getter);
         propertyNameNode.element = getter;
@@ -438,7 +441,9 @@
         setter.localVariables = holder.localVariables;
         setter.parameters = holder.parameters;
         setter.variable = field;
+        setter.abstract = node.body is EmptyFunctionBody && !matches(node.externalKeyword, sc.Keyword.EXTERNAL);
         setter.setter = true;
+        setter.static = isStatic2;
         field.setter = setter;
         field.final2 = false;
         _currentHolder.addAccessor(setter);
@@ -554,22 +559,38 @@
     }
     if (element is PropertyInducingElementImpl) {
       PropertyInducingElementImpl variable = element as PropertyInducingElementImpl;
+      if (_inFieldContext) {
+        ((variable as FieldElementImpl)).static = matches(((node.parent.parent as FieldDeclaration)).keyword, sc.Keyword.STATIC);
+      }
       PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl.con2(variable);
       getter.getter = true;
+      getter.static = variable.isStatic();
       _currentHolder.addAccessor(getter);
       variable.getter = getter;
       if (!isFinal) {
         PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl.con2(variable);
         setter.setter = true;
+        setter.static = variable.isStatic();
         _currentHolder.addAccessor(setter);
         variable.setter = setter;
       }
-      if (_inFieldContext) {
-        ((variable as FieldElementImpl)).static = matches(((node.parent.parent as FieldDeclaration)).keyword, sc.Keyword.STATIC);
-      }
     }
     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
+   * @return the {@link ConstructorElement}s array with the single default constructor element
+   */
+  List<ConstructorElement> createDefaultConstructors(InterfaceTypeImpl interfaceType) {
+    ConstructorElementImpl constructor = new ConstructorElementImpl(null);
+    constructor.synthetic = true;
+    FunctionTypeImpl type = new FunctionTypeImpl.con1(constructor);
+    type.returnType = interfaceType;
+    constructor.type = type;
+    return <ConstructorElement> [constructor];
+  }
   List<Type2> createTypeVariableTypes(List<TypeVariableElement> typeVariables) {
     int typeVariableCount = typeVariables.length;
     List<Type2> typeArguments = new List<Type2>(typeVariableCount);
@@ -581,6 +602,7 @@
     }
     return typeArguments;
   }
+  
   /**
    * Return the body of the function that contains the given parameter, or {@code null} if no
    * function body could be found.
@@ -599,6 +621,7 @@
     }
     return null;
   }
+  
   /**
    * Return {@code true} if the given token is a token for the given keyword.
    * @param token the token being tested
@@ -606,6 +629,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
@@ -622,6 +646,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
@@ -639,6 +664,7 @@
     }
   }
 }
+
 /**
  * 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.
@@ -657,11 +683,6 @@
   List<VariableElement> _topLevelVariables = new List<VariableElement>();
   List<ClassElement> _types = new List<ClassElement>();
   List<TypeVariableElement> _typeVariables = new List<TypeVariableElement>();
-  /**
-   * Initialize a newly created element holder.
-   */
-  ElementHolder() : super() {
-  }
   void addAccessor(PropertyAccessorElement element) {
     _accessors.add(element);
   }
@@ -779,6 +800,7 @@
     return new List.from(_typeVariables);
   }
 }
+
 /**
  * Instances of the class {@code HtmlUnitBuilder} build an element model for a single HTML unit.
  */
@@ -788,35 +810,51 @@
   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.
    */
-  AnalysisErrorListener _errorListener;
+  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
-   * @param errorListener the error listener to which errors will be reported
    */
-  HtmlUnitBuilder(InternalAnalysisContext context, AnalysisErrorListener errorListener) {
+  HtmlUnitBuilder(InternalAnalysisContext context) {
     this._context = context;
-    this._errorListener = errorListener;
+    this._errorListener = new RecordingErrorListener();
   }
+  
   /**
    * Build the HTML element for the given source.
    * @param source the source describing the compilation unit
@@ -824,6 +862,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
@@ -840,62 +879,107 @@
     unit.element = result;
     return result;
   }
+  
+  /**
+   * Return the listener to which analysis errors will be reported.
+   * @return the listener to which analysis errors will be reported
+   */
+  RecordingErrorListener get errorListener => _errorListener;
+  
+  /**
+   * Return an array containing information about all of the libraries that were resolved.
+   * @return an array containing the libraries that were resolved
+   */
+  Set<Library> get resolvedLibraries => _resolvedLibraries;
   Object visitHtmlUnit(ht.HtmlUnit node) {
+    _parentNodes = new List<ht.XmlTagNode>();
     _scripts = new List<HtmlScriptElement>();
-    node.visitChildren(this);
-    _htmlElement.scripts = new List.from(_scripts);
-    _scripts = null;
+    try {
+      node.visitChildren(this);
+      _htmlElement.scripts = new List.from(_scripts);
+    } finally {
+      _scripts = null;
+      _parentNodes = null;
+    }
     return null;
   }
   Object visitXmlAttributeNode(ht.XmlAttributeNode node) => null;
   Object visitXmlTagNode(ht.XmlTagNode node) {
-    if (isScriptNode(node)) {
-      Source htmlSource = _htmlElement.source;
-      ht.XmlAttributeNode scriptAttribute = getScriptSourcePath(node);
-      String scriptSourcePath = scriptAttribute == null ? null : scriptAttribute.text;
-      if (identical(node.attributeEnd.type, ht.TokenType.GT) && scriptSourcePath == null) {
-        EmbeddedHtmlScriptElementImpl script = new EmbeddedHtmlScriptElementImpl(node);
-        String contents = node.content;
-        int attributeEnd2 = node.attributeEnd.end;
-        LineInfo_Location location = _lineInfo.getLocation(attributeEnd2);
-        sc.StringScanner scanner = new sc.StringScanner(htmlSource, contents, _errorListener);
-        scanner.setSourceStart(location.lineNumber, location.columnNumber, attributeEnd2);
-        sc.Token firstToken = scanner.tokenize();
-        List<int> lineStarts2 = scanner.lineStarts;
-        Parser parser = new Parser(null, _errorListener);
-        CompilationUnit unit = parser.parseCompilationUnit(firstToken);
-        unit.lineInfo = new LineInfo(lineStarts2);
-        try {
-          CompilationUnitBuilder builder = new CompilationUnitBuilder();
-          CompilationUnitElementImpl elem = builder.buildCompilationUnit(htmlSource, unit);
-          LibraryElementImpl library = new LibraryElementImpl(_context, null);
-          library.definingCompilationUnit = elem;
-          script.scriptLibrary = library;
-        } on AnalysisException catch (exception) {
-          print(exception);
+    if (_parentNodes.contains(node)) {
+      JavaStringBuilder builder = new JavaStringBuilder();
+      builder.append("Found circularity in XML nodes: ");
+      bool first = true;
+      for (ht.XmlTagNode pathNode in _parentNodes) {
+        if (first) {
+          first = false;
+        } else {
+          builder.append(", ");
         }
-        _scripts.add(script);
-      } else {
-        ExternalHtmlScriptElementImpl script = new ExternalHtmlScriptElementImpl(node);
-        if (scriptSourcePath != null) {
-          try {
-            Uri.parse(scriptSourcePath);
-            Source scriptSource = _context.sourceFactory.resolveUri(htmlSource, scriptSourcePath);
-            script.scriptSource = scriptSource;
-            if (!scriptSource.exists()) {
-              reportError(HtmlWarningCode.URI_DOES_NOT_EXIST, scriptAttribute.offset + 1, scriptSourcePath.length, []);
-            }
-          } on URISyntaxException catch (exception) {
-            reportError(HtmlWarningCode.INVALID_URI, scriptAttribute.offset + 1, scriptSourcePath.length, []);
-          }
+        String tagName = pathNode.tag.lexeme;
+        if (identical(pathNode, node)) {
+          builder.append("*");
+          builder.append(tagName);
+          builder.append("*");
+        } else {
+          builder.append(tagName);
         }
-        _scripts.add(script);
       }
-    } else {
-      node.visitChildren(this);
+      AnalysisEngine.instance.logger.logError(builder.toString());
+      return null;
+    }
+    _parentNodes.add(node);
+    try {
+      if (isScriptNode(node)) {
+        Source htmlSource = _htmlElement.source;
+        ht.XmlAttributeNode scriptAttribute = getScriptSourcePath(node);
+        String scriptSourcePath = scriptAttribute == null ? null : scriptAttribute.text;
+        if (identical(node.attributeEnd.type, ht.TokenType.GT) && scriptSourcePath == null) {
+          EmbeddedHtmlScriptElementImpl script = new EmbeddedHtmlScriptElementImpl(node);
+          String contents = node.content;
+          int attributeEnd2 = node.attributeEnd.end;
+          LineInfo_Location location = _lineInfo.getLocation(attributeEnd2);
+          sc.StringScanner scanner = new sc.StringScanner(htmlSource, contents, _errorListener);
+          scanner.setSourceStart(location.lineNumber, location.columnNumber, attributeEnd2);
+          sc.Token firstToken = scanner.tokenize();
+          List<int> lineStarts2 = scanner.lineStarts;
+          Parser parser = new Parser(htmlSource, _errorListener);
+          CompilationUnit unit = parser.parseCompilationUnit(firstToken);
+          unit.lineInfo = new LineInfo(lineStarts2);
+          try {
+            LibraryResolver resolver = new LibraryResolver(_context);
+            LibraryElementImpl library = resolver.resolveEmbeddedLibrary(htmlSource, unit, true) as LibraryElementImpl;
+            script.scriptLibrary = library;
+            _resolvedLibraries.addAll(resolver.resolvedLibraries);
+            _errorListener.addAll(resolver.errorListener);
+          } on AnalysisException catch (exception) {
+            AnalysisEngine.instance.logger.logError3(exception);
+          }
+          _scripts.add(script);
+        } else {
+          ExternalHtmlScriptElementImpl script = new ExternalHtmlScriptElementImpl(node);
+          if (scriptSourcePath != null) {
+            try {
+              parseUriWithException(scriptSourcePath);
+              Source scriptSource = _context.sourceFactory.resolveUri(htmlSource, scriptSourcePath);
+              script.scriptSource = scriptSource;
+              if (!scriptSource.exists()) {
+                reportError(HtmlWarningCode.URI_DOES_NOT_EXIST, scriptAttribute.offset + 1, scriptSourcePath.length, [scriptSourcePath]);
+              }
+            } on URISyntaxException catch (exception) {
+              reportError(HtmlWarningCode.INVALID_URI, scriptAttribute.offset + 1, scriptSourcePath.length, [scriptSourcePath]);
+            }
+          }
+          _scripts.add(script);
+        }
+      } else {
+        node.visitChildren(this);
+      }
+    } finally {
+      _parentNodes.remove(node);
     }
     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
@@ -909,6 +993,7 @@
     }
     return null;
   }
+  
   /**
    * Determine if the specified node is a Dart script.
    * @param node the node to be tested (not {@code null})
@@ -931,6 +1016,7 @@
     }
     return false;
   }
+  
   /**
    * Report an error with the given error code at the given location. Use the given arguments to
    * compose the error message.
@@ -943,40 +1029,42 @@
     _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;
-  /**
-   * Initialize a newly created resolver.
-   */
-  DeclarationResolver() : super() {
-  }
+  
   /**
    * Resolve the declarations within the given compilation unit to the elements rooted at the given
    * element.
@@ -1297,6 +1385,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
@@ -1315,6 +1404,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.
@@ -1330,6 +1420,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
@@ -1338,6 +1429,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.
@@ -1350,6 +1442,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.
@@ -1358,14 +1451,15 @@
    * @param offset the offset of the name of the element to be returned
    * @return the element with the given name and offset
    */
-  Element find4(List<Element> elements, String name2, int offset) {
+  Element find4(List<Element> elements, String name, int offset) {
     for (Element element in elements) {
-      if (element.name == name2 && element.nameOffset == offset) {
+      if (element.displayName == name && element.nameOffset == offset) {
         return element;
       }
     }
     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
@@ -1381,6 +1475,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.
@@ -1399,7 +1494,7 @@
             return element;
           }
         } else {
-          if (prefixElement != null && prefix2.name == prefixElement.name) {
+          if (prefixElement != null && prefix2.name == prefixElement.displayName) {
             return element;
           }
         }
@@ -1407,6 +1502,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.
@@ -1426,6 +1522,7 @@
     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:
@@ -1474,10 +1571,74 @@
  * @coverage dart.engine.resolver
  */
 class ElementResolver extends SimpleASTVisitor<Object> {
+  
+  /**
+   * @return {@code true} if the given identifier is the return type of a constructor declaration.
+   */
+  static bool isConstructorReturnType(SimpleIdentifier node) {
+    ASTNode parent2 = node.parent;
+    if (parent2 is ConstructorDeclaration) {
+      ConstructorDeclaration constructor = parent2 as ConstructorDeclaration;
+      return identical(constructor.returnType, node);
+    }
+    return false;
+  }
+  
+  /**
+   * @return {@code true} if the given identifier is the return type of a factory constructor
+   * declaration.
+   */
+  static bool isFactoryConstructorReturnType(SimpleIdentifier node) {
+    ASTNode parent2 = node.parent;
+    if (parent2 is ConstructorDeclaration) {
+      ConstructorDeclaration constructor = parent2 as ConstructorDeclaration;
+      return identical(constructor.returnType, node) && constructor.factoryKeyword != null;
+    }
+    return false;
+  }
+  
+  /**
+   * Checks if the given 'super' expression is used in the valid context.
+   * @param node the 'super' expression to analyze
+   * @return {@code true} if the given 'super' expression is in the valid context
+   */
+  static bool isSuperInValidContext(SuperExpression node) {
+    for (ASTNode n = node; n != null; n = n.parent) {
+      if (n is CompilationUnit) {
+        return false;
+      }
+      if (n is ConstructorDeclaration) {
+        ConstructorDeclaration constructor = n as ConstructorDeclaration;
+        return constructor.factoryKeyword == null;
+      }
+      if (n is ConstructorFieldInitializer) {
+        return false;
+      }
+      if (n is MethodDeclaration) {
+        MethodDeclaration method = n as MethodDeclaration;
+        return !method.isStatic();
+      }
+    }
+    return false;
+  }
+  
   /**
    * The resolver driving this participant.
    */
   ResolverVisitor _resolver;
+  
+  /**
+   * 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
@@ -1486,18 +1647,21 @@
     this._resolver = resolver;
   }
   Object visitAssignmentExpression(AssignmentExpression node) {
-    sc.TokenType operator2 = node.operator.type;
-    if (operator2 != sc.TokenType.EQ) {
-      operator2 = operatorFromCompoundAssignment(operator2);
-      Expression leftNode = node.leftHandSide;
-      if (leftNode != null) {
-        Type2 leftType = getType(leftNode);
-        if (leftType != null) {
-          MethodElement method = lookUpMethod(leftType, operator2.lexeme);
-          if (method != null) {
-            node.element = method;
-          } else {
-          }
+    sc.Token operator2 = node.operator;
+    sc.TokenType operatorType = operator2.type;
+    if (operatorType != sc.TokenType.EQ) {
+      operatorType = operatorFromCompoundAssignment(operatorType);
+      Expression leftHandSide2 = node.leftHandSide;
+      if (leftHandSide2 != null) {
+        String methodName = operatorType.lexeme;
+        Type2 staticType = getStaticType(leftHandSide2);
+        MethodElement staticMethod = lookUpMethod(leftHandSide2, staticType, methodName);
+        node.staticElement = staticMethod;
+        Type2 propagatedType = getPropagatedType(leftHandSide2);
+        MethodElement propagatedMethod = lookUpMethod(leftHandSide2, propagatedType, methodName);
+        node.element = select3(staticMethod, propagatedMethod);
+        if (shouldReportMissingMember(staticType, staticMethod) && (propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
+          _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_METHOD, operator2, [methodName, staticType.displayName]);
         }
       }
     }
@@ -1506,18 +1670,18 @@
   Object visitBinaryExpression(BinaryExpression node) {
     sc.Token operator2 = node.operator;
     if (operator2.isUserDefinableOperator()) {
-      Type2 leftType = getType(node.leftOperand);
-      if (leftType == null || leftType.isDynamic()) {
-        return null;
-      } else if (leftType is FunctionType) {
-        leftType = _resolver.typeProvider.functionType;
-      }
-      String methodName = operator2.lexeme;
-      MethodElement member = lookUpMethod(leftType, methodName);
-      if (member == null) {
-        _resolver.reportError3(StaticWarningCode.UNDEFINED_OPERATOR, operator2, [methodName, leftType.name]);
-      } else {
-        node.element = member;
+      Expression leftOperand2 = node.leftOperand;
+      if (leftOperand2 != null) {
+        String methodName = operator2.lexeme;
+        Type2 staticType = getStaticType(leftOperand2);
+        MethodElement staticMethod = lookUpMethod(leftOperand2, staticType, methodName);
+        node.staticElement = staticMethod;
+        Type2 propagatedType = getPropagatedType(leftOperand2);
+        MethodElement propagatedMethod = lookUpMethod(leftOperand2, propagatedType, methodName);
+        node.element = select3(staticMethod, propagatedMethod);
+        if (shouldReportMissingMember(staticType, staticMethod) && (propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
+          _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_OPERATOR, operator2, [methodName, staticType.displayName]);
+        }
       }
     }
     return null;
@@ -1530,19 +1694,37 @@
     }
     return null;
   }
+  Object visitClassDeclaration(ClassDeclaration node) {
+    setMetadata(node.element, node);
+    return null;
+  }
+  Object visitClassTypeAlias(ClassTypeAlias node) {
+    setMetadata(node.element, node);
+    return null;
+  }
   Object visitCommentReference(CommentReference node) {
     Identifier identifier2 = node.identifier;
     if (identifier2 is SimpleIdentifier) {
       SimpleIdentifier simpleIdentifier = identifier2 as SimpleIdentifier;
-      visitSimpleIdentifier(simpleIdentifier);
-      Element element2 = simpleIdentifier.element;
-      if (element2 != null) {
-        if (element2.library != _resolver.definingLibrary) {
+      Element element = resolveSimpleIdentifier(simpleIdentifier);
+      if (element == null) {
+        element = findImportWithoutPrefix(simpleIdentifier);
+        if (element is MultiplyDefinedElement) {
+          element = null;
         }
+      }
+      if (element == null) {
+      } else {
+        if (element.library != _resolver.definingLibrary) {
+        }
+        recordResolution(simpleIdentifier, element);
         if (node.newKeyword != null) {
-          if (element2 is ClassElement) {
-            ConstructorElement constructor = ((element2 as ClassElement)).unnamedConstructor;
-            recordResolution(simpleIdentifier, constructor);
+          if (element is ClassElement) {
+            ConstructorElement constructor = ((element as ClassElement)).unnamedConstructor;
+            if (constructor == null) {
+            } else {
+              recordResolution(simpleIdentifier, constructor);
+            }
           } else {
           }
         }
@@ -1551,33 +1733,41 @@
       PrefixedIdentifier prefixedIdentifier = identifier2 as PrefixedIdentifier;
       SimpleIdentifier prefix2 = prefixedIdentifier.prefix;
       SimpleIdentifier name = prefixedIdentifier.identifier;
-      visitSimpleIdentifier(prefix2);
-      Element element3 = prefix2.element;
-      if (element3 != null) {
-        if (element3 is PrefixElement) {
-          element3 = _resolver.nameScope.lookup(identifier2, _resolver.definingLibrary);
-          recordResolution(name, element3);
+      Element element = resolveSimpleIdentifier(prefix2);
+      if (element == null) {
+      } else {
+        if (element is PrefixElement) {
+          recordResolution(prefix2, element);
+          element = _resolver.nameScope.lookup(identifier2, _resolver.definingLibrary);
+          recordResolution(name, element);
           return null;
         }
-        if (element3.library != _resolver.definingLibrary) {
+        LibraryElement library2 = element.library;
+        if (library2 == null) {
+          AnalysisEngine.instance.logger.logError("Found element with null library: ${element.name}");
+        } else if (library2 != _resolver.definingLibrary) {
         }
+        recordResolution(name, element);
         if (node.newKeyword == null) {
-          if (element3 is ClassElement) {
-            Element memberElement = lookupGetterOrMethod(((element3 as ClassElement)).type, name.name);
+          if (element is ClassElement) {
+            Element memberElement = lookupGetterOrMethod(((element as ClassElement)).type, name.name);
             if (memberElement == null) {
-              memberElement = ((element3 as ClassElement)).getNamedConstructor(name.name);
+              memberElement = ((element as ClassElement)).getNamedConstructor(name.name);
+              if (memberElement == null) {
+                memberElement = lookUpSetter(prefix2, ((element as ClassElement)).type, name.name);
+              }
             }
             if (memberElement == null) {
-              reportGetterOrSetterNotFound(prefixedIdentifier, name, element3.name);
             } else {
               recordResolution(name, memberElement);
             }
           } else {
           }
         } else {
-          if (element3 is ClassElement) {
-            ConstructorElement constructor = ((element3 as ClassElement)).getNamedConstructor(name.name);
-            if (constructor != null) {
+          if (element is ClassElement) {
+            ConstructorElement constructor = ((element as ClassElement)).getNamedConstructor(name.name);
+            if (constructor == null) {
+            } else {
               recordResolution(name, constructor);
             }
           } else {
@@ -1587,24 +1777,41 @@
     }
     return null;
   }
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    super.visitConstructorDeclaration(node);
+    ConstructorElement element2 = node.element;
+    if (element2 is ConstructorElementImpl) {
+      ConstructorElementImpl constructorElement = element2 as ConstructorElementImpl;
+      ConstructorName redirectedNode = node.redirectedConstructor;
+      if (redirectedNode != null) {
+        ConstructorElement redirectedElement = redirectedNode.element;
+        constructorElement.redirectedConstructor = redirectedElement;
+      }
+      for (ConstructorInitializer initializer in node.initializers) {
+        if (initializer is RedirectingConstructorInvocation) {
+          ConstructorElement redirectedElement = ((initializer as RedirectingConstructorInvocation)).element;
+          constructorElement.redirectedConstructor = redirectedElement;
+        }
+      }
+      setMetadata(constructorElement, node);
+    }
+    return null;
+  }
   Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
-    FieldElement fieldElement = null;
     SimpleIdentifier fieldName2 = node.fieldName;
     ClassElement enclosingClass2 = _resolver.enclosingClass;
-    fieldElement = ((enclosingClass2 as ClassElementImpl)).getField(fieldName2.name);
-    if (fieldElement == null) {
+    FieldElement fieldElement = ((enclosingClass2 as ClassElementImpl)).getField(fieldName2.name);
+    recordResolution(fieldName2, fieldElement);
+    if (fieldElement == null || fieldElement.isSynthetic()) {
       _resolver.reportError(CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTANT_FIELD, node, [fieldName2]);
-    } else if (!fieldElement.isSynthetic()) {
-      recordResolution(fieldName2, fieldElement);
-      if (fieldElement.isStatic()) {
-        _resolver.reportError(CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD, node, [fieldName2]);
-      }
+    } else if (fieldElement.isStatic()) {
+      _resolver.reportError(CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD, node, [fieldName2]);
     }
     return null;
   }
   Object visitConstructorName(ConstructorName node) {
     Type2 type2 = node.type.type;
-    if (type2 is DynamicTypeImpl) {
+    if (type2 != null && type2.isDynamic()) {
       return null;
     } else if (type2 is! InterfaceType) {
       ASTNode parent2 = node.parent;
@@ -1616,15 +1823,18 @@
       }
       return null;
     }
-    ClassElement classElement = ((type2 as InterfaceType)).element;
     ConstructorElement constructor;
     SimpleIdentifier name2 = node.name;
+    InterfaceType interfaceType = type2 as InterfaceType;
+    LibraryElement definingLibrary2 = _resolver.definingLibrary;
     if (name2 == null) {
-      constructor = classElement.unnamedConstructor;
+      constructor = interfaceType.lookUpConstructor(null, definingLibrary2);
     } else {
-      constructor = classElement.getNamedConstructor(name2.name);
+      constructor = interfaceType.lookUpConstructor(name2.name, definingLibrary2);
+      name2.staticElement = constructor;
       name2.element = constructor;
     }
+    node.staticElement = constructor;
     node.element = constructor;
     return null;
   }
@@ -1636,10 +1846,15 @@
     }
     return null;
   }
+  Object visitDeclaredIdentifier(DeclaredIdentifier node) {
+    setMetadata(node.element, node);
+    return null;
+  }
   Object visitExportDirective(ExportDirective node) {
     Element element2 = node.element;
     if (element2 is ExportElement) {
       resolveCombinators(((element2 as ExportElement)).exportedLibrary, node.combinators);
+      setMetadata(element2, node);
     }
     return null;
   }
@@ -1648,37 +1863,51 @@
     ClassElement classElement = _resolver.enclosingClass;
     if (classElement != null) {
       FieldElement fieldElement = ((classElement as ClassElementImpl)).getField(fieldName);
-      if (fieldElement != null) {
-        if (!fieldElement.isSynthetic()) {
-          ParameterElement parameterElement = node.element;
-          if (parameterElement is FieldFormalParameterElementImpl) {
-            FieldFormalParameterElementImpl fieldFormal = parameterElement as FieldFormalParameterElementImpl;
-            fieldFormal.field = fieldElement;
-            Type2 declaredType = fieldFormal.type;
-            Type2 fieldType = fieldElement.type;
-            if (node.type == null) {
-              fieldFormal.type = fieldType;
-            }
-            if (fieldElement.isStatic()) {
-              _resolver.reportError(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, node, [fieldName]);
-            } else if (declaredType != null && fieldType != null && !declaredType.isAssignableTo(fieldType)) {
-              _resolver.reportError(StaticWarningCode.FIELD_INITIALIZER_WITH_INVALID_TYPE, node, [declaredType.name, fieldType.name]);
-            }
+      if (fieldElement == null) {
+        _resolver.reportError(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
+      } else {
+        ParameterElement parameterElement = node.element;
+        if (parameterElement is FieldFormalParameterElementImpl) {
+          FieldFormalParameterElementImpl fieldFormal = parameterElement as FieldFormalParameterElementImpl;
+          fieldFormal.field = fieldElement;
+          Type2 declaredType = fieldFormal.type;
+          Type2 fieldType = fieldElement.type;
+          if (node.type == null) {
+            fieldFormal.type = fieldType;
+          }
+          if (fieldElement.isSynthetic()) {
+            _resolver.reportError(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
+          } else if (fieldElement.isStatic()) {
+            _resolver.reportError(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, node, [fieldName]);
+          } else if (declaredType != null && fieldType != null && !declaredType.isAssignableTo(fieldType)) {
+            _resolver.reportError(StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, node, [declaredType.displayName, fieldType.displayName]);
+          }
+        } else {
+          if (fieldElement.isSynthetic()) {
+            _resolver.reportError(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
+          } else if (fieldElement.isStatic()) {
+            _resolver.reportError(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, node, [fieldName]);
           }
         }
-      } else {
-        _resolver.reportError(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
       }
     }
     return super.visitFieldFormalParameter(node);
   }
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    setMetadata(node.element, node);
+    return null;
+  }
   Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) => null;
+  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+    setMetadata(node.element, node);
+    return null;
+  }
   Object visitImportDirective(ImportDirective node) {
     SimpleIdentifier prefixNode = node.prefix;
     if (prefixNode != null) {
       String prefixName = prefixNode.name;
       for (PrefixElement prefixElement in _resolver.definingLibrary.prefixes) {
-        if (prefixElement.name == prefixName) {
+        if (prefixElement.displayName == prefixName) {
           recordResolution(prefixNode, prefixElement);
           break;
         }
@@ -1686,176 +1915,159 @@
     }
     Element element2 = node.element;
     if (element2 is ImportElement) {
-      resolveCombinators(((element2 as ImportElement)).importedLibrary, node.combinators);
+      ImportElement importElement = element2 as ImportElement;
+      LibraryElement library = importElement.importedLibrary;
+      if (library != null) {
+        resolveCombinators(library, node.combinators);
+      }
+      setMetadata(element2, node);
     }
     return null;
   }
   Object visitIndexExpression(IndexExpression node) {
-    Type2 arrayType = getType(node.realTarget);
-    if (arrayType == null || arrayType.isDynamic()) {
-      return null;
+    Expression target = node.realTarget;
+    Type2 staticType = getStaticType(target);
+    Type2 propagatedType = getPropagatedType(target);
+    if (node.inGetterContext()) {
+      String methodName = sc.TokenType.INDEX.lexeme;
+      bool error = lookUpCheckIndexOperator(node, target, methodName, staticType, propagatedType);
+      if (error) {
+        return null;
+      }
     }
-    String operator;
     if (node.inSetterContext()) {
-      operator = sc.TokenType.INDEX_EQ.lexeme;
-    } else {
-      operator = sc.TokenType.INDEX.lexeme;
-    }
-    MethodElement member = lookUpMethod(arrayType, operator);
-    if (member == null) {
-      _resolver.reportError(StaticWarningCode.UNDEFINED_OPERATOR, node, [operator, arrayType.name]);
-    } else {
-      node.element = member;
+      String methodName = sc.TokenType.INDEX_EQ.lexeme;
+      lookUpCheckIndexOperator(node, target, methodName, staticType, propagatedType);
     }
     return null;
   }
   Object visitInstanceCreationExpression(InstanceCreationExpression node) {
     ConstructorElement invokedConstructor = node.constructorName.element;
+    node.staticElement = invokedConstructor;
     node.element = invokedConstructor;
-    resolveNamedArguments(node.argumentList, invokedConstructor);
+    resolveArgumentsToParameters(node.isConst(), node.argumentList, invokedConstructor);
+    return null;
+  }
+  Object visitLibraryDirective(LibraryDirective node) {
+    setMetadata(node.element, node);
+    return null;
+  }
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    setMetadata(node.element, node);
     return null;
   }
   Object visitMethodInvocation(MethodInvocation node) {
     SimpleIdentifier methodName2 = node.methodName;
     Expression target = node.realTarget;
-    Element element;
-    if (target == null) {
-      element = _resolver.nameScope.lookup(methodName2, _resolver.definingLibrary);
-      if (element == null) {
-        ClassElement enclosingClass2 = _resolver.enclosingClass;
-        if (enclosingClass2 != null) {
-          InterfaceType enclosingType = enclosingClass2.type;
-          element = lookUpMethod(enclosingType, methodName2.name);
-          if (element == null) {
-            PropertyAccessorElement getter = lookUpGetter(enclosingType, methodName2.name);
-            if (getter != null) {
-              FunctionType getterType = getter.type;
-              if (getterType != null) {
-                Type2 returnType2 = getterType.returnType;
-                if (!isExecutableType(returnType2)) {
-                  _resolver.reportError(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, methodName2, [methodName2.name]);
-                }
-              }
-              recordResolution(methodName2, getter);
-              return null;
-            }
-          }
-        }
-      }
-    } else {
-      Type2 targetType = getType(target);
-      if (targetType is InterfaceType) {
-        InterfaceType classType = targetType as InterfaceType;
-        element = lookUpMethod(classType, methodName2.name);
-        if (element == null) {
-          PropertyAccessorElement accessor = classType.getGetter(methodName2.name);
-          if (accessor != null) {
-            Type2 returnType3 = accessor.type.returnType;
-            if (!isExecutableType(returnType3)) {
-              _resolver.reportError(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, methodName2, [methodName2.name]);
-              return null;
-            }
-            element = accessor;
-          }
-        }
-        if (element == null && target is SuperExpression) {
-          _resolver.reportError(StaticTypeWarningCode.UNDEFINED_SUPER_METHOD, methodName2, [methodName2.name, targetType.element.name]);
-          return null;
-        }
-      } else if (target is SimpleIdentifier) {
-        Element targetElement = ((target as SimpleIdentifier)).element;
-        if (targetElement is PrefixElement) {
-          String name3 = "${((target as SimpleIdentifier)).name}.${methodName2}";
-          Identifier functionName = new Identifier_8(name3);
-          element = _resolver.nameScope.lookup(functionName, _resolver.definingLibrary);
-        } else {
-          return null;
-        }
-      } else {
-        return null;
-      }
-    }
-    ExecutableElement invokedMethod = null;
-    if (element is PropertyAccessorElement) {
-      PropertyAccessorElement getter = element as PropertyAccessorElement;
-      FunctionType getterType = getter.type;
-      if (getterType != null) {
-        Type2 returnType4 = getterType.returnType;
-        if (!isExecutableType(returnType4)) {
-          _resolver.reportError(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, methodName2, [methodName2.name]);
-        }
-      }
-      recordResolution(methodName2, element);
+    Element staticElement;
+    Element propagatedElement;
+    if (target is SuperExpression && !isSuperInValidContext((target as SuperExpression))) {
       return null;
-    } else if (element is ExecutableElement) {
-      invokedMethod = element as ExecutableElement;
+    }
+    if (target == null) {
+      staticElement = resolveInvokedElement2(methodName2);
+      propagatedElement = null;
     } else {
-      if (element is PropertyInducingElement) {
-        PropertyAccessorElement getter2 = ((element as PropertyInducingElement)).getter;
-        FunctionType getterType = getter2.type;
-        if (getterType != null) {
-          Type2 returnType5 = getterType.returnType;
-          if (!isExecutableType(returnType5)) {
-            _resolver.reportError(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, methodName2, [methodName2.name]);
+      Type2 targetType = getStaticType(target);
+      staticElement = resolveInvokedElement(target, targetType, methodName2);
+      propagatedElement = resolveInvokedElement(target, getPropagatedType(target), methodName2);
+    }
+    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));
           }
         }
-        recordResolution(methodName2, element);
-        return null;
-      } else if (element is VariableElement) {
-        Type2 variableType = _resolver.overrideManager.getType(element);
-        if (variableType == null) {
-          variableType = ((element as VariableElement)).type;
+      }
+    } 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 (!isExecutableType(variableType)) {
-          _resolver.reportError(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, methodName2, [methodName2.name]);
-        }
-        recordResolution(methodName2, element);
-        return null;
-      } else {
-        if (target == null) {
-          ClassElement enclosingClass3 = _resolver.enclosingClass;
-          if (enclosingClass3 == null) {
-            _resolver.reportError(StaticTypeWarningCode.UNDEFINED_FUNCTION, methodName2, [methodName2.name]);
-          } else if (element == null) {
-            _resolver.reportError(StaticTypeWarningCode.UNDEFINED_METHOD, methodName2, [methodName2.name, enclosingClass3.name]);
-          } else {
-            _resolver.reportError(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, methodName2, [methodName2.name]);
-          }
-        } else {
-          Type2 targetType = getType(target);
-          String targetTypeName = targetType == null ? null : targetType.name;
-          if (targetTypeName == null) {
-            _resolver.reportError(StaticTypeWarningCode.UNDEFINED_FUNCTION, methodName2, [methodName2.name]);
-          } else {
-            if (!doesClassDeclareNoSuchMethod(targetType.element)) {
-              _resolver.reportError(StaticTypeWarningCode.UNDEFINED_METHOD, methodName2, [methodName2.name, targetTypeName]);
-            }
-          }
-        }
-        return null;
       }
     }
-    recordResolution(methodName2, invokedMethod);
-    resolveNamedArguments(node.argumentList, invokedMethod);
+    ErrorCode errorCode;
+    if (staticElement == null) {
+      if (propagatedElement == null) {
+        errorCode = checkForInvocationError(target, staticElement);
+      } else {
+        errorCode = checkForInvocationError(target, propagatedElement);
+      }
+    } else {
+      errorCode = checkForInvocationError(target, staticElement);
+      if (propagatedElement != null) {
+        ErrorCode propagatedError = checkForInvocationError(target, propagatedElement);
+        errorCode = select(errorCode, propagatedError);
+      }
+    }
+    if (identical(errorCode, StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION)) {
+      _resolver.reportError(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, methodName2, [methodName2.name]);
+    } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_FUNCTION)) {
+      _resolver.reportError(StaticTypeWarningCode.UNDEFINED_FUNCTION, methodName2, [methodName2.name]);
+    } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_METHOD)) {
+      String targetTypeName;
+      if (target == null) {
+        ClassElement enclosingClass2 = _resolver.enclosingClass;
+        targetTypeName = enclosingClass2.displayName;
+      } else {
+        Type2 targetType = getPropagatedType(target);
+        if (targetType == null) {
+          targetType = getStaticType(target);
+        }
+        targetTypeName = targetType == null ? null : targetType.displayName;
+      }
+      _resolver.reportError(StaticTypeWarningCode.UNDEFINED_METHOD, methodName2, [methodName2.name, targetTypeName]);
+    } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_SUPER_METHOD)) {
+      Type2 targetType = getPropagatedType(target);
+      if (targetType == null) {
+        targetType = getStaticType(target);
+      }
+      String targetTypeName = targetType == null ? null : targetType.name;
+      _resolver.reportError(StaticTypeWarningCode.UNDEFINED_SUPER_METHOD, methodName2, [methodName2.name, targetTypeName]);
+    }
+    return null;
+  }
+  Object visitPartDirective(PartDirective node) {
+    setMetadata(node.element, node);
+    return null;
+  }
+  Object visitPartOfDirective(PartOfDirective node) {
+    setMetadata(node.element, node);
     return null;
   }
   Object visitPostfixExpression(PostfixExpression node) {
-    sc.Token operator2 = node.operator;
-    Type2 operandType = getType(node.operand);
-    if (operandType == null || operandType.isDynamic()) {
-      return null;
-    }
-    String methodName;
-    if (identical(operator2.type, sc.TokenType.PLUS_PLUS)) {
-      methodName = sc.TokenType.PLUS.lexeme;
-    } else {
-      methodName = sc.TokenType.MINUS.lexeme;
-    }
-    MethodElement member = lookUpMethod(operandType, methodName);
-    if (member == null) {
-      _resolver.reportError3(StaticWarningCode.UNDEFINED_OPERATOR, operator2, [methodName, operandType.name]);
-    } else {
-      node.element = member;
+    Expression operand2 = node.operand;
+    String methodName = getPostfixOperator(node);
+    Type2 staticType = getStaticType(operand2);
+    MethodElement staticMethod = lookUpMethod(operand2, staticType, methodName);
+    node.staticElement = staticMethod;
+    Type2 propagatedType = getPropagatedType(operand2);
+    MethodElement propagatedMethod = lookUpMethod(operand2, propagatedType, methodName);
+    node.element = select3(staticMethod, propagatedMethod);
+    if (shouldReportMissingMember(staticType, staticMethod) && (propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
+      _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_OPERATOR, node.operator, [methodName, staticType.displayName]);
     }
     return null;
   }
@@ -1868,138 +2080,46 @@
       if (element == null) {
         return null;
       }
+      if (element is PropertyAccessorElement && identifier2.inSetterContext()) {
+        PropertyInducingElement variable2 = ((element as PropertyAccessorElement)).variable;
+        if (variable2 != null) {
+          PropertyAccessorElement setter2 = variable2.setter;
+          if (setter2 != null) {
+            element = setter2;
+          }
+        }
+      }
       recordResolution(identifier2, element);
       return null;
     }
-    if (prefixElement is ClassElement) {
-      Element memberElement;
-      if (node.identifier.inSetterContext()) {
-        memberElement = ((prefixElement as ClassElementImpl)).getSetter(identifier2.name);
-      } else {
-        memberElement = ((prefixElement as ClassElementImpl)).getGetter(identifier2.name);
-      }
-      if (memberElement == null) {
-        MethodElement methodElement = lookUpMethod(((prefixElement as ClassElement)).type, identifier2.name);
-        if (methodElement != null) {
-          recordResolution(identifier2, methodElement);
-          return null;
-        }
-      }
-      if (memberElement == null) {
-        reportGetterOrSetterNotFound(node, identifier2, prefixElement.name);
-      } else {
-        recordResolution(identifier2, memberElement);
-      }
-      return null;
-    }
-    Type2 variableType;
-    if (prefixElement is PropertyAccessorElement) {
-      PropertyAccessorElement accessor = prefixElement as PropertyAccessorElement;
-      FunctionType type2 = accessor.type;
-      if (type2 == null) {
-        return null;
-      }
-      if (accessor.isGetter()) {
-        variableType = type2.returnType;
-      } else {
-        variableType = type2.normalParameterTypes[0];
-      }
-      if (variableType == null || variableType.isDynamic()) {
-        return null;
-      }
-    } else if (prefixElement is VariableElement) {
-      variableType = _resolver.overrideManager.getType(prefixElement);
-      if (variableType == null) {
-        variableType = ((prefixElement as VariableElement)).type;
-      }
-      if (variableType == null || variableType.isDynamic()) {
-        return null;
-      }
-    } else {
-      return null;
-    }
-    PropertyAccessorElement memberElement = null;
-    if (node.identifier.inSetterContext()) {
-      memberElement = lookUpSetter(variableType, identifier2.name);
-    }
-    if (memberElement == null && node.identifier.inGetterContext()) {
-      memberElement = lookUpGetter(variableType, identifier2.name);
-    }
-    if (memberElement == null) {
-      MethodElement methodElement = lookUpMethod(variableType, identifier2.name);
-      if (methodElement != null) {
-        recordResolution(identifier2, methodElement);
-        return null;
-      }
-    }
-    if (memberElement == null) {
-      reportGetterOrSetterNotFound(node, identifier2, variableType.element.name);
-    } else {
-      recordResolution(identifier2, memberElement);
-    }
+    resolvePropertyAccess(prefix2, identifier2);
     return null;
   }
   Object visitPrefixExpression(PrefixExpression node) {
     sc.Token operator2 = node.operator;
     sc.TokenType operatorType = operator2.type;
     if (operatorType.isUserDefinableOperator() || identical(operatorType, sc.TokenType.PLUS_PLUS) || identical(operatorType, sc.TokenType.MINUS_MINUS)) {
-      Type2 operandType = getType(node.operand);
-      if (operandType == null || operandType.isDynamic()) {
-        return null;
-      }
-      String methodName;
-      if (identical(operatorType, sc.TokenType.PLUS_PLUS)) {
-        methodName = sc.TokenType.PLUS.lexeme;
-      } else if (identical(operatorType, sc.TokenType.MINUS_MINUS)) {
-        methodName = sc.TokenType.MINUS.lexeme;
-      } else if (identical(operatorType, sc.TokenType.MINUS)) {
-        methodName = "unary-";
-      } else {
-        methodName = operator2.lexeme;
-      }
-      MethodElement member = lookUpMethod(operandType, methodName);
-      if (member == null) {
-        _resolver.reportError3(StaticWarningCode.UNDEFINED_OPERATOR, operator2, [methodName, operandType.name]);
-      } else {
-        node.element = member;
+      Expression operand2 = node.operand;
+      String methodName = getPrefixOperator(node);
+      Type2 staticType = getStaticType(operand2);
+      MethodElement staticMethod = lookUpMethod(operand2, staticType, methodName);
+      node.staticElement = staticMethod;
+      Type2 propagatedType = getPropagatedType(operand2);
+      MethodElement propagatedMethod = lookUpMethod(operand2, propagatedType, methodName);
+      node.element = select3(staticMethod, propagatedMethod);
+      if (shouldReportMissingMember(staticType, staticMethod) && (propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
+        _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_OPERATOR, operator2, [methodName, staticType.displayName]);
       }
     }
     return null;
   }
   Object visitPropertyAccess(PropertyAccess node) {
-    Type2 targetType = getType(node.realTarget);
-    if (targetType is! InterfaceType) {
+    Expression target = node.realTarget;
+    if (target is SuperExpression && !isSuperInValidContext((target as SuperExpression))) {
       return null;
     }
-    SimpleIdentifier identifier = node.propertyName;
-    PropertyAccessorElement memberElement = null;
-    if (identifier.inSetterContext()) {
-      memberElement = lookUpSetter(targetType, identifier.name);
-    }
-    if (memberElement == null && identifier.inGetterContext()) {
-      memberElement = lookUpGetter(targetType, identifier.name);
-    }
-    if (memberElement == null) {
-      MethodElement methodElement = lookUpMethod(targetType, identifier.name);
-      if (methodElement != null) {
-        recordResolution(identifier, methodElement);
-        return null;
-      }
-    }
-    if (memberElement == null) {
-      if (!doesClassDeclareNoSuchMethod(targetType.element)) {
-        if (identifier.inSetterContext()) {
-          _resolver.reportError(StaticWarningCode.UNDEFINED_SETTER, identifier, [identifier.name, targetType.name]);
-        } else if (identifier.inGetterContext()) {
-          _resolver.reportError(StaticWarningCode.UNDEFINED_GETTER, identifier, [identifier.name, targetType.name]);
-        } else {
-          print("two ${identifier.name}");
-          _resolver.reportError(StaticWarningCode.UNDEFINED_IDENTIFIER, identifier, [identifier.name]);
-        }
-      }
-    } else {
-      recordResolution(identifier, memberElement);
-    }
+    SimpleIdentifier propertyName2 = node.propertyName;
+    resolvePropertyAccess(target, propertyName2);
     return null;
   }
   Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
@@ -2020,39 +2140,22 @@
     if (name != null) {
       recordResolution(name, element);
     }
+    node.staticElement = element;
     node.element = element;
-    resolveNamedArguments(node.argumentList, element);
+    resolveArgumentsToParameters(false, node.argumentList, element);
     return null;
   }
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     if (node.element != null) {
       return null;
     }
-    Element element = _resolver.nameScope.lookup(node, _resolver.definingLibrary);
-    if (element is PropertyAccessorElement && node.inSetterContext()) {
-      PropertyInducingElement variable2 = ((element as PropertyAccessorElement)).variable;
-      if (variable2 != null) {
-        PropertyAccessorElement setter2 = variable2.setter;
-        if (setter2 != null) {
-          element = setter2;
-        }
-      }
-    }
-    ClassElement enclosingClass2 = _resolver.enclosingClass;
-    if (element == null && enclosingClass2 != null) {
-      InterfaceType enclosingType = enclosingClass2.type;
-      if (element == null && node.inSetterContext()) {
-        element = lookUpSetter(enclosingType, node.name);
-      }
-      if (element == null && node.inGetterContext()) {
-        element = lookUpGetter(enclosingType, node.name);
-      }
-      if (element == null) {
-        element = lookUpMethod(enclosingType, node.name);
-      }
-    }
-    if (element == null) {
-      if (!doesClassDeclareNoSuchMethod(enclosingClass2)) {
+    Element element = resolveSimpleIdentifier(node);
+    if (isFactoryConstructorReturnType(node) && element != _resolver.enclosingClass) {
+      _resolver.reportError(CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS, node, []);
+    } else if (element == null) {
+      if (isConstructorReturnType(node)) {
+        _resolver.reportError(CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, node, []);
+      } else if (!classDeclaresNoSuchMethod(_resolver.enclosingClass)) {
         _resolver.reportError(StaticWarningCode.UNDEFINED_IDENTIFIER, node, [node.name]);
       }
     }
@@ -2076,15 +2179,31 @@
       element = superclass.getNamedConstructor(name.name);
     }
     if (element == null) {
+      if (name != null) {
+        _resolver.reportError(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER, node, [superclass.name, name]);
+      } else {
+        _resolver.reportError(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, node, [superclass.name]);
+      }
       return null;
+    } else {
+      if (element.isFactory()) {
+        _resolver.reportError(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, node, [element]);
+      }
     }
     if (name != null) {
       recordResolution(name, element);
     }
+    node.staticElement = element;
     node.element = element;
-    resolveNamedArguments(node.argumentList, element);
+    resolveArgumentsToParameters(false, node.argumentList, element);
     return null;
   }
+  Object visitSuperExpression(SuperExpression node) {
+    if (!isSuperInValidContext(node)) {
+      _resolver.reportError(CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT, node, []);
+    }
+    return super.visitSuperExpression(node);
+  }
   Object visitTypeParameter(TypeParameter node) {
     TypeName bound2 = node.bound;
     if (bound2 != null) {
@@ -2093,47 +2212,215 @@
         variable.bound = bound2.type;
       }
     }
+    setMetadata(node.element, node);
     return null;
   }
-  /**
-   * Return {@code true} if the passed {@link Element} is a {@link ClassElement} that declares a
-   * method "noSuchMethod".
-   * @param element the {@link Element} to evaluate
-   * @return {@code true} if the passed {@link Element} is a {@link ClassElement} that declares a
-   * method "noSuchMethod"
-   */
-  bool doesClassDeclareNoSuchMethod(Element element) {
-    if (element == null) {
-      return false;
-    }
-    if (element is! ClassElementImpl) {
-      return false;
-    }
-    ClassElementImpl classElement = element as ClassElementImpl;
-    MethodElement method = classElement.lookUpMethod("noSuchMethod", _resolver.definingLibrary);
-    if (method == null) {
-      return false;
-    }
-    return true;
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    setMetadata(node.element, node);
+    return null;
   }
+  
   /**
-   * Search through the array of parameters for a parameter whose name matches the given name.
-   * Return the parameter with the given name, or {@code null} if there is no such parameter.
-   * @param parameters the parameters being searched
-   * @param name the name being searched for
-   * @return the parameter with the given name
+   * Generate annotation elements for each of the annotations in the given node list and add them to
+   * the given list of elements.
+   * @param annotationList the list of elements to which new elements are to be added
+   * @param annotations the AST nodes used to generate new elements
    */
-  ParameterElement findNamedParameter(List<ParameterElement> parameters, String name2) {
-    for (ParameterElement parameter in parameters) {
-      if (identical(parameter.parameterKind, ParameterKind.NAMED)) {
-        String parameteName = parameter.name;
-        if (parameteName != null && parameteName == name2) {
-          return parameter;
+  void addAnnotations(List<AnnotationImpl> annotationList, NodeList<Annotation> annotations) {
+    for (Annotation annotationNode in annotations) {
+      Element resolvedElement = annotationNode.element;
+      if (resolvedElement != null) {
+        annotationList.add(new AnnotationImpl(resolvedElement));
+      }
+    }
+  }
+  
+  /**
+   * 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.
+   * @param target the target of the invocation, or {@code null} if there was no target
+   * @param element the element to be invoked
+   * @return the error code that should be reported
+   */
+  ErrorCode checkForInvocationError(Expression target, Element element2) {
+    if (element2 is PropertyAccessorElement) {
+      FunctionType getterType = ((element2 as PropertyAccessorElement)).type;
+      if (getterType != null) {
+        Type2 returnType2 = getterType.returnType;
+        if (!isExecutableType(returnType2)) {
+          return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
+        }
+      }
+    } else if (element2 is ExecutableElement) {
+      return null;
+    } else if (element2 == null && target is SuperExpression) {
+      return StaticTypeWarningCode.UNDEFINED_SUPER_METHOD;
+    } else {
+      if (element2 is PropertyInducingElement) {
+        PropertyAccessorElement getter2 = ((element2 as PropertyInducingElement)).getter;
+        FunctionType getterType = getter2.type;
+        if (getterType != null) {
+          Type2 returnType3 = getterType.returnType;
+          if (!isExecutableType(returnType3)) {
+            return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
+          }
+        }
+      } else if (element2 is VariableElement) {
+        Type2 variableType = _resolver.overrideManager.getType(element2);
+        if (variableType == null) {
+          variableType = ((element2 as VariableElement)).type;
+        }
+        if (!isExecutableType(variableType)) {
+          return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
+        }
+      } else {
+        if (target == null) {
+          ClassElement enclosingClass2 = _resolver.enclosingClass;
+          if (enclosingClass2 == null) {
+            return StaticTypeWarningCode.UNDEFINED_FUNCTION;
+          } else if (element2 == null) {
+            if (!classDeclaresNoSuchMethod(enclosingClass2)) {
+              return StaticTypeWarningCode.UNDEFINED_METHOD;
+            }
+          } else {
+            return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
+          }
+        } else {
+          Type2 targetType = getStaticType(target);
+          if (targetType == null) {
+            return StaticTypeWarningCode.UNDEFINED_FUNCTION;
+          } else if (!targetType.isDynamic() && !classDeclaresNoSuchMethod2(targetType.element)) {
+            return StaticTypeWarningCode.UNDEFINED_METHOD;
+          }
         }
       }
     }
     return null;
   }
+  
+  /**
+   * Return {@code true} if the given class declares a method named "noSuchMethod" and is not the
+   * class 'Object'.
+   * @param element the class being tested
+   * @return {@code true} if the given class declares a method named "noSuchMethod"
+   */
+  bool classDeclaresNoSuchMethod(ClassElement classElement) {
+    if (classElement == null) {
+      return false;
+    }
+    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'.
+   * @param element the element being tested
+   * @return {@code true} if the given element represents a class that declares a method named
+   * "noSuchMethod"
+   */
+  bool classDeclaresNoSuchMethod2(Element element) {
+    if (element is ClassElement) {
+      return classDeclaresNoSuchMethod((element as ClassElement));
+    }
+    return false;
+  }
+  
+  /**
+   * If the given element is a setter, return the getter associated with it. Otherwise, return the
+   * element unchanged.
+   * @param element the element to be normalized
+   * @return a non-setter element derived from the given element
+   */
+  Element convertSetterToGetter(Element element) {
+    if (element is PropertyAccessorElement) {
+      return ((element as PropertyAccessorElement)).variable.getter;
+    }
+    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.
+   * @param identifier the identifier that might have been imported using a prefix
+   * @return the element that was found
+   */
+  Element findImportWithoutPrefix(SimpleIdentifier identifier) {
+    Element element = null;
+    Scope nameScope2 = _resolver.nameScope;
+    LibraryElement definingLibrary2 = _resolver.definingLibrary;
+    for (ImportElement importElement in definingLibrary2.imports) {
+      PrefixElement prefixElement = importElement.prefix;
+      if (prefixElement != null) {
+        Identifier prefixedIdentifier = new ElementResolver_SyntheticIdentifier("${prefixElement.name}.${identifier.name}");
+        Element importedElement = nameScope2.lookup(prefixedIdentifier, definingLibrary2);
+        if (importedElement != null) {
+          if (element == null) {
+            element = importedElement;
+          } else {
+            element = new MultiplyDefinedElementImpl(definingLibrary2.context, element, importedElement);
+          }
+        }
+      }
+    }
+    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
+   * @return the name of the method invoked by the expression
+   */
+  String getPrefixOperator(PrefixExpression node) {
+    sc.Token operator2 = node.operator;
+    sc.TokenType operatorType = operator2.type;
+    if (identical(operatorType, sc.TokenType.PLUS_PLUS)) {
+      return sc.TokenType.PLUS.lexeme;
+    } else if (identical(operatorType, sc.TokenType.MINUS_MINUS)) {
+      return sc.TokenType.MINUS.lexeme;
+    } else if (identical(operatorType, sc.TokenType.MINUS)) {
+      return "unary-";
+    } else {
+      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
+   * @return the type of the given expression
+   */
+  Type2 getPropagatedType(Expression expression) {
+    Type2 propagatedType2 = resolveTypeVariable(expression.propagatedType);
+    if (propagatedType2 is FunctionType) {
+      propagatedType2 = _resolver.typeProvider.functionType;
+    }
+    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
+   * @return the type of the given expression
+   */
+  Type2 getStaticType(Expression expression) {
+    if (expression is NullLiteral) {
+      return _resolver.typeProvider.objectType;
+    }
+    Type2 staticType2 = resolveTypeVariable(expression.staticType);
+    if (staticType2 is FunctionType) {
+      staticType2 = _resolver.typeProvider.functionType;
+    }
+    return staticType2;
+  }
+  
   /**
    * Return the element representing the superclass of the given class.
    * @param targetClass the class whose superclass is to be returned
@@ -2146,17 +2433,7 @@
     }
     return superType.element;
   }
-  /**
-   * Return the 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 type of the given expression
-   */
-  Type2 getType(Expression expression) {
-    if (expression is NullLiteral) {
-      return _resolver.typeProvider.objectType;
-    }
-    return expression.staticType;
-  }
+  
   /**
    * Return {@code true} if the given type represents an object that could be invoked using the call
    * operator '()'.
@@ -2168,51 +2445,105 @@
       return true;
     } else if (type is InterfaceType) {
       ClassElement classElement = ((type as InterfaceType)).element;
-      MethodElement methodElement = classElement.lookUpMethod("call", _resolver.definingLibrary);
+      MethodElement methodElement = classElement.lookUpMethod(CALL_METHOD_NAME, _resolver.definingLibrary);
       return methodElement != null;
     }
     return false;
   }
+  
+  /**
+   * Return {@code true} if the given element is a static element.
+   * @param element the element being tested
+   * @return {@code true} if the given element is a static element
+   */
+  bool isStatic(Element element) {
+    if (element is ExecutableElement) {
+      return ((element as ExecutableElement)).isStatic();
+    } else if (element is PropertyInducingElement) {
+      return ((element as PropertyInducingElement)).isStatic();
+    }
+    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
+   * @param target the target of the expression
+   * @param methodName the name of the operator associated with the context of using of the given
+   * index expression
+   * @return {@code true} if and only if an error code is generated on the passed node
+   */
+  bool lookUpCheckIndexOperator(IndexExpression node, Expression target, String methodName, Type2 staticType, Type2 propagatedType) {
+    MethodElement staticMethod = lookUpMethod(target, staticType, methodName);
+    MethodElement propagatedMethod = lookUpMethod(target, propagatedType, methodName);
+    node.staticElement = staticMethod;
+    node.element = select3(staticMethod, propagatedMethod);
+    if (shouldReportMissingMember(staticType, staticMethod) && (propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
+      sc.Token leftBracket2 = node.leftBracket;
+      sc.Token rightBracket2 = node.rightBracket;
+      if (leftBracket2 == null || rightBracket2 == null) {
+        _resolver.reportError(StaticTypeWarningCode.UNDEFINED_OPERATOR, node, [methodName, staticType.displayName]);
+        return true;
+      } else {
+        int offset2 = leftBracket2.offset;
+        int length = rightBracket2.offset - offset2 + 1;
+        _resolver.reportError5(StaticTypeWarningCode.UNDEFINED_OPERATOR, offset2, length, [methodName, staticType.displayName]);
+        return true;
+      }
+    }
+    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.
+   * @param target the target of the invocation, or {@code null} if there is no target
    * @param type the type in which the getter is defined
    * @param getterName the name of the getter being looked up
    * @return the element representing the getter that was found
    */
-  PropertyAccessorElement lookUpGetter(Type2 type, String getterName) {
+  PropertyAccessorElement lookUpGetter(Expression target, Type2 type, String getterName) {
     type = resolveTypeVariable(type);
     if (type is InterfaceType) {
       InterfaceType interfaceType = type as InterfaceType;
-      PropertyAccessorElement accessor = interfaceType.lookUpGetter(getterName, _resolver.definingLibrary);
+      PropertyAccessorElement accessor;
+      if (target is SuperExpression) {
+        accessor = interfaceType.lookUpGetterInSuperclass(getterName, _resolver.definingLibrary);
+      } else {
+        accessor = interfaceType.lookUpGetter(getterName, _resolver.definingLibrary);
+      }
       if (accessor != null) {
         return accessor;
       }
-      return lookUpGetterInInterfaces(interfaceType, getterName, new Set<ClassElement>());
+      return lookUpGetterInInterfaces(interfaceType, false, getterName, new Set<ClassElement>());
     }
     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.
    * @param targetType the type in which the getter might be defined
+   * @param includeTargetType {@code true} if the search should include the target type
    * @param getterName the name of the getter being looked up
    * @param visitedInterfaces a set containing all of the interfaces that have been examined, used
    * to prevent infinite recursion and to optimize the search
    * @return the element representing the getter that was found
    */
-  PropertyAccessorElement lookUpGetterInInterfaces(InterfaceType targetType, String getterName, Set<ClassElement> visitedInterfaces) {
+  PropertyAccessorElement lookUpGetterInInterfaces(InterfaceType targetType, bool includeTargetType, String getterName, Set<ClassElement> visitedInterfaces) {
     ClassElement targetClass = targetType.element;
     if (visitedInterfaces.contains(targetClass)) {
       return null;
     }
     javaSetAdd(visitedInterfaces, targetClass);
-    PropertyAccessorElement getter = targetType.getGetter(getterName);
-    if (getter != null) {
-      return getter;
+    if (includeTargetType) {
+      PropertyAccessorElement getter = targetType.getGetter(getterName);
+      if (getter != null) {
+        return getter;
+      }
     }
     for (InterfaceType interfaceType in targetType.interfaces) {
-      getter = lookUpGetterInInterfaces(interfaceType, getterName, visitedInterfaces);
+      PropertyAccessorElement getter = lookUpGetterInInterfaces(interfaceType, true, getterName, visitedInterfaces);
       if (getter != null) {
         return getter;
       }
@@ -2221,8 +2552,9 @@
     if (superclass2 == null) {
       return null;
     }
-    return lookUpGetterInInterfaces(superclass2, getterName, visitedInterfaces);
+    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
@@ -2243,36 +2575,40 @@
       if (member != null) {
         return member;
       }
-      return lookUpGetterOrMethodInInterfaces(interfaceType, memberName, new Set<ClassElement>());
+      return lookUpGetterOrMethodInInterfaces(interfaceType, false, memberName, new Set<ClassElement>());
     }
     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
    * was found, or {@code null} if there is no method or getter with the given name.
    * @param targetType the type in which the method or getter might be defined
+   * @param includeTargetType {@code true} if the search should include the target type
    * @param memberName the name of the method or getter being looked up
    * @param visitedInterfaces a set containing all of the interfaces that have been examined, used
    * to prevent infinite recursion and to optimize the search
    * @return the element representing the method or getter that was found
    */
-  ExecutableElement lookUpGetterOrMethodInInterfaces(InterfaceType targetType, String memberName, Set<ClassElement> visitedInterfaces) {
+  ExecutableElement lookUpGetterOrMethodInInterfaces(InterfaceType targetType, bool includeTargetType, String memberName, Set<ClassElement> visitedInterfaces) {
     ClassElement targetClass = targetType.element;
     if (visitedInterfaces.contains(targetClass)) {
       return null;
     }
     javaSetAdd(visitedInterfaces, targetClass);
-    ExecutableElement member = targetType.getMethod(memberName);
-    if (member != null) {
-      return member;
-    }
-    member = targetType.getGetter(memberName);
-    if (member != null) {
-      return member;
+    if (includeTargetType) {
+      ExecutableElement member = targetType.getMethod(memberName);
+      if (member != null) {
+        return member;
+      }
+      member = targetType.getGetter(memberName);
+      if (member != null) {
+        return member;
+      }
     }
     for (InterfaceType interfaceType in targetType.interfaces) {
-      member = lookUpGetterOrMethodInInterfaces(interfaceType, memberName, visitedInterfaces);
+      ExecutableElement member = lookUpGetterOrMethodInInterfaces(interfaceType, true, memberName, visitedInterfaces);
       if (member != null) {
         return member;
       }
@@ -2281,8 +2617,9 @@
     if (superclass2 == null) {
       return null;
     }
-    return lookUpGetterInInterfaces(superclass2, memberName, visitedInterfaces);
+    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
@@ -2321,46 +2658,57 @@
     }
     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.
+   * @param target the target of the invocation, or {@code null} if there is no target
    * @param type the type in which the method is defined
    * @param methodName the name of the method being looked up
    * @return the element representing the method that was found
    */
-  MethodElement lookUpMethod(Type2 type, String methodName) {
+  MethodElement lookUpMethod(Expression target, Type2 type, String methodName) {
     type = resolveTypeVariable(type);
     if (type is InterfaceType) {
       InterfaceType interfaceType = type as InterfaceType;
-      MethodElement method = interfaceType.lookUpMethod(methodName, _resolver.definingLibrary);
+      MethodElement method;
+      if (target is SuperExpression) {
+        method = interfaceType.lookUpMethodInSuperclass(methodName, _resolver.definingLibrary);
+      } else {
+        method = interfaceType.lookUpMethod(methodName, _resolver.definingLibrary);
+      }
       if (method != null) {
         return method;
       }
-      return lookUpMethodInInterfaces(interfaceType, methodName, new Set<ClassElement>());
+      return lookUpMethodInInterfaces(interfaceType, false, methodName, new Set<ClassElement>());
     }
     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.
    * @param targetType the type in which the member might be defined
+   * @param includeTargetType {@code true} if the search should include the target type
    * @param methodName the name of the method being looked up
    * @param visitedInterfaces a set containing all of the interfaces that have been examined, used
    * to prevent infinite recursion and to optimize the search
    * @return the element representing the method that was found
    */
-  MethodElement lookUpMethodInInterfaces(InterfaceType targetType, String methodName, Set<ClassElement> visitedInterfaces) {
+  MethodElement lookUpMethodInInterfaces(InterfaceType targetType, bool includeTargetType, String methodName, Set<ClassElement> visitedInterfaces) {
     ClassElement targetClass = targetType.element;
     if (visitedInterfaces.contains(targetClass)) {
       return null;
     }
     javaSetAdd(visitedInterfaces, targetClass);
-    MethodElement method = targetType.getMethod(methodName);
-    if (method != null) {
-      return method;
+    if (includeTargetType) {
+      MethodElement method = targetType.getMethod(methodName);
+      if (method != null) {
+        return method;
+      }
     }
     for (InterfaceType interfaceType in targetType.interfaces) {
-      method = lookUpMethodInInterfaces(interfaceType, methodName, visitedInterfaces);
+      MethodElement method = lookUpMethodInInterfaces(interfaceType, true, methodName, visitedInterfaces);
       if (method != null) {
         return method;
       }
@@ -2369,48 +2717,59 @@
     if (superclass2 == null) {
       return null;
     }
-    return lookUpMethodInInterfaces(superclass2, methodName, visitedInterfaces);
+    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.
+   * @param target the target of the invocation, or {@code null} if there is no target
    * @param type the type in which the setter is defined
    * @param setterName the name of the setter being looked up
    * @return the element representing the setter that was found
    */
-  PropertyAccessorElement lookUpSetter(Type2 type, String setterName) {
+  PropertyAccessorElement lookUpSetter(Expression target, Type2 type, String setterName) {
     type = resolveTypeVariable(type);
     if (type is InterfaceType) {
       InterfaceType interfaceType = type as InterfaceType;
-      PropertyAccessorElement accessor = interfaceType.lookUpSetter(setterName, _resolver.definingLibrary);
+      PropertyAccessorElement accessor;
+      if (target is SuperExpression) {
+        accessor = interfaceType.lookUpSetterInSuperclass(setterName, _resolver.definingLibrary);
+      } else {
+        accessor = interfaceType.lookUpSetter(setterName, _resolver.definingLibrary);
+      }
       if (accessor != null) {
         return accessor;
       }
-      return lookUpSetterInInterfaces(interfaceType, setterName, new Set<ClassElement>());
+      return lookUpSetterInInterfaces(interfaceType, false, setterName, new Set<ClassElement>());
     }
     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.
    * @param targetType the type in which the setter might be defined
+   * @param includeTargetType {@code true} if the search should include the target type
    * @param setterName the name of the setter being looked up
    * @param visitedInterfaces a set containing all of the interfaces that have been examined, used
    * to prevent infinite recursion and to optimize the search
    * @return the element representing the setter that was found
    */
-  PropertyAccessorElement lookUpSetterInInterfaces(InterfaceType targetType, String setterName, Set<ClassElement> visitedInterfaces) {
+  PropertyAccessorElement lookUpSetterInInterfaces(InterfaceType targetType, bool includeTargetType, String setterName, Set<ClassElement> visitedInterfaces) {
     ClassElement targetClass = targetType.element;
     if (visitedInterfaces.contains(targetClass)) {
       return null;
     }
     javaSetAdd(visitedInterfaces, targetClass);
-    PropertyAccessorElement setter = targetType.getGetter(setterName);
-    if (setter != null) {
-      return setter;
+    if (includeTargetType) {
+      PropertyAccessorElement setter = targetType.getSetter(setterName);
+      if (setter != null) {
+        return setter;
+      }
     }
     for (InterfaceType interfaceType in targetType.interfaces) {
-      setter = lookUpSetterInInterfaces(interfaceType, setterName, visitedInterfaces);
+      PropertyAccessorElement setter = lookUpSetterInInterfaces(interfaceType, true, setterName, visitedInterfaces);
       if (setter != null) {
         return setter;
       }
@@ -2419,8 +2778,9 @@
     if (superclass2 == null) {
       return null;
     }
-    return lookUpSetterInInterfaces(superclass2, setterName, visitedInterfaces);
+    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
@@ -2456,32 +2816,111 @@
     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
    * @param element the element to which the AST node was resolved
    */
   void recordResolution(SimpleIdentifier node, Element element2) {
-    if (element2 != null) {
-      node.element = element2;
-    }
+    node.staticElement = element2;
+    node.element = element2;
   }
+  
   /**
-   * Report the {@link StaticTypeWarningCode}s <code>UNDEFINED_SETTER</code> and <code>UNDEFINED_GETTER</code>.
-   * @param node the prefixed identifier that gives the context to determine if the error on the
-   * undefined identifier is a getter or a setter
-   * @param identifier the identifier in the passed prefix identifier
-   * @param typeName the name of the type of the left hand side of the passed prefixed identifier
+   * Record the fact that the given AST node was resolved to the given elements.
+   * @param node the AST node that was resolved
+   * @param staticElement the element to which the AST node was resolved using static type
+   * information
+   * @param propagatedElement the element to which the AST node was resolved using propagated type
+   * information
+   * @return the element that was associated with the node
    */
-  void reportGetterOrSetterNotFound(PrefixedIdentifier node, SimpleIdentifier identifier2, String typeName) {
-    Type2 targetType = getType(node);
-    if (targetType != null && doesClassDeclareNoSuchMethod(targetType.element)) {
+  Element recordResolution2(SimpleIdentifier node, Element staticElement2, Element propagatedElement) {
+    node.staticElement = staticElement2;
+    Element element = propagatedElement == null ? staticElement2 : propagatedElement;
+    node.element = element;
+    return element;
+  }
+  
+  /**
+   * 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.
+   * @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
+   */
+  void resolveArgumentsToParameters(bool reportError, ArgumentList argumentList, ExecutableElement executableElement) {
+    if (executableElement == null) {
       return;
     }
-    bool isSetterContext = node.identifier.inSetterContext();
-    ErrorCode errorCode = isSetterContext ? StaticTypeWarningCode.UNDEFINED_SETTER : StaticTypeWarningCode.UNDEFINED_GETTER;
-    _resolver.reportError(errorCode, identifier2, [identifier2.name, typeName]);
+    List<ParameterElement> parameters2 = executableElement.parameters;
+    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.
+   * @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
+   */
+  void 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>();
+    for (ParameterElement parameter in parameters) {
+      ParameterKind kind = parameter.parameterKind;
+      if (identical(kind, ParameterKind.REQUIRED)) {
+        requiredParameters.add(parameter);
+      } else if (identical(kind, ParameterKind.POSITIONAL)) {
+        positionalParameters.add(parameter);
+      } else {
+        namedParameters[parameter.name] = parameter;
+      }
+    }
+    List<ParameterElement> unnamedParameters = new List<ParameterElement>.from(requiredParameters);
+    unnamedParameters.addAll(positionalParameters);
+    int unnamedParameterCount = unnamedParameters.length;
+    int unnamedIndex = 0;
+    NodeList<Expression> arguments2 = argumentList.arguments;
+    int argumentCount = arguments2.length;
+    List<ParameterElement> resolvedParameters = new List<ParameterElement>(argumentCount);
+    int positionalArgumentCount = 0;
+    Set<String> usedNames = new Set<String>();
+    for (int i = 0; i < argumentCount; i++) {
+      Expression argument = arguments2[i];
+      if (argument is NamedExpression) {
+        SimpleIdentifier nameNode = ((argument as NamedExpression)).name.label;
+        String name2 = nameNode.name;
+        ParameterElement element = namedParameters[name2];
+        if (element == null) {
+          ErrorCode errorCode = reportError2 ? CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER : StaticWarningCode.UNDEFINED_NAMED_PARAMETER;
+          _resolver.reportError(errorCode, nameNode, [name2]);
+        } else {
+          resolvedParameters[i] = element;
+          recordResolution(nameNode, element);
+        }
+        if (!javaSetAdd(usedNames, name2)) {
+          _resolver.reportError(CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT, nameNode, [name2]);
+        }
+      } else {
+        positionalArgumentCount++;
+        if (unnamedIndex < unnamedParameterCount) {
+          resolvedParameters[i] = unnamedParameters[unnamedIndex++];
+        }
+      }
+    }
+    if (positionalArgumentCount < requiredParameters.length) {
+      ErrorCode errorCode = reportError2 ? CompileTimeErrorCode.NOT_ENOUGH_REQUIRED_ARGUMENTS : StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS;
+      _resolver.reportError(errorCode, argumentList, [requiredParameters.length, positionalArgumentCount]);
+    } else if (positionalArgumentCount > unnamedParameterCount) {
+      ErrorCode errorCode = reportError2 ? CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS : StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS;
+      _resolver.reportError(errorCode, argumentList, [unnamedParameterCount, positionalArgumentCount]);
+    }
+    argumentList.correspondingParameters = resolvedParameters;
+  }
+  
   /**
    * Resolve the names in the given combinators in the scope of the given library.
    * @param library the library that defines the names
@@ -2491,7 +2930,7 @@
     if (library == null) {
       return;
     }
-    Namespace namespace = new NamespaceBuilder().createExportNamespace(library);
+    Namespace namespace = new NamespaceBuilder().createExportNamespace2(library);
     for (Combinator combinator in combinators) {
       NodeList<SimpleIdentifier> names;
       if (combinator is HideCombinator) {
@@ -2507,28 +2946,157 @@
       }
     }
   }
+  
   /**
-   * Resolve the names associated with any named arguments to the parameter elements named by the
-   * argument.
-   * @param argumentList the arguments to be resolved
-   * @param invokedMethod the method or function defining the parameters to which the named
-   * arguments are to be resolved
+   * 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
+   * is a getter, the getter will be invoked without arguments and the result of that invocation
+   * will then be invoked with the arguments.
+   * @param target the target of the invocation ('e')
+   * @param targetType the type of the target
+   * @param methodName the name of the method being invoked ('m')
+   * @return the element being invoked
    */
-  void resolveNamedArguments(ArgumentList argumentList, ExecutableElement invokedMethod) {
-    if (invokedMethod == null) {
-      return;
+  Element resolveInvokedElement(Expression target, Type2 targetType, SimpleIdentifier methodName) {
+    if (targetType is InterfaceType) {
+      InterfaceType classType = targetType as InterfaceType;
+      Element element = lookUpMethod(target, classType, methodName.name);
+      if (element == null) {
+        element = classType.getGetter(methodName.name);
+      }
+      return element;
+    } else if (target is SimpleIdentifier) {
+      Element targetElement = ((target as SimpleIdentifier)).element;
+      if (targetElement is PrefixElement) {
+        String name2 = "${((target as SimpleIdentifier)).name}.${methodName}";
+        Identifier functionName = new ElementResolver_SyntheticIdentifier(name2);
+        Element element = _resolver.nameScope.lookup(functionName, _resolver.definingLibrary);
+        if (element != null) {
+          return element;
+        }
+      }
     }
-    List<ParameterElement> parameters2 = invokedMethod.parameters;
-    for (Expression argument in argumentList.arguments) {
-      if (argument is NamedExpression) {
-        SimpleIdentifier name2 = ((argument as NamedExpression)).name.label;
-        ParameterElement parameter = findNamedParameter(parameters2, name2.name);
-        if (parameter != null) {
-          recordResolution(name2, parameter);
+    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
+   * getter, the getter will be invoked without arguments and the result of that invocation will
+   * then be invoked with the arguments.
+   * @param methodName the name of the method being invoked ('m')
+   * @return the element being invoked
+   */
+  Element resolveInvokedElement2(SimpleIdentifier methodName) {
+    Element element = _resolver.nameScope.lookup(methodName, _resolver.definingLibrary);
+    if (element == null) {
+      ClassElement enclosingClass2 = _resolver.enclosingClass;
+      if (enclosingClass2 != null) {
+        InterfaceType enclosingType = enclosingClass2.type;
+        element = lookUpMethod(null, enclosingType, methodName.name);
+        if (element == null) {
+          element = lookUpGetter(null, enclosingType, methodName.name);
+        }
+      }
+    }
+    return element;
+  }
+  
+  /**
+   * Given that we are accessing a property of the given type with the given name, return the
+   * element that represents the property.
+   * @param target the target of the invocation ('e')
+   * @param targetType the type in which the search for the property should begin
+   * @param propertyName the name of the property being accessed
+   * @return the element that represents the property
+   */
+  ExecutableElement resolveProperty(Expression target, Type2 targetType, SimpleIdentifier propertyName) {
+    ExecutableElement memberElement = null;
+    if (propertyName.inSetterContext()) {
+      memberElement = lookUpSetter(target, targetType, propertyName.name);
+    }
+    if (memberElement == null) {
+      memberElement = lookUpGetter(target, targetType, propertyName.name);
+    }
+    if (memberElement == null) {
+      memberElement = lookUpMethod(target, targetType, propertyName.name);
+    }
+    return memberElement;
+  }
+  void resolvePropertyAccess(Expression target, SimpleIdentifier propertyName) {
+    Type2 staticType = getStaticType(target);
+    ExecutableElement staticElement = resolveProperty(target, staticType, propertyName);
+    propertyName.staticElement = staticElement;
+    Type2 propagatedType = getPropagatedType(target);
+    ExecutableElement propagatedElement = resolveProperty(target, propagatedType, propertyName);
+    Element selectedElement = select2(staticElement, propagatedElement);
+    propertyName.element = selectedElement;
+    if (shouldReportMissingMember(staticType, staticElement) && (propagatedType == null || shouldReportMissingMember(propagatedType, propagatedElement))) {
+      bool staticNoSuchMethod = staticType != null && classDeclaresNoSuchMethod2(staticType.element);
+      bool propagatedNoSuchMethod = propagatedType != null && classDeclaresNoSuchMethod2(propagatedType.element);
+      if (!staticNoSuchMethod && !propagatedNoSuchMethod) {
+        bool isStaticProperty = isStatic(selectedElement);
+        if (propertyName.inSetterContext()) {
+          if (isStaticProperty) {
+            _resolver.reportError(StaticWarningCode.UNDEFINED_SETTER, propertyName, [propertyName.name, staticType.displayName]);
+          } else {
+            _resolver.reportError(StaticTypeWarningCode.UNDEFINED_SETTER, propertyName, [propertyName.name, staticType.displayName]);
+          }
+        } else if (propertyName.inGetterContext()) {
+          if (isStaticProperty) {
+            _resolver.reportError(StaticWarningCode.UNDEFINED_GETTER, propertyName, [propertyName.name, staticType.displayName]);
+          } else {
+            _resolver.reportError(StaticTypeWarningCode.UNDEFINED_GETTER, propertyName, [propertyName.name, staticType.displayName]);
+          }
+        } else {
+          _resolver.reportError(StaticWarningCode.UNDEFINED_IDENTIFIER, propertyName, [propertyName.name]);
         }
       }
     }
   }
+  
+  /**
+   * 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
+   * resolution.
+   * @param node the identifier to be resolved
+   * @return the element to which the identifier could be resolved
+   */
+  Element resolveSimpleIdentifier(SimpleIdentifier node) {
+    Element element = _resolver.nameScope.lookup(node, _resolver.definingLibrary);
+    if (element is PropertyAccessorElement && node.inSetterContext()) {
+      PropertyInducingElement variable2 = ((element as PropertyAccessorElement)).variable;
+      if (variable2 != null) {
+        PropertyAccessorElement setter2 = variable2.setter;
+        if (setter2 == null) {
+          ClassElement enclosingClass2 = _resolver.enclosingClass;
+          if (enclosingClass2 != null) {
+            setter2 = lookUpSetter(null, enclosingClass2.type, node.name);
+          }
+        }
+        if (setter2 != null) {
+          element = setter2;
+        }
+      }
+    } else if (element == null && node.inSetterContext()) {
+      element = _resolver.nameScope.lookup(new ElementResolver_SyntheticIdentifier("${node.name}="), _resolver.definingLibrary);
+    }
+    ClassElement enclosingClass3 = _resolver.enclosingClass;
+    if (element == null && enclosingClass3 != null) {
+      InterfaceType enclosingType = enclosingClass3.type;
+      if (element == null && node.inSetterContext()) {
+        element = lookUpSetter(null, enclosingType, node.name);
+      }
+      if (element == null && node.inGetterContext()) {
+        element = lookUpGetter(null, enclosingType, node.name);
+      }
+      if (element == null) {
+        element = lookUpMethod(null, enclosingType, node.name);
+      }
+    }
+    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.
@@ -2546,18 +3114,557 @@
     }
     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
+   * be reported, or {@code null} if no error should be reported.
+   * @param staticError the error code computed using static type information
+   * @param propagatedError the error code computed using propagated type information
+   * @return the error code that should be reported
+   */
+  ErrorCode select(ErrorCode staticError, ErrorCode propagatedError) {
+    if (staticError == null || propagatedError == null) {
+      return null;
+    }
+    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
+   * @param propagatedElement the element computed using propagated type information
+   * @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
+   * @param propagatedMethod the method computed using propagated type information
+   * @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
+   * the node.
+   * @param element the element to which the node has been resolved
+   * @param node the node that can have annotations associated with it
+   */
+  void setMetadata(Element element, AnnotatedNode node) {
+    if (element is! ElementImpl) {
+      return;
+    }
+    List<AnnotationImpl> annotationList = new List<AnnotationImpl>();
+    addAnnotations(annotationList, node.metadata);
+    if (node is VariableDeclaration && node.parent is VariableDeclarationList) {
+      VariableDeclarationList list = node.parent as VariableDeclarationList;
+      addAnnotations(annotationList, list.metadata);
+      if (list.parent is FieldDeclaration) {
+        FieldDeclaration fieldDeclaration = list.parent as FieldDeclaration;
+        addAnnotations(annotationList, fieldDeclaration.metadata);
+      } else if (list.parent is TopLevelVariableDeclaration) {
+        TopLevelVariableDeclaration variableDeclaration = list.parent as TopLevelVariableDeclaration;
+        addAnnotations(annotationList, variableDeclaration.metadata);
+      }
+    }
+    if (!annotationList.isEmpty) {
+      ((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.
+   * @param type the type in which we attempted to perform the look-up
+   * @param member the result of the look-up
+   * @return {@code true} if we should report an error
+   */
+  bool shouldReportMissingMember(Type2 type, ExecutableElement member) {
+    if (member != null || type == null || type.isDynamic()) {
+      return false;
+    }
+    if (type is InterfaceType) {
+      return !classDeclaresNoSuchMethod(((type as InterfaceType)).element);
+    }
+    return true;
+  }
 }
-class Identifier_8 extends Identifier {
-  String name3;
-  Identifier_8(this.name3) : super();
+
+/**
+ * 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
+ * no identifier in the AST when the parser could not distinguish between a method invocation and
+ * 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
+   */
+  ElementResolver_SyntheticIdentifier(String name) {
+    this._name = name;
+  }
   accept(ASTVisitor visitor) => null;
   sc.Token get beginToken => null;
   Element get element => null;
   sc.Token get endToken => null;
-  String get name => name3;
+  String get name => _name;
+  Element get staticElement => null;
   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
+   */
+  InheritanceManager(LibraryElement library) {
+    this._library = library;
+    _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}.
+   * @param classElt the class element to query
+   * @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}.
+   * @param classElt the class element to query
+   * @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
+   * returned.
+   * @param classElt the class element to query
+   * @param memberName the name of the executable element to find and return
+   * @return the inherited executable element with the member name, or {@code null} if no such
+   * member exists
+   */
+  ExecutableElement lookupInheritance(ClassElement classElt, String memberName) {
+    if (memberName == null || memberName.isEmpty) {
+      return null;
+    }
+    ExecutableElement executable = computeClassChainLookupMap(classElt, new Set<ClassElement>())[memberName];
+    if (executable == null) {
+      return computeInterfaceLookupMap(classElt, new Set<ClassElement>())[memberName];
+    }
+    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.
+   * @param classElt the class element to query
+   * @param memberName the name of the executable element to find and return
+   * @return the inherited executable element with the member name, or {@code null} if no such
+   * member exists
+   */
+  ExecutableElement lookupMember(ClassElement classElt, String memberName) {
+    ExecutableElement element = lookupMemberInClass(classElt, memberName);
+    if (element != null) {
+      return element;
+    }
+    return lookupInheritance(classElt, memberName);
+  }
+  
+  /**
+   * Set the new library element context.
+   * @param library the new library element
+   */
+  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.
+   * @param baseFunctionType the function type that is being overridden
+   * @param memberName the name of the member, this is used to lookup the inheritance path of the
+   * override
+   * @param definingType the type that is overriding the member
+   * @return the passed function type with any parameterized types substituted
+   */
+  FunctionType substituteTypeArgumentsInMemberFromInheritance(FunctionType baseFunctionType, String memberName, InterfaceType definingType) {
+    if (baseFunctionType == null) {
+      return baseFunctionType;
+    }
+    Queue<InterfaceType> inheritancePath = new Queue<InterfaceType>();
+    computeInheritancePath(inheritancePath, definingType, memberName);
+    if (inheritancePath == null || inheritancePath.length < 2) {
+      return baseFunctionType;
+    }
+    FunctionType functionTypeToReturn = baseFunctionType;
+    InterfaceType lastType = inheritancePath.removeLast();
+    while (inheritancePath.length > 0) {
+      List<Type2> paramTypes = TypeVariableTypeImpl.getTypes(lastType.element.typeVariables);
+      List<Type2> argTypes = lastType.typeArguments;
+      functionTypeToReturn = functionTypeToReturn.substitute2(argTypes, paramTypes);
+      lastType = inheritancePath.removeLast();
+    }
+    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}.
+   * @param classElt the class element to query
+   * @param visitedClasses a set of visited classes passed back into this method when it calls
+   * itself recursively
+   * @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}
+   */
+  Map<String, ExecutableElement> computeClassChainLookupMap(ClassElement classElt, Set<ClassElement> visitedClasses) {
+    Map<String, ExecutableElement> resultMap = _classLookup[classElt];
+    if (resultMap != null) {
+      return resultMap;
+    } else {
+      resultMap = new Map<String, ExecutableElement>();
+    }
+    ClassElement superclassElt = null;
+    InterfaceType supertype2 = classElt.supertype;
+    if (supertype2 != null) {
+      superclassElt = supertype2.element;
+    } else {
+      _classLookup[classElt] = resultMap;
+      return resultMap;
+    }
+    if (superclassElt != null) {
+      if (!visitedClasses.contains(superclassElt)) {
+        javaSetAdd(visitedClasses, classElt);
+        resultMap = new Map<String, ExecutableElement>.from(computeClassChainLookupMap(superclassElt, visitedClasses));
+      } else {
+        _classLookup[superclassElt] = resultMap;
+        return resultMap;
+      }
+      recordMapWithClassMembers(resultMap, superclassElt);
+    }
+    List<InterfaceType> mixins2 = classElt.mixins;
+    for (int i = mixins2.length - 1; i >= 0; i--) {
+      ClassElement mixinElement = mixins2[i].element;
+      if (mixinElement != null) {
+        recordMapWithClassMembers(resultMap, mixinElement);
+      }
+    }
+    _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).
+   * @param chain the inheritance path that is built up as this method calls itself recursively,
+   * when this method is called an empty {@link LinkedList} should be provided
+   * @param currentType the current type in the inheritance path
+   * @param memberName the name of the member that is being looked up the inheritance path
+   */
+  void computeInheritancePath(Queue<InterfaceType> chain, InterfaceType currentType, String memberName) {
+    chain.add(currentType);
+    ClassElement classElt = currentType.element;
+    InterfaceType supertype2 = classElt.supertype;
+    if (supertype2 == null) {
+      return;
+    }
+    if (chain.length != 1) {
+      if (lookupMemberInClass(classElt, memberName) != null) {
+        return;
+      }
+    }
+    List<InterfaceType> mixins2 = classElt.mixins;
+    for (int i = mixins2.length - 1; i >= 0; i--) {
+      ClassElement mixinElement = mixins2[i].element;
+      if (mixinElement != null) {
+        ExecutableElement elt = lookupMemberInClass(mixinElement, memberName);
+        if (elt != null) {
+          chain.add(mixins2[i]);
+          return;
+        }
+      }
+    }
+    ClassElement superclassElt = supertype2.element;
+    if (lookupMember(superclassElt, memberName) != null) {
+      computeInheritancePath(chain, supertype2, memberName);
+      return;
+    }
+    List<InterfaceType> interfaces2 = classElt.interfaces;
+    for (InterfaceType interfaceType in interfaces2) {
+      ClassElement interfaceElement = interfaceType.element;
+      if (interfaceElement != null && lookupMember(interfaceElement, memberName) != null) {
+        computeInheritancePath(chain, interfaceType, memberName);
+        return;
+      }
+    }
+  }
+  
+  /**
+   * 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}.
+   * @param classElt the class element to query
+   * @param visitedInterfaces a set of visited classes passed back into this method when it calls
+   * itself recursively
+   * @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> computeInterfaceLookupMap(ClassElement classElt, Set<ClassElement> visitedInterfaces) {
+    Map<String, ExecutableElement> resultMap = _interfaceLookup[classElt];
+    if (resultMap != null) {
+      return resultMap;
+    } else {
+      resultMap = new Map<String, ExecutableElement>();
+    }
+    List<InterfaceType> interfaces2 = classElt.interfaces;
+    if (interfaces2.length == 0) {
+      _interfaceLookup[classElt] = resultMap;
+      return resultMap;
+    }
+    List<Map<String, ExecutableElement>> lookupMaps = new List<Map<String, ExecutableElement>>();
+    for (InterfaceType interfaceType in interfaces2) {
+      ClassElement interfaceElement = interfaceType.element;
+      if (interfaceElement != null) {
+        if (!visitedInterfaces.contains(interfaceElement)) {
+          javaSetAdd(visitedInterfaces, interfaceElement);
+          lookupMaps.add(computeInterfaceLookupMap(interfaceElement, visitedInterfaces));
+        } else {
+          Map<String, ExecutableElement> map = _interfaceLookup[classElt];
+          if (map != null) {
+            lookupMaps.add(map);
+          } else {
+            _interfaceLookup[interfaceElement] = resultMap;
+            return resultMap;
+          }
+        }
+      }
+    }
+    if (lookupMaps.length == 0) {
+      _interfaceLookup[classElt] = resultMap;
+      return resultMap;
+    }
+    Map<String, Set<ExecutableElement>> unionMap = new Map<String, Set<ExecutableElement>>();
+    for (Map<String, ExecutableElement> lookupMap in lookupMaps) {
+      for (MapEntry<String, ExecutableElement> entry in getMapEntrySet(lookupMap)) {
+        String key = entry.getKey();
+        if (!unionMap.containsKey(key)) {
+          Set<ExecutableElement> set = new Set<ExecutableElement>();
+          javaSetAdd(set, entry.getValue());
+          unionMap[key] = set;
+        } else {
+          javaSetAdd(unionMap[key], entry.getValue());
+        }
+      }
+    }
+    for (InterfaceType interfaceType in interfaces2) {
+      ClassElement interfaceElement = interfaceType.element;
+      if (interfaceElement != null) {
+        List<MethodElement> methods2 = interfaceElement.methods;
+        for (MethodElement method in methods2) {
+          if (method.isAccessibleIn(_library) && !method.isStatic()) {
+            String key = method.name;
+            if (!unionMap.containsKey(key)) {
+              Set<ExecutableElement> set = new Set<ExecutableElement>();
+              javaSetAdd(set, method);
+              unionMap[key] = set;
+            } else {
+              javaSetAdd(unionMap[key], method);
+            }
+          }
+        }
+        List<PropertyAccessorElement> accessors2 = interfaceElement.accessors;
+        for (PropertyAccessorElement accessor in accessors2) {
+          if (accessor.isAccessibleIn(_library) && !accessor.isStatic()) {
+            String key = accessor.name;
+            if (!unionMap.containsKey(key)) {
+              Set<ExecutableElement> set = new Set<ExecutableElement>();
+              javaSetAdd(set, accessor);
+              unionMap[key] = set;
+            } else {
+              javaSetAdd(unionMap[key], accessor);
+            }
+          }
+        }
+      }
+    }
+    for (MapEntry<String, Set<ExecutableElement>> entry in getMapEntrySet(unionMap)) {
+      String key = entry.getKey();
+      Set<ExecutableElement> set = entry.getValue();
+      int numOfEltsWithMatchingNames = set.length;
+      if (numOfEltsWithMatchingNames == 1) {
+        resultMap[key] = new JavaIterator(set).next();
+      } else {
+        bool allMethods = true;
+        bool allSetters = true;
+        bool allGetters = true;
+        for (ExecutableElement executableElement in set) {
+          if (executableElement is PropertyAccessorElement) {
+            allMethods = false;
+            if (((executableElement as PropertyAccessorElement)).isSetter()) {
+              allGetters = false;
+            } else {
+              allSetters = false;
+            }
+          } else {
+            allGetters = false;
+            allSetters = false;
+          }
+        }
+        if (allMethods || allGetters || allSetters) {
+          List<ExecutableElement> elements = new List.from(set);
+          List<FunctionType> executableElementTypes = new List<FunctionType>(numOfEltsWithMatchingNames);
+          for (int i = 0; i < numOfEltsWithMatchingNames; i++) {
+            executableElementTypes[i] = elements[i].type;
+          }
+          bool foundSubtypeOfAllTypes = true;
+          for (int i = 0; i < numOfEltsWithMatchingNames; i++) {
+            FunctionType subtype = executableElementTypes[i];
+            if (subtype == null) {
+              continue;
+            }
+            bool subtypeOfAllTypes = true;
+            for (int j = 0; j < numOfEltsWithMatchingNames && subtypeOfAllTypes; j++) {
+              if (i != j) {
+                if (!subtype.isSubtypeOf(executableElementTypes[j])) {
+                  subtypeOfAllTypes = false;
+                  foundSubtypeOfAllTypes = false;
+                  break;
+                }
+              }
+            }
+            if (subtypeOfAllTypes) {
+              resultMap[key] = elements[i];
+              break;
+            }
+          }
+          if (!foundSubtypeOfAllTypes) {
+            reportError(classElt, classElt.nameOffset, classElt.displayName.length, StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE, [key]);
+          }
+        } else {
+          if (!allMethods && !allGetters) {
+            reportError(classElt, classElt.nameOffset, classElt.displayName.length, StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD, [key]);
+          }
+          resultMap.remove(entry.getKey());
+        }
+      }
+    }
+    _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
+   * accessible from the current library are not considered.
+   * @param classElt the class element to query
+   * @param memberName the name of the member to lookup in the class
+   * @return the found {@link ExecutableElement}, or {@code null} if no such member was found
+   */
+  ExecutableElement lookupMemberInClass(ClassElement classElt, String memberName) {
+    List<MethodElement> methods2 = classElt.methods;
+    for (MethodElement method in methods2) {
+      if (memberName == method.name && method.isAccessibleIn(_library) && !method.isStatic()) {
+        return method;
+      }
+    }
+    List<PropertyAccessorElement> accessors2 = classElt.accessors;
+    for (PropertyAccessorElement accessor in accessors2) {
+      if (memberName == accessor.name && accessor.isAccessibleIn(_library) && !accessor.isStatic()) {
+        return accessor;
+      }
+    }
+    return null;
+  }
+  
+  /**
+   * Record the passed map with the set of all members (methods, getters and setters) in the class
+   * into the passed map.
+   * @param map some non-{@code null}
+   * @param classElt the class element that will be recorded into the passed map
+   */
+  void recordMapWithClassMembers(Map<String, ExecutableElement> map, ClassElement classElt) {
+    List<MethodElement> methods2 = classElt.methods;
+    for (MethodElement method in methods2) {
+      if (method.isAccessibleIn(_library) && !method.isStatic()) {
+        map[method.name] = method;
+      }
+    }
+    List<PropertyAccessorElement> accessors2 = classElt.accessors;
+    for (PropertyAccessorElement accessor in accessors2) {
+      if (accessor.isAccessibleIn(_library) && !accessor.isStatic()) {
+        map[accessor.name] = accessor;
+      }
+    }
+  }
+  
+  /**
+   * This method is used to report errors on when they are found computing inheritance information.
+   * See {@link ErrorVerifier#checkForInconsistentMethodInheritance()} to see where these generated
+   * error codes are reported back into the analysis engine.
+   * @param classElt the location of the source for which the exception occurred
+   * @param offset the offset of the location of the error
+   * @param length the length of the location of the error
+   * @param errorCode the error code to be associated with this error
+   * @param arguments the arguments used to build the error message
+   */
+  void reportError(ClassElement classElt, int offset, int length, ErrorCode errorCode, List<Object> arguments) {
+    Set<AnalysisError> errorSet = _errorsInClassElement[classElt];
+    if (errorSet == null) {
+      errorSet = new Set<AnalysisError>();
+      _errorsInClassElement[classElt] = errorSet;
+    }
+    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
@@ -2565,43 +3672,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
@@ -2614,6 +3741,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
@@ -2621,6 +3749,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
@@ -2628,6 +3757,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
@@ -2642,12 +3772,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
@@ -2655,17 +3787,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
@@ -2675,12 +3810,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
@@ -2690,6 +3827,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.
@@ -2701,6 +3839,18 @@
     libraries.addAll(_exportedLibraries.values);
     return new List.from(libraries);
   }
+  
+  /**
+   * Return the inheritance manager for this library.
+   * @return the inheritance manager for this library
+   */
+  InheritanceManager get inheritanceManager {
+    if (_inheritanceManager == null) {
+      return _inheritanceManager = new InheritanceManager(_libraryElement);
+    }
+    return _inheritanceManager;
+  }
+  
   /**
    * Return the library element representing this library, creating it if necessary.
    * @return the library element representing this library
@@ -2715,6 +3865,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
@@ -2725,28 +3876,54 @@
     }
     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 given URI against the URI of the library, or {@code null} if
-   * the URI is not valid. If the URI is not valid, report the error.
-   * @param uriLiteral the string literal specifying the URI to be resolved
-   * @return the result of resolving the given URI against the URI of the library
+   * 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.
+   * @param directive the directive which URI should be resolved
+   * @return the result of resolving the URI against the URI of the library
    */
-  Source getSource(StringLiteral uriLiteral) {
+  Source getSource(UriBasedDirective directive) {
+    StringLiteral uriLiteral = directive.uri;
     if (uriLiteral is StringInterpolation) {
       _errorListener.onError(new AnalysisError.con2(_librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.URI_WITH_INTERPOLATION, []));
       return null;
     }
-    Source source = getSource2(getStringValue(uriLiteral));
-    if (source == null || !source.exists()) {
-      _errorListener.onError(new AnalysisError.con2(_librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.INVALID_URI, [uriLiteral.toSource()]));
+    String uriContent = uriLiteral.stringValue.trim();
+    _directiveUris[directive] = uriContent;
+    try {
+      parseUriWithException(uriContent);
+      Source source = getSource2(uriContent);
+      if (source == null || !source.exists()) {
+        _errorListener.onError(new AnalysisError.con2(_librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.URI_DOES_NOT_EXIST, [uriContent]));
+      }
+      return source;
+    } on URISyntaxException catch (exception) {
+      _errorListener.onError(new AnalysisError.con2(_librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.INVALID_URI, [uriContent]));
     }
-    return source;
+    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.
+   * @param unit the AST structure associated with the defining compilation unit for this library
+   */
+  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
@@ -2754,32 +3931,19 @@
   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
    */
   void set libraryElement(LibraryElementImpl libraryElement2) {
     this._libraryElement = libraryElement2;
-  }
-  String toString() => _librarySource.shortName;
-  /**
-   * 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
-   * @param literal the string literal whose value is to be appended to the builder
-   * @throws IllegalArgumentException if the string is not a constant string without any string
-   * interpolation
-   */
-  void appendStringValue(JavaStringBuilder builder, StringLiteral literal) {
-    if (literal is SimpleStringLiteral) {
-      builder.append(((literal as SimpleStringLiteral)).value);
-    } else if (literal is AdjacentStrings) {
-      for (StringLiteral stringLiteral in ((literal as AdjacentStrings)).strings) {
-        appendStringValue(builder, stringLiteral);
-      }
-    } else {
-      throw new IllegalArgumentException();
+    if (_inheritanceManager != null) {
+      _inheritanceManager.libraryElement = libraryElement2;
     }
   }
+  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.
@@ -2792,39 +3956,29 @@
     }
     return _analysisContext.sourceFactory.resolveUri(_librarySource, uri);
   }
-  /**
-   * Return the value of the given string literal, or {@code null} if the string is not a constant
-   * string without any string interpolation.
-   * @param literal the string literal whose value is to be returned
-   * @return the value of the given string literal
-   */
-  String getStringValue(StringLiteral literal) {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    try {
-      appendStringValue(builder, literal);
-    } on IllegalArgumentException catch (exception) {
-      return null;
-    }
-    return builder.toString().trim();
-  }
 }
+
 /**
  * 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
@@ -2833,6 +3987,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
@@ -2857,11 +4012,13 @@
           directivesToResolve.add(directive);
         }
       } else if (directive is PartDirective) {
-        hasPartDirective = true;
-        StringLiteral partUri = ((directive as PartDirective)).uri;
-        Source partSource = library.getSource(partUri);
+        PartDirective partDirective = directive as PartDirective;
+        StringLiteral partUri = partDirective.uri;
+        Source partSource = library.getSource(partDirective);
         if (partSource != null && partSource.exists()) {
+          hasPartDirective = true;
           CompilationUnitElementImpl part = builder.buildCompilationUnit(partSource, library.getAST(partSource));
+          part.uri = library.getUri(partDirective);
           String partLibraryName = getPartLibraryName(library, partSource, directivesToResolve);
           if (partLibraryName == null) {
             _errorListener.onError(new AnalysisError.con2(librarySource2, partUri.offset, partUri.length, CompileTimeErrorCode.PART_OF_NON_PART, [partUri.toSource()]));
@@ -2885,13 +4042,39 @@
     if (entryPoint != null) {
       libraryElement.entryPoint = entryPoint;
     }
+    int sourcedUnitCount = sourcedCompilationUnits.length;
     libraryElement.parts = new List.from(sourcedCompilationUnits);
     for (Directive directive in directivesToResolve) {
       directive.element = libraryElement;
     }
     library.libraryElement = libraryElement;
+    if (sourcedUnitCount > 0) {
+      patchTopLevelAccessors(libraryElement);
+    }
     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.
+   * @param getters the map to which getters are to be added
+   * @param setters the list to which setters are to be added
+   * @param unit the compilation unit defining the accessors that are potentially being added
+   */
+  void collectAccessors(Map<String, PropertyAccessorElement> getters, List<PropertyAccessorElement> setters, CompilationUnitElement unit) {
+    for (PropertyAccessorElement accessor in unit.accessors) {
+      if (accessor.isGetter()) {
+        if (!accessor.isSynthetic() && accessor.correspondingSetter == null) {
+          getters[accessor.displayName] = accessor;
+        }
+      } else {
+        if (!accessor.isSynthetic() && accessor.correspondingGetter == null) {
+          setters.add(accessor);
+        }
+      }
+    }
+  }
+  
   /**
    * Search the top-level functions defined in the given compilation unit for the entry point.
    * @param element the compilation unit to be searched
@@ -2906,6 +4089,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
@@ -2930,86 +4114,150 @@
     }
     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
+   * any are found, make sure that they have the same variable element.
+   * @param libraryElement the library defining the compilation units to be processed
+   */
+  void patchTopLevelAccessors(LibraryElementImpl libraryElement) {
+    Map<String, PropertyAccessorElement> getters = new Map<String, PropertyAccessorElement>();
+    List<PropertyAccessorElement> setters = new List<PropertyAccessorElement>();
+    collectAccessors(getters, setters, libraryElement.definingCompilationUnit);
+    for (CompilationUnitElement unit in libraryElement.parts) {
+      collectAccessors(getters, setters, unit);
+    }
+    for (PropertyAccessorElement setter in setters) {
+      PropertyAccessorElement getter = getters[setter.displayName];
+      if (getter != null) {
+        PropertyInducingElementImpl variable2 = getter.variable as PropertyInducingElementImpl;
+        variable2.setter = setter;
+        ((setter as PropertyAccessorElementImpl)).variable = variable2;
+      }
+    }
+  }
 }
+
 /**
  * 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}.
    */
-  AnalysisErrorListener _errorListener;
-  /**
-   * This error listener is used by the resolver to be able to call the listener and get back the
-   * set of errors for each {@link Source}.
-   * @see #recordResults()
-   */
-  RecordingErrorListener _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
    */
-  LibraryResolver.con1(InternalAnalysisContext analysisContext) {
-    _jtd_constructor_264_impl(analysisContext);
+  LibraryResolver(InternalAnalysisContext analysisContext) {
+    this._analysisContext = analysisContext;
+    this._errorListener = new RecordingErrorListener();
+    _coreLibrarySource = analysisContext.sourceFactory.forUri(DartSdk.DART_CORE);
   }
-  _jtd_constructor_264_impl(InternalAnalysisContext analysisContext) {
-    _jtd_constructor_265_impl(analysisContext, null);
-  }
-  /**
-   * 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
-   * @param errorListener the listener to which analysis errors will be reported
-   */
-  LibraryResolver.con2(InternalAnalysisContext analysisContext2, AnalysisErrorListener additionalAnalysisErrorListener) {
-    _jtd_constructor_265_impl(analysisContext2, additionalAnalysisErrorListener);
-  }
-  _jtd_constructor_265_impl(InternalAnalysisContext analysisContext2, AnalysisErrorListener additionalAnalysisErrorListener) {
-    this._analysisContext = analysisContext2;
-    this._recordingErrorListener = new RecordingErrorListener();
-    if (additionalAnalysisErrorListener == null) {
-      this._errorListener = _recordingErrorListener;
-    } else {
-      this._errorListener = new AnalysisErrorListener_9(this, additionalAnalysisErrorListener);
-    }
-    _coreLibrarySource = analysisContext2.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
    */
-  AnalysisErrorListener get errorListener => _errorListener;
+  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.
+   * @param librarySource the source specifying the defining compilation unit of the library to be
+   * resolved
+   * @param unit the compilation unit representing the embedded library
+   * @param fullAnalysis {@code true} if a full analysis should be performed
+   * @return the element representing the resolved library
+   * @throws AnalysisException if the library could not be resolved for some reason
+   */
+  LibraryElement resolveEmbeddedLibrary(Source librarySource, CompilationUnit unit, bool fullAnalysis) {
+    InstrumentationBuilder instrumentation = Instrumentation.builder2("dart.engine.LibraryResolver.resolveEmbeddedLibrary");
+    try {
+      instrumentation.metric("fullAnalysis", fullAnalysis);
+      instrumentation.data3("fullName", librarySource.fullName);
+      Library targetLibrary = createLibrary2(librarySource, unit);
+      _coreLibrary = _libraryMap[_coreLibrarySource];
+      if (_coreLibrary == null) {
+        _coreLibrary = createLibrary(_coreLibrarySource);
+      }
+      instrumentation.metric3("createLibrary", "complete");
+      computeLibraryDependencies(targetLibrary);
+      _librariesInCycles = computeLibrariesInCycles(targetLibrary);
+      buildElementModels();
+      instrumentation.metric3("buildElementModels", "complete");
+      LibraryElement coreElement = _coreLibrary.libraryElement;
+      if (coreElement == null) {
+        throw new AnalysisException.con1("Could not resolve dart:core");
+      }
+      buildDirectiveModels();
+      instrumentation.metric3("buildDirectiveModels", "complete");
+      _typeProvider = new TypeProviderImpl(coreElement);
+      buildTypeHierarchies();
+      instrumentation.metric3("buildTypeHierarchies", "complete");
+      resolveReferencesAndTypes();
+      instrumentation.metric3("resolveReferencesAndTypes", "complete");
+      performConstantEvaluation();
+      instrumentation.metric3("performConstantEvaluation", "complete");
+      if (fullAnalysis) {
+        runAdditionalAnalyses();
+        instrumentation.metric3("runAdditionalAnalyses", "complete");
+      }
+      return targetLibrary.libraryElement;
+    } finally {
+      instrumentation.log();
+    }
+  }
+  
   /**
    * Resolve the library specified by the given source in the given context.
    * <p>
@@ -3054,8 +4302,6 @@
         runAdditionalAnalyses();
         instrumentation.metric3("runAdditionalAnalyses", "complete");
       }
-      recordResults();
-      instrumentation.metric3("recordResults", "complete");
       instrumentation.metric2("librariesInCycles", _librariesInCycles.length);
       for (Library lib in _librariesInCycles) {
         instrumentation.metric2("librariesInCycles-CompilationUnitSources-Size", lib.compilationUnitSources.length);
@@ -3065,6 +4311,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
@@ -3079,6 +4326,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
@@ -3098,6 +4346,7 @@
       }
     }
   }
+  
   /**
    * Add the given library, and all libraries reachable from it that have not already been visited,
    * to the given dependency map.
@@ -3117,6 +4366,7 @@
       }
     }
   }
+  
   /**
    * Build the element model representing the combinators declared by the given directive.
    * @param directive the directive that declares the combinators
@@ -3137,6 +4387,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.
@@ -3154,6 +4405,7 @@
           Library importedLibrary = library.getImport(importDirective);
           if (importedLibrary != null) {
             ImportElementImpl importElement = new ImportElementImpl();
+            importElement.uri = library.getUri(importDirective);
             importElement.combinators = buildCombinators(importDirective);
             LibraryElement importedLibraryElement = importedLibrary.libraryElement;
             if (importedLibraryElement != null) {
@@ -3175,6 +4427,7 @@
         } else if (directive is ExportDirective) {
           ExportDirective exportDirective = directive as ExportDirective;
           ExportElementImpl exportElement = new ExportElementImpl();
+          exportElement.uri = library.getUri(exportDirective);
           exportElement.combinators = buildCombinators(exportDirective);
           Library exportedLibrary = library.getExport(exportDirective);
           if (exportedLibrary != null) {
@@ -3199,6 +4452,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
@@ -3210,6 +4464,7 @@
       library.libraryElement = libraryElement;
     }
   }
+  
   /**
    * Resolve the type hierarchy across all of the types declared in the libraries in the current
    * cycle.
@@ -3223,6 +4478,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
@@ -3238,6 +4494,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.
@@ -3251,6 +4508,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.
@@ -3263,7 +4521,7 @@
     for (Directive directive in unit.directives) {
       if (directive is ImportDirective) {
         ImportDirective importDirective = directive as ImportDirective;
-        Source importedSource = library.getSource(importDirective.uri);
+        Source importedSource = library.getSource(importDirective);
         if (importedSource != null) {
           if (importedSource == _coreLibrarySource) {
             explicitlyImportsCore = true;
@@ -3285,7 +4543,7 @@
         }
       } else if (directive is ExportDirective) {
         ExportDirective exportDirective = directive as ExportDirective;
-        Source exportedSource = library.getSource(exportDirective.uri);
+        Source exportedSource = library.getSource(exportDirective);
         if (exportedSource != null) {
           Library exportedLibrary = _libraryMap[exportedSource];
           if (exportedLibrary == null) {
@@ -3315,6 +4573,7 @@
       }
     }
   }
+  
   /**
    * Create an object to represent the information about the library defined by the compilation unit
    * with the given source.
@@ -3328,6 +4587,21 @@
     _libraryMap[librarySource] = library;
     return library;
   }
+  
+  /**
+   * Create an object to represent the information about the library defined by the compilation unit
+   * with the given source.
+   * @param librarySource the source of the library's defining compilation unit
+   * @return the library object that was created
+   * @throws AnalysisException if the library source is not valid
+   */
+  Library createLibrary2(Source librarySource, CompilationUnit unit) {
+    Library library = new Library(_analysisContext, _errorListener, librarySource);
+    library.definingCompilationUnit = unit;
+    _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
@@ -3348,6 +4622,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
@@ -3362,6 +4637,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
@@ -3375,6 +4651,7 @@
     }
     return identifiers;
   }
+  
   /**
    * Compute a value for all of the constants in the libraries being analyzed.
    */
@@ -3394,32 +4671,7 @@
     }
     computer.computeValues();
   }
-  /**
-   * Record the results of resolution with the analysis context. This includes recording
-   * <ul>
-   * <li>the resolved AST associated with each compilation unit,</li>
-   * <li>the set of resolution errors produced for each compilation unit, and</li>
-   * <li>the element models produced for each library.</li>
-   * </ul>
-   */
-  void recordResults() {
-    Map<Source, LibraryElement> elementMap = new Map<Source, LibraryElement>();
-    for (Library library in _librariesInCycles) {
-      Source librarySource2 = library.librarySource;
-      recordResults2(librarySource2, librarySource2, library.definingCompilationUnit);
-      for (Source source in library.compilationUnitSources) {
-        recordResults2(source, librarySource2, library.getAST(source));
-      }
-      elementMap[library.librarySource] = library.libraryElement;
-    }
-    _analysisContext.recordLibraryElements(elementMap);
-  }
-  void recordResults2(Source source, Source librarySource, CompilationUnit unit) {
-    List<AnalysisError> errors = _recordingErrorListener.getErrors2(source);
-    unit.resolutionErrors = errors;
-    _analysisContext.recordResolvedCompilationUnit(source, librarySource, unit);
-    _analysisContext.recordResolutionErrors(source, librarySource, errors, unit.lineInfo);
-  }
+  
   /**
    * 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
@@ -3430,6 +4682,7 @@
       resolveReferencesAndTypes2(library);
     }
   }
+  
   /**
    * Resolve the identifiers and perform type analysis in the given library.
    * @param library the library to be resolved
@@ -3442,6 +4695,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
@@ -3452,6 +4706,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
@@ -3462,50 +4717,48 @@
     for (Source source in library.compilationUnitSources) {
       ErrorReporter errorReporter = new ErrorReporter(_errorListener, source);
       CompilationUnit unit = library.getAST(source);
-      ErrorVerifier errorVerifier = new ErrorVerifier(errorReporter, library.libraryElement, _typeProvider);
+      ErrorVerifier errorVerifier = new ErrorVerifier(errorReporter, library.libraryElement, _typeProvider, library.inheritanceManager);
       unit.accept(errorVerifier);
-      ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter);
+      ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter, _typeProvider);
       unit.accept(constantVerifier);
     }
   }
 }
-class AnalysisErrorListener_9 implements AnalysisErrorListener {
-  final LibraryResolver LibraryResolver_this;
-  AnalysisErrorListener additionalAnalysisErrorListener;
-  AnalysisErrorListener_9(this.LibraryResolver_this, this.additionalAnalysisErrorListener);
-  void onError(AnalysisError error) {
-    additionalAnalysisErrorListener.onError(error);
-    LibraryResolver_this._recordingErrorListener.onError(error);
-  }
-}
+
 /**
  * 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
@@ -3513,12 +4766,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_266_impl(library, source, typeProvider);
+    _jtd_constructor_272_impl(library, source, typeProvider);
   }
-  _jtd_constructor_266_impl(Library library, Source source, TypeProvider typeProvider) {
+  _jtd_constructor_272_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
@@ -3529,12 +4783,13 @@
    * during resolution
    */
   ResolverVisitor.con2(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, AnalysisErrorListener errorListener) : super.con2(definingLibrary, source, typeProvider, errorListener) {
-    _jtd_constructor_267_impl(definingLibrary, source, typeProvider, errorListener);
+    _jtd_constructor_273_impl(definingLibrary, source, typeProvider, errorListener);
   }
-  _jtd_constructor_267_impl(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, AnalysisErrorListener errorListener) {
+  _jtd_constructor_273_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
@@ -3542,62 +4797,49 @@
   TypeOverrideManager get overrideManager => _overrideManager;
   Object visitAsExpression(AsExpression node) {
     super.visitAsExpression(node);
-    if (StaticTypeAnalyzer.USE_TYPE_PROPAGATION) {
-      VariableElement element = getOverridableElement(node.expression);
-      if (element != null) {
-        Type2 type2 = node.type.type;
-        if (type2 != null) {
-          override(element, getType(element), type2);
-        }
-      }
+    VariableElement element = getOverridableElement(node.expression);
+    if (element != null) {
+      override(element, node.type.type);
     }
     return null;
   }
   Object visitAssertStatement(AssertStatement node) {
     super.visitAssertStatement(node);
-    if (StaticTypeAnalyzer.USE_TYPE_PROPAGATION) {
-      propagateTrueState(node.condition);
-    }
+    propagateTrueState(node.condition);
     return null;
   }
   Object visitBinaryExpression(BinaryExpression node) {
-    if (StaticTypeAnalyzer.USE_TYPE_PROPAGATION) {
-      sc.TokenType operatorType = node.operator.type;
-      if (identical(operatorType, sc.TokenType.AMPERSAND_AMPERSAND)) {
-        Expression leftOperand2 = node.leftOperand;
-        leftOperand2.accept(this);
-        Expression rightOperand2 = node.rightOperand;
-        if (rightOperand2 != null) {
-          try {
-            _overrideManager.enterScope();
-            propagateTrueState(leftOperand2);
-            rightOperand2.accept(this);
-          } finally {
-            _overrideManager.exitScope();
-          }
+    sc.TokenType operatorType = node.operator.type;
+    Expression leftOperand2 = node.leftOperand;
+    Expression rightOperand2 = node.rightOperand;
+    if (identical(operatorType, sc.TokenType.AMPERSAND_AMPERSAND)) {
+      safelyVisit(leftOperand2);
+      if (rightOperand2 != null) {
+        try {
+          _overrideManager.enterScope();
+          propagateTrueState(leftOperand2);
+          rightOperand2.accept(this);
+        } finally {
+          _overrideManager.exitScope();
         }
-      } else if (identical(operatorType, sc.TokenType.BAR_BAR)) {
-        Expression leftOperand3 = node.leftOperand;
-        leftOperand3.accept(this);
-        Expression rightOperand3 = node.rightOperand;
-        if (rightOperand3 != null) {
-          try {
-            _overrideManager.enterScope();
-            propagateFalseState(leftOperand3);
-            rightOperand3.accept(this);
-          } finally {
-            _overrideManager.exitScope();
-          }
-        }
-      } else {
-        node.leftOperand.accept(this);
-        node.rightOperand.accept(this);
       }
-      node.accept(_elementResolver);
-      node.accept(_typeAnalyzer);
+    } else if (identical(operatorType, sc.TokenType.BAR_BAR)) {
+      safelyVisit(leftOperand2);
+      if (rightOperand2 != null) {
+        try {
+          _overrideManager.enterScope();
+          propagateFalseState(leftOperand2);
+          rightOperand2.accept(this);
+        } finally {
+          _overrideManager.exitScope();
+        }
+      }
     } else {
-      super.visitBinaryExpression(node);
+      safelyVisit(leftOperand2);
+      safelyVisit(rightOperand2);
     }
+    node.accept(_elementResolver);
+    node.accept(_typeAnalyzer);
     return null;
   }
   Object visitBreakStatement(BreakStatement node) {
@@ -3623,68 +4865,62 @@
     return null;
   }
   Object visitCompilationUnit(CompilationUnit node) {
-    if (StaticTypeAnalyzer.USE_TYPE_PROPAGATION) {
-      try {
-        _overrideManager.enterScope();
-        for (Directive directive in node.directives) {
-          directive.accept(this);
-        }
-        List<CompilationUnitMember> classes = new List<CompilationUnitMember>();
-        for (CompilationUnitMember declaration in node.declarations) {
-          if (declaration is ClassDeclaration) {
-            classes.add(declaration);
-          } else {
-            declaration.accept(this);
-          }
-        }
-        for (CompilationUnitMember declaration in classes) {
+    try {
+      _overrideManager.enterScope();
+      for (Directive directive in node.directives) {
+        directive.accept(this);
+      }
+      List<CompilationUnitMember> classes = new List<CompilationUnitMember>();
+      for (CompilationUnitMember declaration in node.declarations) {
+        if (declaration is ClassDeclaration) {
+          classes.add(declaration);
+        } else {
           declaration.accept(this);
         }
-      } finally {
-        _overrideManager.exitScope();
       }
-      node.accept(_elementResolver);
-      node.accept(_typeAnalyzer);
-    } else {
-      super.visitCompilationUnit(node);
+      for (CompilationUnitMember declaration in classes) {
+        declaration.accept(this);
+      }
+    } finally {
+      _overrideManager.exitScope();
     }
+    node.accept(_elementResolver);
+    node.accept(_typeAnalyzer);
     return null;
   }
   Object visitConditionalExpression(ConditionalExpression node) {
-    if (StaticTypeAnalyzer.USE_TYPE_PROPAGATION) {
-      Expression condition2 = node.condition;
-      condition2.accept(this);
-      Expression thenExpression2 = node.thenExpression;
-      if (thenExpression2 != null) {
-        try {
-          _overrideManager.enterScope();
-          propagateTrueState(condition2);
-          thenExpression2.accept(this);
-        } finally {
-          _overrideManager.exitScope();
-        }
-      }
-      Expression elseExpression2 = node.elseExpression;
-      if (elseExpression2 != null) {
-        try {
-          _overrideManager.enterScope();
-          propagateFalseState(condition2);
-          elseExpression2.accept(this);
-        } finally {
-          _overrideManager.exitScope();
-        }
-      }
-      node.accept(_elementResolver);
-      node.accept(_typeAnalyzer);
-      bool thenIsAbrupt = thenExpression2 != null && isAbruptTermination(thenExpression2);
-      bool elseIsAbrupt = elseExpression2 != null && isAbruptTermination(elseExpression2);
-      if (elseIsAbrupt && !thenIsAbrupt) {
+    Expression condition2 = node.condition;
+    safelyVisit(condition2);
+    Expression thenExpression2 = node.thenExpression;
+    if (thenExpression2 != null) {
+      try {
+        _overrideManager.enterScope();
         propagateTrueState(condition2);
-      } else if (thenIsAbrupt && !elseIsAbrupt) {
-        propagateFalseState(condition2);
+        thenExpression2.accept(this);
+      } finally {
+        _overrideManager.exitScope();
       }
-    } else {
-      super.visitConditionalExpression(node);
+    }
+    Expression elseExpression2 = node.elseExpression;
+    if (elseExpression2 != null) {
+      try {
+        _overrideManager.enterScope();
+        propagateFalseState(condition2);
+        elseExpression2.accept(this);
+      } finally {
+        _overrideManager.exitScope();
+      }
+    }
+    node.accept(_elementResolver);
+    node.accept(_typeAnalyzer);
+    bool thenIsAbrupt = isAbruptTermination(thenExpression2);
+    bool elseIsAbrupt = isAbruptTermination(elseExpression2);
+    if (elseIsAbrupt && !thenIsAbrupt) {
+      propagateTrueState(condition2);
+      propagateState(thenExpression2);
+    } else if (thenIsAbrupt && !elseIsAbrupt) {
+      propagateFalseState(condition2);
+      propagateState(elseExpression2);
     }
     return null;
   }
@@ -3714,57 +4950,50 @@
     node.accept(_typeAnalyzer);
     return null;
   }
+  Object visitDoStatement(DoStatement node) {
+    try {
+      _overrideManager.enterScope();
+      super.visitDoStatement(node);
+    } finally {
+      _overrideManager.exitScope();
+    }
+    return null;
+  }
   Object visitFieldDeclaration(FieldDeclaration node) {
-    if (StaticTypeAnalyzer.USE_TYPE_PROPAGATION) {
-      try {
-        _overrideManager.enterScope();
-        super.visitFieldDeclaration(node);
-      } finally {
-        Map<Element, Type2> overrides = captureOverrides(node.fields);
-        _overrideManager.exitScope();
-        applyOverrides(overrides);
-      }
-    } else {
+    try {
+      _overrideManager.enterScope();
       super.visitFieldDeclaration(node);
+    } finally {
+      Map<Element, Type2> overrides = _overrideManager.captureOverrides(node.fields);
+      _overrideManager.exitScope();
+      _overrideManager.applyOverrides(overrides);
     }
     return null;
   }
   Object visitForEachStatement(ForEachStatement node) {
-    if (StaticTypeAnalyzer.USE_TYPE_PROPAGATION) {
-      try {
-        _overrideManager.enterScope();
-        super.visitForEachStatement(node);
-      } finally {
-        _overrideManager.exitScope();
-      }
-    } else {
+    try {
+      _overrideManager.enterScope();
       super.visitForEachStatement(node);
+    } finally {
+      _overrideManager.exitScope();
     }
     return null;
   }
   Object visitForStatement(ForStatement node) {
-    if (StaticTypeAnalyzer.USE_TYPE_PROPAGATION) {
-      try {
-        _overrideManager.enterScope();
-        super.visitForStatement(node);
-      } finally {
-        _overrideManager.exitScope();
-      }
-    } else {
+    try {
+      _overrideManager.enterScope();
       super.visitForStatement(node);
+    } finally {
+      _overrideManager.exitScope();
     }
     return null;
   }
   Object visitFunctionBody(FunctionBody node) {
-    if (StaticTypeAnalyzer.USE_TYPE_PROPAGATION) {
-      try {
-        _overrideManager.enterScope();
-        super.visitFunctionBody(node);
-      } finally {
-        _overrideManager.exitScope();
-      }
-    } else {
+    try {
+      _overrideManager.enterScope();
       super.visitFunctionBody(node);
+    } finally {
+      _overrideManager.exitScope();
     }
     return null;
   }
@@ -3783,54 +5012,56 @@
     ExecutableElement outerFunction = _enclosingFunction;
     try {
       _enclosingFunction = node.element;
-      if (StaticTypeAnalyzer.USE_TYPE_PROPAGATION) {
-        _overrideManager.enterScope();
-      }
+      _overrideManager.enterScope();
       super.visitFunctionExpression(node);
     } finally {
-      if (StaticTypeAnalyzer.USE_TYPE_PROPAGATION) {
-        _overrideManager.exitScope();
-      }
+      _overrideManager.exitScope();
       _enclosingFunction = outerFunction;
     }
     return null;
   }
   Object visitHideCombinator(HideCombinator node) => null;
   Object visitIfStatement(IfStatement node) {
-    if (StaticTypeAnalyzer.USE_TYPE_PROPAGATION) {
-      Expression condition2 = node.condition;
-      condition2.accept(this);
-      Statement thenStatement2 = node.thenStatement;
-      if (thenStatement2 != null) {
-        try {
-          _overrideManager.enterScope();
-          propagateTrueState(condition2);
-          thenStatement2.accept(this);
-        } finally {
-          _overrideManager.exitScope();
-        }
-      }
-      Statement elseStatement2 = node.elseStatement;
-      if (elseStatement2 != null) {
-        try {
-          _overrideManager.enterScope();
-          propagateFalseState(condition2);
-          elseStatement2.accept(this);
-        } finally {
-          _overrideManager.exitScope();
-        }
-      }
-      node.accept(_elementResolver);
-      node.accept(_typeAnalyzer);
-      bool thenIsAbrupt = thenStatement2 != null && isAbruptTermination2(thenStatement2);
-      bool elseIsAbrupt = elseStatement2 != null && isAbruptTermination2(elseStatement2);
-      if (elseIsAbrupt && !thenIsAbrupt) {
+    Expression condition2 = node.condition;
+    safelyVisit(condition2);
+    Map<Element, Type2> thenOverrides = null;
+    Statement thenStatement2 = node.thenStatement;
+    if (thenStatement2 != null) {
+      try {
+        _overrideManager.enterScope();
         propagateTrueState(condition2);
-      } else if (thenIsAbrupt && !elseIsAbrupt) {
-        propagateFalseState(condition2);
+        thenStatement2.accept(this);
+      } finally {
+        thenOverrides = _overrideManager.captureLocalOverrides();
+        _overrideManager.exitScope();
       }
-    } else {
-      super.visitIfStatement(node);
+    }
+    Map<Element, Type2> elseOverrides = null;
+    Statement elseStatement2 = node.elseStatement;
+    if (elseStatement2 != null) {
+      try {
+        _overrideManager.enterScope();
+        propagateFalseState(condition2);
+        elseStatement2.accept(this);
+      } finally {
+        elseOverrides = _overrideManager.captureLocalOverrides();
+        _overrideManager.exitScope();
+      }
+    }
+    node.accept(_elementResolver);
+    node.accept(_typeAnalyzer);
+    bool thenIsAbrupt = isAbruptTermination2(thenStatement2);
+    bool elseIsAbrupt = isAbruptTermination2(elseStatement2);
+    if (elseIsAbrupt && !thenIsAbrupt) {
+      propagateTrueState(condition2);
+      if (thenOverrides != null) {
+        _overrideManager.applyOverrides(thenOverrides);
+      }
+    } else if (thenIsAbrupt && !elseIsAbrupt) {
+      propagateFalseState(condition2);
+      if (elseOverrides != null) {
+        _overrideManager.applyOverrides(elseOverrides);
+      }
     }
     return null;
   }
@@ -3885,145 +5116,164 @@
     return null;
   }
   Object visitSwitchCase(SwitchCase node) {
-    if (StaticTypeAnalyzer.USE_TYPE_PROPAGATION) {
-      try {
-        _overrideManager.enterScope();
-        super.visitSwitchCase(node);
-      } finally {
-        _overrideManager.exitScope();
-      }
-    } else {
+    try {
+      _overrideManager.enterScope();
       super.visitSwitchCase(node);
+    } finally {
+      _overrideManager.exitScope();
     }
     return null;
   }
   Object visitSwitchDefault(SwitchDefault node) {
-    if (StaticTypeAnalyzer.USE_TYPE_PROPAGATION) {
-      try {
-        _overrideManager.enterScope();
-        super.visitSwitchDefault(node);
-      } finally {
-        _overrideManager.exitScope();
-      }
-    } else {
+    try {
+      _overrideManager.enterScope();
       super.visitSwitchDefault(node);
+    } finally {
+      _overrideManager.exitScope();
     }
     return null;
   }
   Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
-    if (StaticTypeAnalyzer.USE_TYPE_PROPAGATION) {
-      try {
-        _overrideManager.enterScope();
-        super.visitTopLevelVariableDeclaration(node);
-      } finally {
-        Map<Element, Type2> overrides = captureOverrides(node.variables);
-        _overrideManager.exitScope();
-        applyOverrides(overrides);
-      }
-    } else {
+    try {
+      _overrideManager.enterScope();
       super.visitTopLevelVariableDeclaration(node);
+    } finally {
+      Map<Element, Type2> overrides = _overrideManager.captureOverrides(node.variables);
+      _overrideManager.exitScope();
+      _overrideManager.applyOverrides(overrides);
     }
     return null;
   }
   Object visitTypeName(TypeName node) => null;
   Object visitWhileStatement(WhileStatement node) {
-    if (StaticTypeAnalyzer.USE_TYPE_PROPAGATION) {
-      Expression condition2 = node.condition;
-      condition2.accept(this);
-      Statement body2 = node.body;
-      if (body2 != null) {
-        try {
-          _overrideManager.enterScope();
-          propagateTrueState(condition2);
-          body2.accept(this);
-        } finally {
-          _overrideManager.exitScope();
-        }
+    Expression condition2 = node.condition;
+    safelyVisit(condition2);
+    Statement body2 = node.body;
+    if (body2 != null) {
+      try {
+        _overrideManager.enterScope();
+        propagateTrueState(condition2);
+        body2.accept(this);
+      } finally {
+        _overrideManager.exitScope();
       }
-      node.accept(_elementResolver);
-      node.accept(_typeAnalyzer);
-    } else {
-      super.visitWhileStatement(node);
     }
+    node.accept(_elementResolver);
+    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
    * @return the element associated with the given expression
    */
   VariableElement getOverridableElement(Expression expression) {
+    Element element = null;
     if (expression is SimpleIdentifier) {
-      Element element2 = ((expression as SimpleIdentifier)).element;
-      if (element2 is VariableElement) {
-        return element2 as VariableElement;
-      }
+      element = ((expression as SimpleIdentifier)).element;
+    } else if (expression is PrefixedIdentifier) {
+      element = ((expression as PrefixedIdentifier)).element;
+    } else if (expression is PropertyAccess) {
+      element = ((expression as PropertyAccess)).propertyName.element;
+    }
+    if (element is VariableElement) {
+      return element as VariableElement;
     }
     return null;
   }
-  void visitForEachStatementInScope(ForEachStatement node) {
-    if (StaticTypeAnalyzer.USE_TYPE_PROPAGATION) {
-      DeclaredIdentifier loopVariable2 = node.loopVariable;
-      safelyVisit(loopVariable2);
-      Expression iterator2 = node.iterator;
-      if (iterator2 != null) {
-        iterator2.accept(this);
-        if (loopVariable2 != null) {
-          LocalVariableElement loopElement = loopVariable2.element;
-          override(loopElement, loopElement.type, getIteratorElementType(iterator2));
-        }
+  
+  /**
+   * 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
+   * type.
+   * @param element the element whose type might be overridden
+   * @param potentialType the potential type of the element
+   */
+  void override(VariableElement element, Type2 potentialType) {
+    if (potentialType == null || identical(potentialType, BottomTypeImpl.instance)) {
+      return;
+    }
+    if (element is PropertyInducingElement) {
+      PropertyInducingElement variable = element as PropertyInducingElement;
+      if (!variable.isConst() && !variable.isFinal()) {
+        return;
       }
-      safelyVisit(node.body);
-      node.accept(_elementResolver);
-      node.accept(_typeAnalyzer);
-    } else {
-      super.visitForEachStatementInScope(node);
+    }
+    Type2 currentType = getBestType(element);
+    if (currentType == null || !currentType.isMoreSpecificThan(potentialType)) {
+      _overrideManager.setType(element, potentialType);
     }
   }
-  /**
-   * Apply a set of overrides that were previously captured.
-   * @param overrides the overrides to be applied
-   */
-  void applyOverrides(Map<Element, Type2> overrides) {
-    for (MapEntry<Element, Type2> entry in getMapEntrySet(overrides)) {
-      _overrideManager.setType(entry.getKey(), entry.getValue());
-    }
-  }
-  /**
-   * Return a map from the elements for the variables in the given list that have their types
-   * overridden to the overriding type.
-   * @param variableList the list of variables whose overriding types are to be captured
-   * @return a table mapping elements to their overriding types
-   */
-  Map<Element, Type2> captureOverrides(VariableDeclarationList variableList) {
-    Map<Element, Type2> overrides = new Map<Element, Type2>();
-    if (StaticTypeAnalyzer.USE_TYPE_PROPAGATION) {
-      if (variableList.isConst() || variableList.isFinal()) {
-        for (VariableDeclaration variable in variableList.variables) {
-          Element element2 = variable.element;
-          if (element2 != null) {
-            Type2 type = _overrideManager.getType(element2);
-            if (type != null) {
-              overrides[element2] = type;
-            }
+  void visitForEachStatementInScope(ForEachStatement node) {
+    Expression iterator2 = node.iterator;
+    safelyVisit(iterator2);
+    DeclaredIdentifier loopVariable2 = node.loopVariable;
+    safelyVisit(loopVariable2);
+    Statement body2 = node.body;
+    if (body2 != null) {
+      try {
+        _overrideManager.enterScope();
+        if (loopVariable2 != null && iterator2 != null) {
+          LocalVariableElement loopElement = loopVariable2.element;
+          if (loopElement != null) {
+            override(loopElement, getIteratorElementType(iterator2));
           }
         }
+        body2.accept(this);
+      } finally {
+        _overrideManager.exitScope();
       }
     }
-    return overrides;
+    node.accept(_elementResolver);
+    node.accept(_typeAnalyzer);
   }
+  void visitForStatementInScope(ForStatement node) {
+    safelyVisit(node.variables);
+    safelyVisit(node.initialization);
+    safelyVisit(node.condition);
+    _overrideManager.enterScope();
+    try {
+      propagateTrueState(node.condition);
+      safelyVisit(node.body);
+      node.updaters.accept(this);
+    } finally {
+      _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.
+   * @param element the element for which type information is to be returned
+   * @return the best type information available for the given element
+   */
+  Type2 getBestType(Element element) {
+    Type2 bestType = _overrideManager.getType(element);
+    if (bestType == null) {
+      if (element is LocalVariableElement) {
+        bestType = ((element as LocalVariableElement)).type;
+      } else if (element is ParameterElement) {
+        bestType = ((element as ParameterElement)).type;
+      }
+    }
+    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
@@ -4049,19 +5299,7 @@
     }
     return null;
   }
-  /**
-   * Return the type of the given (overridable) element.
-   * @param element the element whose type is to be returned
-   * @return the type of the given element
-   */
-  Type2 getType(Element element) {
-    if (element is LocalVariableElement) {
-      return ((element as LocalVariableElement)).type;
-    } else if (element is ParameterElement) {
-      return ((element as ParameterElement)).type;
-    }
-    return null;
-  }
+  
   /**
    * Return {@code true} if the given expression terminates abruptly (that is, if any expression
    * following the given expression will not be reached).
@@ -4074,6 +5312,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).
@@ -4081,7 +5320,7 @@
    * @return {@code true} if the given statement terminates abruptly
    */
   bool isAbruptTermination2(Statement statement) {
-    if (statement is ReturnStatement) {
+    if (statement is ReturnStatement || statement is BreakStatement || statement is ContinueStatement) {
       return true;
     } else if (statement is ExpressionStatement) {
       return isAbruptTermination(((statement as ExpressionStatement)).expression);
@@ -4095,90 +5334,72 @@
     }
     return false;
   }
-  /**
-   * If it is appropriate to do so, override the type of the given element. Use the static type and
-   * inferred type of the element to determine whether or not it is appropriate.
-   * @param element the element whose type might be overridden
-   * @param staticType the static type of the element
-   * @param inferredType the inferred type of the element
-   */
-  void override(VariableElement element, Type2 staticType, Type2 inferredType) {
-    if (identical(inferredType, BottomTypeImpl.instance)) {
-      return;
-    }
-    if (element is PropertyInducingElement) {
-      PropertyInducingElement variable = element as PropertyInducingElement;
-      if (!variable.isConst() && !variable.isFinal()) {
-        return;
-      }
-    }
-    if (staticType == null || (inferredType != null && inferredType.isMoreSpecificThan(staticType))) {
-      _overrideManager.setType(element, inferredType);
-    }
-  }
+  
   /**
    * Propagate any type information that results from knowing that the given condition will have
-   * evaluated to 'false'.
+   * been evaluated to 'false'.
    * @param condition the condition that will have evaluated to 'false'
    */
   void propagateFalseState(Expression condition) {
-    while (condition is ParenthesizedExpression) {
-      condition = ((condition as ParenthesizedExpression)).expression;
-    }
-    if (condition is IsExpression) {
-      IsExpression is2 = condition as IsExpression;
-      if (is2.notOperator != null) {
-        VariableElement element = getOverridableElement(is2.expression);
-        if (element != null) {
-          Type2 type2 = is2.type.type;
-          if (type2 != null) {
-            override(element, getType(element), type2);
-          }
-        }
-      }
-    } else if (condition is BinaryExpression) {
+    if (condition is BinaryExpression) {
       BinaryExpression binary = condition as BinaryExpression;
       if (identical(binary.operator.type, sc.TokenType.BAR_BAR)) {
         propagateFalseState(binary.leftOperand);
         propagateFalseState(binary.rightOperand);
       }
+    } else if (condition is IsExpression) {
+      IsExpression is2 = condition as IsExpression;
+      if (is2.notOperator != null) {
+        VariableElement element = getOverridableElement(is2.expression);
+        if (element != null) {
+          override(element, is2.type.type);
+        }
+      }
+    } else if (condition is PrefixExpression) {
+      PrefixExpression prefix = condition as PrefixExpression;
+      if (identical(prefix.operator.type, sc.TokenType.BANG)) {
+        propagateTrueState(prefix.operand);
+      }
+    } else if (condition is ParenthesizedExpression) {
+      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.
+   * @param expression the expression that will have been evaluated
+   */
+  void propagateState(Expression expression) {
+  }
+  
   /**
    * Propagate any type information that results from knowing that the given condition will have
-   * evaluated to 'true'.
+   * been evaluated to 'true'.
    * @param condition the condition that will have evaluated to 'true'
    */
   void propagateTrueState(Expression condition) {
-    while (condition is ParenthesizedExpression) {
-      condition = ((condition as ParenthesizedExpression)).expression;
-    }
-    if (condition is IsExpression) {
-      IsExpression is2 = condition as IsExpression;
-      if (is2.notOperator == null) {
-        VariableElement element = getOverridableElement(is2.expression);
-        if (element != null) {
-          Type2 type2 = is2.type.type;
-          if (type2 != null) {
-            override(element, getType(element), type2);
-          }
-        }
-      }
-    } else if (condition is BinaryExpression) {
+    if (condition is BinaryExpression) {
       BinaryExpression binary = condition as BinaryExpression;
       if (identical(binary.operator.type, sc.TokenType.AMPERSAND_AMPERSAND)) {
         propagateTrueState(binary.leftOperand);
         propagateTrueState(binary.rightOperand);
       }
-    }
-  }
-  /**
-   * Visit the given AST node if it is not null.
-   * @param node the node to be visited
-   */
-  void safelyVisit(ASTNode node) {
-    if (node != null) {
-      node.accept(this);
+    } else if (condition is IsExpression) {
+      IsExpression is2 = condition as IsExpression;
+      if (is2.notOperator == null) {
+        VariableElement element = getOverridableElement(is2.expression);
+        if (element != null) {
+          override(element, is2.type.type);
+        }
+      }
+    } else if (condition is PrefixExpression) {
+      PrefixExpression prefix = condition as PrefixExpression;
+      if (identical(prefix.operator.type, sc.TokenType.BANG)) {
+        propagateFalseState(prefix.operand);
+      }
+    } else if (condition is ParenthesizedExpression) {
+      propagateTrueState(((condition as ParenthesizedExpression)).expression);
     }
   }
   get elementResolver_J2DAccessor => _elementResolver;
@@ -4192,36 +5413,44 @@
   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
@@ -4229,9 +5458,9 @@
    * @param typeProvider the object used to access the types from the core library
    */
   ScopedVisitor.con1(Library library, Source source2, TypeProvider typeProvider2) {
-    _jtd_constructor_268_impl(library, source2, typeProvider2);
+    _jtd_constructor_274_impl(library, source2, typeProvider2);
   }
-  _jtd_constructor_268_impl(Library library, Source source2, TypeProvider typeProvider2) {
+  _jtd_constructor_274_impl(Library library, Source source2, TypeProvider typeProvider2) {
     this._definingLibrary = library.libraryElement;
     this._source = source2;
     LibraryScope libraryScope2 = library.libraryScope;
@@ -4239,6 +5468,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
@@ -4249,20 +5479,22 @@
    * during resolution
    */
   ScopedVisitor.con2(LibraryElement definingLibrary2, Source source2, TypeProvider typeProvider2, AnalysisErrorListener errorListener2) {
-    _jtd_constructor_269_impl(definingLibrary2, source2, typeProvider2, errorListener2);
+    _jtd_constructor_275_impl(definingLibrary2, source2, typeProvider2, errorListener2);
   }
-  _jtd_constructor_269_impl(LibraryElement definingLibrary2, Source source2, TypeProvider typeProvider2, AnalysisErrorListener errorListener2) {
+  _jtd_constructor_275_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
@@ -4363,7 +5595,7 @@
     Scope outerNameScope = _nameScope;
     _nameScope = new EnclosedScope(_nameScope);
     try {
-      super.visitForStatement(node);
+      visitForStatementInScope(node);
     } finally {
       _nameScope = outerNameScope;
       _labelScope = outerLabelScope;
@@ -4385,16 +5617,20 @@
     return null;
   }
   Object visitFunctionExpression(FunctionExpression node) {
-    Scope outerScope = _nameScope;
-    try {
-      ExecutableElement functionElement = node.element;
-      if (functionElement == null) {
-      } else {
-        _nameScope = new FunctionScope(_nameScope, functionElement);
-      }
+    if (node.parent is FunctionDeclaration) {
       super.visitFunctionExpression(node);
-    } finally {
-      _nameScope = outerScope;
+    } else {
+      Scope outerScope = _nameScope;
+      try {
+        ExecutableElement functionElement = node.element;
+        if (functionElement == null) {
+        } else {
+          _nameScope = new FunctionScope(_nameScope, functionElement);
+        }
+        super.visitFunctionExpression(node);
+      } finally {
+        _nameScope = outerScope;
+      }
     }
     return null;
   }
@@ -4429,26 +5665,22 @@
   }
   Object visitSwitchCase(SwitchCase node) {
     node.expression.accept(this);
-    LabelScope outerLabelScope = addScopesFor(node.labels);
     Scope outerNameScope = _nameScope;
     _nameScope = new EnclosedScope(_nameScope);
     try {
       node.statements.accept(this);
     } finally {
       _nameScope = outerNameScope;
-      _labelScope = outerLabelScope;
     }
     return null;
   }
   Object visitSwitchDefault(SwitchDefault node) {
-    LabelScope outerLabelScope = addScopesFor(node.labels);
     Scope outerNameScope = _nameScope;
     _nameScope = new EnclosedScope(_nameScope);
     try {
       node.statements.accept(this);
     } finally {
       _nameScope = outerNameScope;
-      _labelScope = outerLabelScope;
     }
     return null;
   }
@@ -4459,7 +5691,7 @@
       for (Label label in member.labels) {
         SimpleIdentifier labelName = label.label;
         LabelElement labelElement = labelName.element as LabelElement;
-        _labelScope = new LabelScope.con2(outerScope, labelName.name, labelElement);
+        _labelScope = new LabelScope.con2(_labelScope, labelName.name, labelElement);
       }
     }
     try {
@@ -4489,16 +5721,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
@@ -4508,15 +5743,38 @@
   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
+   * @param offset the offset of the location of the error
+   * @param length the length of the location of the error
+   * @param arguments the arguments to the error, used to compose the error message
+   */
+  void 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
    * @param token the token specifying the location of the error
    * @param arguments the arguments to the error, used to compose the error message
    */
-  void reportError3(ErrorCode errorCode, sc.Token token, List<Object> arguments) {
+  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
+   */
+  void safelyVisit(ASTNode node) {
+    if (node != null) {
+      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
@@ -4524,8 +5782,21 @@
    * @param node the statement to be visited
    */
   void visitForEachStatementInScope(ForEachStatement node) {
-    super.visitForEachStatement(node);
+    safelyVisit(node.iterator);
+    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
+   * enabled.
+   * @param node the statement to be visited
+   */
+  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
@@ -4542,6 +5813,7 @@
     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
@@ -4553,6 +5825,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.
@@ -4620,36 +5893,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 flag indicating whether type propagation should be enabled.
-   */
-  static bool USE_TYPE_PROPAGATION = true;
+  
   /**
    * 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
@@ -4660,6 +5936,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
@@ -4667,15 +5944,24 @@
   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>
    */
-  Object visitAdjacentStrings(AdjacentStrings node) => recordType(node, _typeProvider.stringType);
+  Object visitAdjacentStrings(AdjacentStrings node) {
+    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>
    */
-  Object visitArgumentDefinitionTest(ArgumentDefinitionTest node) => recordType(node, _typeProvider.boolType);
+  Object visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
+    recordStaticType(node, _typeProvider.boolType);
+    return null;
+  }
+  
   /**
    * The Dart Language Specification, 12.32: <blockquote>... the cast expression <i>e as T</i> ...
    * <p>
@@ -4684,10 +5970,14 @@
    * <p>
    * The static type of a cast expression <i>e as T</i> is <i>T</i>.</blockquote>
    */
-  Object visitAsExpression(AsExpression node) => recordType(node, getType4(node.type));
+  Object visitAsExpression(AsExpression node) {
+    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> ...
+   * The Dart Language Specification, 12.18: <blockquote>... an assignment <i>a</i> of the form <i>v
+   * = e</i> ...
    * <p>
    * It is a static type warning if the static type of <i>e</i> may not be assigned to the static
    * type of <i>v</i>.
@@ -4722,22 +6012,41 @@
    * <i>e<sub>2</sub></i>. A compound assignment of the form <i>e<sub>1</sub>\[e<sub>2</sub>\] op=
    * e<sub>3</sub></i> is equivalent to <i>((a, i) => a\[i\] = a\[i\] op e<sub>3</sub>)(e<sub>1</sub>,
    * e<sub>2</sub>)</i> where <i>a</i> and <i>i</i> are a variables that are not used in
-   * <i>e<sub>3</sub></i>. </blockquote>
+   * <i>e<sub>3</sub></i>.</blockquote>
    */
   Object visitAssignmentExpression(AssignmentExpression node) {
     sc.TokenType operator2 = node.operator.type;
-    if (operator2 != sc.TokenType.EQ) {
-      return recordReturnType(node, node.element);
-    }
-    Type2 rightType = getType2(node.rightHandSide);
-    if (USE_TYPE_PROPAGATION) {
+    if (identical(operator2, sc.TokenType.EQ)) {
+      Expression rightHandSide2 = node.rightHandSide;
+      Type2 staticType = getStaticType(rightHandSide2);
+      recordStaticType(node, staticType);
+      Type2 overrideType = staticType;
+      Type2 propagatedType = getPropagatedType(rightHandSide2);
+      if (propagatedType != null) {
+        if (propagatedType.isMoreSpecificThan(staticType)) {
+          recordPropagatedType(node, propagatedType);
+        }
+        overrideType = propagatedType;
+      }
       VariableElement element = _resolver.getOverridableElement(node.leftHandSide);
       if (element != null) {
-        override(element, getType(element), rightType);
+        _resolver.override(element, overrideType);
+      }
+    } else {
+      ExecutableElement staticMethodElement = node.staticElement;
+      Type2 staticType = computeReturnType(staticMethodElement);
+      recordStaticType(node, staticType);
+      MethodElement propagatedMethodElement = node.element;
+      if (propagatedMethodElement != staticMethodElement) {
+        Type2 propagatedType = computeReturnType(propagatedMethodElement);
+        if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
+          recordPropagatedType(node, propagatedType);
+        }
       }
     }
-    return recordType(node, rightType);
+    return null;
   }
+  
   /**
    * The Dart Language Specification, 12.20: <blockquote>The static type of a logical boolean
    * expression is {@code bool}.</blockquote>
@@ -4776,35 +6085,40 @@
    * <i>super.op(e<sub>2</sub>)</i>.</blockquote>
    */
   Object visitBinaryExpression(BinaryExpression node) {
-    sc.TokenType operator2 = node.operator.type;
-    while (true) {
-      if (operator2 == sc.TokenType.AMPERSAND_AMPERSAND || operator2 == sc.TokenType.BAR_BAR || operator2 == sc.TokenType.EQ_EQ || operator2 == sc.TokenType.BANG_EQ) {
-        return recordType(node, _typeProvider.boolType);
-      } else if (operator2 == sc.TokenType.MINUS || operator2 == sc.TokenType.PERCENT || operator2 == sc.TokenType.PLUS || operator2 == sc.TokenType.STAR || operator2 == sc.TokenType.TILDE_SLASH) {
-        Type2 intType2 = _typeProvider.intType;
-        if (identical(getType2(node.leftOperand), intType2) && identical(getType2(node.rightOperand), intType2)) {
-          return recordType(node, intType2);
-        }
-      } else if (operator2 == sc.TokenType.SLASH) {
-        Type2 doubleType2 = _typeProvider.doubleType;
-        if (identical(getType2(node.leftOperand), doubleType2) || identical(getType2(node.rightOperand), doubleType2)) {
-          return recordType(node, doubleType2);
-        }
+    ExecutableElement staticMethodElement = node.staticElement;
+    Type2 staticType = computeReturnType(staticMethodElement);
+    staticType = refineBinaryExpressionType(node, staticType);
+    recordStaticType(node, staticType);
+    MethodElement propagatedMethodElement = node.element;
+    if (propagatedMethodElement != staticMethodElement) {
+      Type2 propagatedType = computeReturnType(propagatedMethodElement);
+      if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
+        recordPropagatedType(node, propagatedType);
       }
-      break;
     }
-    return recordReturnType(node, node.element);
+    return null;
   }
+  
   /**
-   * The Dart Language Specification, 12.4: <blockquote>The static type of a boolean literal is{@code bool}.</blockquote>
+   * The Dart Language Specification, 12.4: <blockquote>The static type of a boolean literal is
+   * bool.</blockquote>
    */
-  Object visitBooleanLiteral(BooleanLiteral node) => recordType(node, _typeProvider.boolType);
+  Object visitBooleanLiteral(BooleanLiteral node) {
+    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
    * t;}(e)</i>.</blockquote>
    */
-  Object visitCascadeExpression(CascadeExpression node) => recordType(node, getType2(node.target));
+  Object visitCascadeExpression(CascadeExpression node) {
+    recordStaticType(node, getStaticType(node.target));
+    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> ...
@@ -4815,24 +6129,52 @@
    * and the static type of <i>e<sub>3</sub></i>.</blockquote>
    */
   Object visitConditionalExpression(ConditionalExpression node) {
-    Type2 thenType = getType2(node.thenExpression);
-    Type2 elseType = getType2(node.elseExpression);
-    if (thenType == null) {
-      return recordType(node, _dynamicType);
+    Type2 staticThenType = getStaticType(node.thenExpression);
+    Type2 staticElseType = getStaticType(node.elseExpression);
+    if (staticThenType == null) {
+      staticThenType = _dynamicType;
     }
-    Type2 resultType = thenType.getLeastUpperBound(elseType);
-    return recordType(node, resultType);
+    if (staticElseType == null) {
+      staticElseType = _dynamicType;
+    }
+    Type2 staticType = staticThenType.getLeastUpperBound(staticElseType);
+    if (staticType == null) {
+      staticType = _dynamicType;
+    }
+    recordStaticType(node, staticType);
+    Type2 propagatedThenType = getPropagatedType(node.thenExpression);
+    Type2 propagatedElseType = getPropagatedType(node.elseExpression);
+    if (propagatedThenType != null || propagatedElseType != null) {
+      if (propagatedThenType == null) {
+        propagatedThenType = staticThenType;
+      }
+      if (propagatedElseType == null) {
+        propagatedElseType = staticElseType;
+      }
+      Type2 propagatedType = propagatedThenType.getLeastUpperBound(propagatedElseType);
+      if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
+        recordPropagatedType(node, propagatedType);
+      }
+    }
+    return null;
   }
+  
   /**
-   * The Dart Language Specification, 12.3: <blockquote>The static type of a literal double is{@code double}.</blockquote>
+   * The Dart Language Specification, 12.3: <blockquote>The static type of a literal double is
+   * double.</blockquote>
    */
-  Object visitDoubleLiteral(DoubleLiteral node) => recordType(node, _typeProvider.doubleType);
+  Object visitDoubleLiteral(DoubleLiteral node) {
+    recordStaticType(node, _typeProvider.doubleType);
+    return null;
+  }
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     FunctionExpression function = node.functionExpression;
     FunctionTypeImpl functionType = node.element.type as FunctionTypeImpl;
-    setTypeInformation(functionType, computeReturnType(node), function.parameters);
-    return recordType(function, functionType);
+    setTypeInformation(functionType, computeReturnType2(node), function.parameters);
+    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>
@@ -4868,9 +6210,11 @@
       return null;
     }
     FunctionTypeImpl functionType = node.element.type as FunctionTypeImpl;
-    setTypeInformation(functionType, computeReturnType2(node), node.parameters);
-    return recordType(node, functionType);
+    setTypeInformation(functionType, computeReturnType3(node), node.parameters);
+    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>:
@@ -4883,7 +6227,20 @@
    * If <i>F</i> is not a function type, the static type of <i>i</i> is dynamic. Otherwise the
    * static type of <i>i</i> is the declared return type of <i>F</i>.</blockquote>
    */
-  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) => recordReturnType(node, node.element);
+  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    ExecutableElement staticMethodElement = node.staticElement;
+    Type2 staticType = computeReturnType(staticMethodElement);
+    recordStaticType(node, staticType);
+    ExecutableElement propagatedMethodElement = node.element;
+    Type2 propagatedType = computeReturnType(propagatedMethodElement);
+    if (staticType == null) {
+      recordStaticType(node, propagatedType);
+    } else if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
+      recordPropagatedType(node, propagatedType);
+    }
+    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
@@ -4891,10 +6248,31 @@
    */
   Object visitIndexExpression(IndexExpression node) {
     if (node.inSetterContext()) {
-      return recordArgumentType(node, node.element);
+      ExecutableElement staticMethodElement = node.staticElement;
+      Type2 staticType = computeArgumentType(staticMethodElement);
+      recordStaticType(node, staticType);
+      MethodElement propagatedMethodElement = node.element;
+      if (propagatedMethodElement != staticMethodElement) {
+        Type2 propagatedType = computeArgumentType(propagatedMethodElement);
+        if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
+          recordPropagatedType(node, propagatedType);
+        }
+      }
+    } else {
+      ExecutableElement staticMethodElement = node.staticElement;
+      Type2 staticType = computeReturnType(staticMethodElement);
+      recordStaticType(node, staticType);
+      MethodElement propagatedMethodElement = node.element;
+      if (propagatedMethodElement != staticMethodElement) {
+        Type2 propagatedType = computeReturnType(propagatedMethodElement);
+        if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
+          recordPropagatedType(node, propagatedType);
+        }
+      }
     }
-    return recordReturnType(node, node.element);
+    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
@@ -4905,31 +6283,39 @@
    * form <i>const T(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> is <i>T</i>. </blockquote>
    */
   Object visitInstanceCreationExpression(InstanceCreationExpression node) {
-    if (USE_TYPE_PROPAGATION) {
-      ConstructorElement element2 = node.element;
-      if (element2 != null && "Element" == element2.enclosingElement.name && "tag" == element2.name) {
-        LibraryElement library2 = element2.library;
-        if (isHtmlLibrary(library2)) {
-          Type2 returnType = getFirstArgumentAsType2(library2, node.argumentList, _HTML_ELEMENT_TO_CLASS_MAP);
-          if (returnType != null) {
-            return recordType(node, returnType);
-          }
+    recordStaticType(node, node.constructorName.type.type);
+    ConstructorElement element2 = node.element;
+    if (element2 != null && "Element" == element2.enclosingElement.name && "tag" == element2.name) {
+      LibraryElement library2 = element2.library;
+      if (isHtmlLibrary(library2)) {
+        Type2 returnType = getFirstArgumentAsType2(library2, node.argumentList, _HTML_ELEMENT_TO_CLASS_MAP);
+        if (returnType != null) {
+          recordPropagatedType(node, returnType);
         }
       }
     }
-    return recordType(node, node.constructorName.type.type);
+    return null;
   }
+  
   /**
    * The Dart Language Specification, 12.3: <blockquote>The static type of an integer literal is{@code int}.</blockquote>
    */
-  Object visitIntegerLiteral(IntegerLiteral node) => recordType(node, _typeProvider.intType);
+  Object visitIntegerLiteral(IntegerLiteral node) {
+    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.
    * <p>
    * The static type of an is-expression is {@code bool}.</blockquote>
    */
-  Object visitIsExpression(IsExpression node) => recordType(node, _typeProvider.boolType);
+  Object visitIsExpression(IsExpression node) {
+    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
@@ -4938,16 +6324,41 @@
    * the form <i>\[e<sub>1</sub>, &hellip;, e<sub>n</sub>\]</i> is {@code List&lt;dynamic&gt;}.</blockquote>
    */
   Object visitListLiteral(ListLiteral node) {
+    Type2 staticType = _dynamicType;
     TypeArgumentList typeArguments2 = node.typeArguments;
     if (typeArguments2 != null) {
       NodeList<TypeName> arguments2 = typeArguments2.arguments;
       if (arguments2 != null && arguments2.length == 1) {
-        TypeName argumentType = arguments2[0];
-        return recordType(node, _typeProvider.listType.substitute5(<Type2> [getType4(argumentType)]));
+        TypeName argumentTypeName = arguments2[0];
+        Type2 argumentType = getType2(argumentTypeName);
+        if (argumentType != null) {
+          staticType = argumentType;
+        }
       }
     }
-    return recordType(node, _typeProvider.listType.substitute5(<Type2> [_dynamicType]));
+    recordStaticType(node, _typeProvider.listType.substitute5(<Type2> [staticType]));
+    NodeList<Expression> elements2 = node.elements;
+    int count = elements2.length;
+    if (count > 0) {
+      Type2 propagatedType = getBestType(elements2[0]);
+      for (int i = 1; i < count; i++) {
+        Type2 elementType = getBestType(elements2[i]);
+        if (propagatedType != elementType) {
+          propagatedType = _dynamicType;
+        } else {
+          propagatedType = propagatedType.getLeastUpperBound(elementType);
+          if (propagatedType == null) {
+            propagatedType = _dynamicType;
+          }
+        }
+      }
+      if (propagatedType.isMoreSpecificThan(staticType)) {
+        recordPropagatedType(node, _typeProvider.listType.substitute5(<Type2> [propagatedType]));
+      }
+    }
+    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;,
@@ -4961,19 +6372,67 @@
    * <i>String</i>.</blockquote>
    */
   Object visitMapLiteral(MapLiteral node) {
+    Type2 staticKeyType = _dynamicType;
+    Type2 staticValueType = _dynamicType;
     TypeArgumentList typeArguments2 = node.typeArguments;
     if (typeArguments2 != null) {
       NodeList<TypeName> arguments2 = typeArguments2.arguments;
       if (arguments2 != null && arguments2.length == 2) {
-        TypeName keyType = arguments2[0];
-        if (keyType != _typeProvider.stringType) {
+        TypeName entryKeyTypeName = arguments2[0];
+        Type2 entryKeyType = getType2(entryKeyTypeName);
+        if (entryKeyType != null) {
+          staticKeyType = entryKeyType;
         }
-        TypeName valueType = arguments2[1];
-        return recordType(node, _typeProvider.mapType.substitute5(<Type2> [_typeProvider.stringType, getType4(valueType)]));
+        TypeName entryValueTypeName = arguments2[1];
+        Type2 entryValueType = getType2(entryValueTypeName);
+        if (entryValueType != null) {
+          staticValueType = entryValueType;
+        }
       }
     }
-    return recordType(node, _typeProvider.mapType.substitute5(<Type2> [_typeProvider.stringType, _dynamicType]));
+    recordStaticType(node, _typeProvider.mapType.substitute5(<Type2> [staticKeyType, staticValueType]));
+    NodeList<MapLiteralEntry> entries2 = node.entries;
+    int count = entries2.length;
+    if (count > 0) {
+      MapLiteralEntry entry = entries2[0];
+      Type2 propagatedKeyType = getBestType(entry.key);
+      Type2 propagatedValueType = getBestType(entry.value);
+      for (int i = 1; i < count; i++) {
+        entry = entries2[i];
+        Type2 elementKeyType = getBestType(entry.key);
+        if (propagatedKeyType != elementKeyType) {
+          propagatedKeyType = _dynamicType;
+        } else {
+          propagatedKeyType = propagatedKeyType.getLeastUpperBound(elementKeyType);
+          if (propagatedKeyType == null) {
+            propagatedKeyType = _dynamicType;
+          }
+        }
+        Type2 elementValueType = getBestType(entry.value);
+        if (propagatedValueType != elementValueType) {
+          propagatedValueType = _dynamicType;
+        } else {
+          propagatedValueType = propagatedValueType.getLeastUpperBound(elementValueType);
+          if (propagatedValueType == null) {
+            propagatedValueType = _dynamicType;
+          }
+        }
+      }
+      bool betterKey = propagatedKeyType != null && propagatedKeyType.isMoreSpecificThan(staticKeyType);
+      bool betterValue = propagatedValueType != null && propagatedValueType.isMoreSpecificThan(staticValueType);
+      if (betterKey || betterValue) {
+        if (!betterKey) {
+          propagatedKeyType = staticKeyType;
+        }
+        if (!betterValue) {
+          propagatedValueType = staticValueType;
+        }
+        recordPropagatedType(node, _typeProvider.mapType.substitute5(<Type2> [propagatedKeyType, propagatedValueType]));
+      }
+    }
+    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>,
@@ -5011,63 +6470,103 @@
    * <i>F</i>.</blockquote>
    */
   Object visitMethodInvocation(MethodInvocation node) {
-    if (USE_TYPE_PROPAGATION) {
-      String methodName2 = node.methodName.name;
-      if (methodName2 == "\$dom_createEvent") {
-        Expression target = node.realTarget;
-        if (target != null) {
-          Type2 targetType = getType2(target);
-          if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || targetType.name == "Document")) {
-            LibraryElement library2 = targetType.element.library;
-            if (isHtmlLibrary(library2)) {
-              Type2 returnType = getFirstArgumentAsType(library2, node.argumentList);
-              if (returnType != null) {
-                return recordType(node, returnType);
-              }
+    SimpleIdentifier methodNameNode = node.methodName;
+    Element staticMethodElement = methodNameNode.staticElement;
+    if (staticMethodElement == null) {
+      staticMethodElement = methodNameNode.element;
+    }
+    Type2 staticType = computeReturnType(staticMethodElement);
+    recordStaticType(node, staticType);
+    String methodName = methodNameNode.name;
+    if (methodName == "\$dom_createEvent") {
+      Expression target = node.realTarget;
+      if (target != null) {
+        Type2 targetType = getBestType(target);
+        if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || targetType.name == "Document")) {
+          LibraryElement library2 = targetType.element.library;
+          if (isHtmlLibrary(library2)) {
+            Type2 returnType = getFirstArgumentAsType(library2, node.argumentList);
+            if (returnType != null) {
+              recordPropagatedType(node, returnType);
             }
           }
         }
-      } else if (methodName2 == "query") {
-        Expression target = node.realTarget;
-        if (target == null) {
-          Element methodElement = node.methodName.element;
-          if (methodElement != null) {
-            LibraryElement library3 = methodElement.library;
-            if (isHtmlLibrary(library3)) {
-              Type2 returnType = getFirstArgumentAsQuery(library3, node.argumentList);
-              if (returnType != null) {
-                return recordType(node, returnType);
-              }
-            }
-          }
-        } else {
-          Type2 targetType = getType2(target);
-          if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || targetType.name == "Document")) {
-            LibraryElement library4 = targetType.element.library;
-            if (isHtmlLibrary(library4)) {
-              Type2 returnType = getFirstArgumentAsQuery(library4, node.argumentList);
-              if (returnType != null) {
-                return recordType(node, returnType);
-              }
+      }
+    } else if (methodName == "query") {
+      Expression target = node.realTarget;
+      if (target == null) {
+        Element methodElement = methodNameNode.element;
+        if (methodElement != null) {
+          LibraryElement library3 = methodElement.library;
+          if (isHtmlLibrary(library3)) {
+            Type2 returnType = getFirstArgumentAsQuery(library3, node.argumentList);
+            if (returnType != null) {
+              recordPropagatedType(node, returnType);
             }
           }
         }
-      } else if (methodName2 == "JS") {
-        Type2 returnType = getFirstArgumentAsType(_typeProvider.objectType.element.library, node.argumentList);
-        if (returnType != null) {
-          return recordType(node, returnType);
+      } else {
+        Type2 targetType = getBestType(target);
+        if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || targetType.name == "Document")) {
+          LibraryElement library4 = targetType.element.library;
+          if (isHtmlLibrary(library4)) {
+            Type2 returnType = getFirstArgumentAsQuery(library4, node.argumentList);
+            if (returnType != null) {
+              recordPropagatedType(node, returnType);
+            }
+          }
+        }
+      }
+    } else if (methodName == "\$dom_createElement") {
+      Expression target = node.realTarget;
+      Type2 targetType = getBestType(target);
+      if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || targetType.name == "Document")) {
+        LibraryElement library5 = targetType.element.library;
+        if (isHtmlLibrary(library5)) {
+          Type2 returnType = getFirstArgumentAsQuery(library5, node.argumentList);
+          if (returnType != null) {
+            recordPropagatedType(node, returnType);
+          }
+        }
+      }
+    } else if (methodName == "JS") {
+      Type2 returnType = getFirstArgumentAsType(_typeProvider.objectType.element.library, node.argumentList);
+      if (returnType != null) {
+        recordPropagatedType(node, returnType);
+      }
+    } else {
+      Element propagatedElement = methodNameNode.element;
+      if (propagatedElement != staticMethodElement) {
+        Type2 propagatedType = computeReturnType(propagatedElement);
+        if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
+          recordPropagatedType(node, propagatedType);
         }
       }
     }
-    return recordReturnType(node, node.methodName.element);
+    return null;
   }
-  Object visitNamedExpression(NamedExpression node) => recordType(node, getType2(node.expression));
+  Object visitNamedExpression(NamedExpression node) {
+    Expression expression2 = node.expression;
+    recordStaticType(node, getStaticType(expression2));
+    recordPropagatedType(node, getPropagatedType(expression2));
+    return null;
+  }
+  
   /**
    * The Dart Language Specification, 12.2: <blockquote>The static type of {@code null} is bottom.
    * </blockquote>
    */
-  Object visitNullLiteral(NullLiteral node) => recordType(node, _typeProvider.bottomType);
-  Object visitParenthesizedExpression(ParenthesizedExpression node) => recordType(node, getType2(node.expression));
+  Object visitNullLiteral(NullLiteral node) {
+    recordStaticType(node, _typeProvider.bottomType);
+    return null;
+  }
+  Object visitParenthesizedExpression(ParenthesizedExpression node) {
+    Expression expression2 = node.expression;
+    recordStaticType(node, getStaticType(expression2));
+    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;
@@ -5094,47 +6593,57 @@
    * A postfix expression of the form <i>e1\[e2\]--</i> is equivalent to <i>(a, i){var r = a\[i\]; a\[i\]
    * = r - 1; return r}(e1, e2)</i></blockquote>
    */
-  Object visitPostfixExpression(PostfixExpression node) => recordType(node, getType2(node.operand));
+  Object visitPostfixExpression(PostfixExpression node) {
+    Expression operand2 = node.operand;
+    Type2 staticType = getStaticType(operand2);
+    sc.TokenType operator2 = node.operator.type;
+    if (identical(operator2, sc.TokenType.MINUS_MINUS) || identical(operator2, sc.TokenType.PLUS_PLUS)) {
+      Type2 intType2 = _typeProvider.intType;
+      if (identical(getStaticType(node.operand), intType2)) {
+        staticType = intType2;
+      }
+    }
+    recordStaticType(node, staticType);
+    recordPropagatedType(node, getPropagatedType(operand2));
+    return null;
+  }
+  
   /**
    * See {@link #visitSimpleIdentifier(SimpleIdentifier)}.
    */
   Object visitPrefixedIdentifier(PrefixedIdentifier node) {
     SimpleIdentifier prefixedIdentifier = node.identifier;
     Element element2 = prefixedIdentifier.element;
-    if (element2 == null) {
-      return recordType(node, _dynamicType);
-    }
-    if (USE_TYPE_PROPAGATION) {
-      Type2 type = _overrideManager.getType(element2);
-      if (type != null) {
-        return recordType(node, type);
-      }
-    }
-    Type2 type;
+    Type2 staticType = _dynamicType;
     if (element2 is ClassElement) {
       if (isNotTypeLiteral(node)) {
-        type = ((element2 as ClassElement)).type;
+        staticType = ((element2 as ClassElement)).type;
       } else {
-        type = _typeProvider.typeType;
+        staticType = _typeProvider.typeType;
       }
     } else if (element2 is FunctionTypeAliasElement) {
-      type = ((element2 as FunctionTypeAliasElement)).type;
+      staticType = ((element2 as FunctionTypeAliasElement)).type;
     } else if (element2 is MethodElement) {
-      type = ((element2 as MethodElement)).type;
+      staticType = ((element2 as MethodElement)).type;
     } else if (element2 is PropertyAccessorElement) {
-      type = getType3((element2 as PropertyAccessorElement), node.prefix.staticType);
+      staticType = getType((element2 as PropertyAccessorElement), node.prefix.staticType);
     } else if (element2 is ExecutableElement) {
-      type = ((element2 as ExecutableElement)).type;
+      staticType = ((element2 as ExecutableElement)).type;
     } else if (element2 is TypeVariableElement) {
-      type = ((element2 as TypeVariableElement)).type;
+      staticType = ((element2 as TypeVariableElement)).type;
     } else if (element2 is VariableElement) {
-      type = ((element2 as VariableElement)).type;
-    } else {
-      type = _dynamicType;
+      staticType = ((element2 as VariableElement)).type;
     }
-    recordType(prefixedIdentifier, type);
-    return recordType(node, type);
+    recordStaticType(prefixedIdentifier, staticType);
+    recordStaticType(node, staticType);
+    Type2 propagatedType = _overrideManager.getType(element2);
+    if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
+      recordPropagatedType(prefixedIdentifier, propagatedType);
+      recordPropagatedType(node, propagatedType);
+    }
+    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
@@ -5143,10 +6652,28 @@
   Object visitPrefixExpression(PrefixExpression node) {
     sc.TokenType operator2 = node.operator.type;
     if (identical(operator2, sc.TokenType.BANG)) {
-      return recordType(node, _typeProvider.boolType);
+      recordStaticType(node, _typeProvider.boolType);
+    } else {
+      ExecutableElement staticMethodElement = node.staticElement;
+      Type2 staticType = computeReturnType(staticMethodElement);
+      if (identical(operator2, sc.TokenType.MINUS_MINUS) || identical(operator2, sc.TokenType.PLUS_PLUS)) {
+        Type2 intType2 = _typeProvider.intType;
+        if (identical(getStaticType(node.operand), intType2)) {
+          staticType = intType2;
+        }
+      }
+      recordStaticType(node, staticType);
+      MethodElement propagatedMethodElement = node.element;
+      if (propagatedMethodElement != staticMethodElement) {
+        Type2 propagatedType = computeReturnType(propagatedMethodElement);
+        if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
+          recordPropagatedType(node, propagatedType);
+        }
+      }
     }
-    return recordReturnType(node, node.element);
+    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>
@@ -5193,30 +6720,31 @@
   Object visitPropertyAccess(PropertyAccess node) {
     SimpleIdentifier propertyName2 = node.propertyName;
     Element element2 = propertyName2.element;
-    if (USE_TYPE_PROPAGATION) {
-      Type2 type = _overrideManager.getType(element2);
-      if (type != null) {
-        return recordType(node, type);
-      }
-    }
+    Type2 staticType = _dynamicType;
     if (element2 is MethodElement) {
-      FunctionType type2 = ((element2 as MethodElement)).type;
-      recordType(propertyName2, type2);
-      return recordType(node, type2);
+      staticType = ((element2 as MethodElement)).type;
     } else if (element2 is PropertyAccessorElement) {
-      Type2 propertyType = getType3((element2 as PropertyAccessorElement), node.target != null ? node.target.staticType : null);
-      recordType(propertyName2, propertyType);
-      return recordType(node, propertyType);
+      staticType = getType((element2 as PropertyAccessorElement), node.target != null ? getStaticType(node.target) : null);
     } else {
     }
-    recordType(propertyName2, _dynamicType);
-    return recordType(node, _dynamicType);
+    recordStaticType(propertyName2, staticType);
+    recordStaticType(node, staticType);
+    Type2 propagatedType = _overrideManager.getType(element2);
+    if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
+      recordPropagatedType(node, propagatedType);
+    }
+    return null;
   }
+  
   /**
    * The Dart Language Specification, 12.9: <blockquote>The static type of a rethrow expression is
    * bottom.</blockquote>
    */
-  Object visitRethrowExpression(RethrowExpression node) => recordType(node, _typeProvider.bottomType);
+  Object visitRethrowExpression(RethrowExpression node) {
+    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:
@@ -5261,85 +6789,154 @@
    */
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     Element element2 = node.element;
-    if (element2 == null) {
-      return recordType(node, _dynamicType);
-    }
-    if (USE_TYPE_PROPAGATION) {
-      Type2 type = _overrideManager.getType(element2);
-      if (type != null) {
-        return recordType(node, type);
-      }
-    }
-    Type2 type;
+    Type2 staticType = _dynamicType;
     if (element2 is ClassElement) {
       if (isNotTypeLiteral(node)) {
-        type = ((element2 as ClassElement)).type;
+        staticType = ((element2 as ClassElement)).type;
       } else {
-        type = _typeProvider.typeType;
+        staticType = _typeProvider.typeType;
       }
     } else if (element2 is FunctionTypeAliasElement) {
-      type = ((element2 as FunctionTypeAliasElement)).type;
+      staticType = ((element2 as FunctionTypeAliasElement)).type;
     } else if (element2 is MethodElement) {
-      type = ((element2 as MethodElement)).type;
+      staticType = ((element2 as MethodElement)).type;
     } else if (element2 is PropertyAccessorElement) {
-      type = getType3((element2 as PropertyAccessorElement), null);
+      staticType = getType((element2 as PropertyAccessorElement), null);
     } else if (element2 is ExecutableElement) {
-      type = ((element2 as ExecutableElement)).type;
+      staticType = ((element2 as ExecutableElement)).type;
     } else if (element2 is TypeVariableElement) {
-      type = ((element2 as TypeVariableElement)).type;
+      staticType = ((element2 as TypeVariableElement)).type;
     } else if (element2 is VariableElement) {
-      type = ((element2 as VariableElement)).type;
+      staticType = ((element2 as VariableElement)).type;
     } else if (element2 is PrefixElement) {
       return null;
     } else {
-      type = _dynamicType;
+      staticType = _dynamicType;
     }
-    return recordType(node, type);
+    recordStaticType(node, staticType);
+    Type2 propagatedType = _overrideManager.getType(element2);
+    if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
+      recordPropagatedType(node, propagatedType);
+    }
+    return null;
   }
+  
   /**
    * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is{@code String}.</blockquote>
    */
-  Object visitSimpleStringLiteral(SimpleStringLiteral node) => recordType(node, _typeProvider.stringType);
+  Object visitSimpleStringLiteral(SimpleStringLiteral node) {
+    recordStaticType(node, _typeProvider.stringType);
+    return null;
+  }
+  
   /**
    * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is{@code String}.</blockquote>
    */
-  Object visitStringInterpolation(StringInterpolation node) => recordType(node, _typeProvider.stringType);
+  Object visitStringInterpolation(StringInterpolation node) {
+    recordStaticType(node, _typeProvider.stringType);
+    return null;
+  }
   Object visitSuperExpression(SuperExpression node) {
     if (_thisType == null) {
-      return recordType(node, _dynamicType);
+      recordStaticType(node, _dynamicType);
     } else {
-      return recordType(node, _thisType.superclass);
+      recordStaticType(node, _thisType);
     }
+    return null;
   }
+  
   /**
    * The Dart Language Specification, 12.10: <blockquote>The static type of {@code this} is the
    * interface of the immediately enclosing class.</blockquote>
    */
   Object visitThisExpression(ThisExpression node) {
     if (_thisType == null) {
-      return recordType(node, _dynamicType);
+      recordStaticType(node, _dynamicType);
     } else {
-      return recordType(node, _thisType);
+      recordStaticType(node, _thisType);
     }
+    return null;
   }
+  
   /**
    * The Dart Language Specification, 12.8: <blockquote>The static type of a throw expression is
    * bottom.</blockquote>
    */
-  Object visitThrowExpression(ThrowExpression node) => recordType(node, _typeProvider.bottomType);
+  Object visitThrowExpression(ThrowExpression node) {
+    recordStaticType(node, _typeProvider.bottomType);
+    return null;
+  }
   Object visitVariableDeclaration(VariableDeclaration node) {
-    if (USE_TYPE_PROPAGATION) {
-      Expression initializer2 = node.initializer;
-      if (initializer2 != null) {
-        Type2 rightType = getType2(initializer2);
-        VariableElement element2 = node.name.element as VariableElement;
-        if (element2 != null) {
-          override(element2, getType(element2), rightType);
-        }
+    Expression initializer2 = node.initializer;
+    if (initializer2 != null) {
+      Type2 rightType = getBestType(initializer2);
+      VariableElement element2 = node.name.element as VariableElement;
+      if (element2 != null) {
+        _resolver.override(element2, rightType);
       }
     }
     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.
+   * @param element the element representing the method invoked by the given node
+   */
+  Type2 computeArgumentType(ExecutableElement element) {
+    if (element != null) {
+      List<ParameterElement> parameters2 = element.parameters;
+      if (parameters2 != null && parameters2.length == 2) {
+        return parameters2[1].type;
+      }
+    }
+    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
+   * @return the return type that was computed
+   */
+  Type2 computeReturnType(Element element) {
+    if (element is PropertyAccessorElement) {
+      FunctionType propertyType = ((element as PropertyAccessorElement)).type;
+      if (propertyType != null) {
+        Type2 returnType2 = propertyType.returnType;
+        if (returnType2 is InterfaceType) {
+          if (identical(returnType2, _typeProvider.functionType)) {
+            return _dynamicType;
+          }
+          MethodElement callMethod = ((returnType2 as InterfaceType)).lookUpMethod(ElementResolver.CALL_METHOD_NAME, _resolver.definingLibrary);
+          if (callMethod != null) {
+            return callMethod.type.returnType;
+          }
+        } else if (returnType2 is FunctionType) {
+          Type2 innerReturnType = ((returnType2 as FunctionType)).returnType;
+          if (innerReturnType != null) {
+            return innerReturnType;
+          }
+        } else if (returnType2.isDartCoreFunction()) {
+          return _dynamicType;
+        }
+        if (returnType2 != null) {
+          return returnType2;
+        }
+      }
+    } else if (element is ExecutableElement) {
+      FunctionType type2 = ((element as ExecutableElement)).type;
+      if (type2 != null) {
+        return type2.returnType;
+      }
+    } else if (element is VariableElement) {
+      Type2 variableType = ((element as VariableElement)).type;
+      if (variableType is FunctionType) {
+        return ((variableType as FunctionType)).returnType;
+      }
+    }
+    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
@@ -5347,13 +6944,14 @@
    * @param node the function expression whose return type is to be computed
    * @return the return type that was computed
    */
-  Type2 computeReturnType(FunctionDeclaration node) {
+  Type2 computeReturnType2(FunctionDeclaration node) {
     TypeName returnType2 = node.returnType;
     if (returnType2 == null) {
-      return computeReturnType2(node.functionExpression);
+      return _dynamicType;
     }
     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
@@ -5361,13 +6959,31 @@
    * @param node the function expression whose return type is to be computed
    * @return the return type that was computed
    */
-  Type2 computeReturnType2(FunctionExpression node) {
+  Type2 computeReturnType3(FunctionExpression node) {
     FunctionBody body2 = node.body;
     if (body2 is ExpressionFunctionBody) {
-      return getType2(((body2 as ExpressionFunctionBody)).expression);
+      return getStaticType(((body2 as ExpressionFunctionBody)).expression);
     }
     return _dynamicType;
   }
+  
+  /**
+   * Return the propagated type of the given expression if it is available, or the static type if
+   * there is no propagated type.
+   * @param expression the expression whose type is to be returned
+   * @return the propagated or static type of the given expression
+   */
+  Type2 getBestType(Expression expression) {
+    Type2 type = expression.propagatedType;
+    if (type == null) {
+      type = expression.staticType;
+      if (type == null) {
+        return _dynamicType;
+      }
+    }
+    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
@@ -5395,6 +7011,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.
@@ -5411,6 +7028,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
@@ -5420,6 +7038,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
@@ -5441,31 +7060,30 @@
     }
     return null;
   }
+  
   /**
-   * Return the type of the given (overridable) element.
-   * @param element the element whose type is to be returned
-   * @return the type of the given element
-   */
-  Type2 getType(Element element) {
-    if (element is LocalVariableElement) {
-      return ((element as LocalVariableElement)).type;
-    } else if (element is ParameterElement) {
-      return ((element as ParameterElement)).type;
-    }
-    return null;
-  }
-  /**
-   * Return the type of the given expression that is to be used for type analysis.
+   * Return the propagated type of the given expression.
    * @param expression the expression whose type is to be returned
-   * @return the type of the given expression
+   * @return the propagated type of the given expression
    */
-  Type2 getType2(Expression expression) {
+  Type2 getPropagatedType(Expression expression) {
+    Type2 type = expression.propagatedType;
+    return type;
+  }
+  
+  /**
+   * Return the static type of the given expression.
+   * @param expression the expression whose type is to be returned
+   * @return the static type of the given expression
+   */
+  Type2 getStaticType(Expression expression) {
     Type2 type = expression.staticType;
     if (type == null) {
       return _dynamicType;
     }
     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
@@ -5474,7 +7092,7 @@
    * specific type information
    * @return the type that should be recorded for a node that resolved to the given accessor
    */
-  Type2 getType3(PropertyAccessorElement accessor, Type2 context) {
+  Type2 getType(PropertyAccessorElement accessor, Type2 context) {
     FunctionType functionType = accessor.type;
     if (functionType == null) {
       return _dynamicType;
@@ -5508,24 +7126,27 @@
     }
     return returnType2;
   }
+  
   /**
    * Return the type represented by the given type name.
    * @param typeName the type name representing the type to be returned
    * @return the type represented by the type name
    */
-  Type2 getType4(TypeName typeName) {
+  Type2 getType2(TypeName typeName) {
     Type2 type2 = typeName.type;
     if (type2 == null) {
       return _dynamicType;
     }
     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
@@ -5535,91 +7156,57 @@
     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));
   }
+  
   /**
-   * If it is appropriate to do so, override the type of the given element. Use the static type and
-   * inferred type of the element to determine whether or not it is appropriate.
-   * @param element the element whose type might be overridden
-   * @param staticType the static type of the element
-   * @param inferredType the inferred type of the element
-   */
-  void override(VariableElement element, Type2 staticType, Type2 inferredType) {
-    if (identical(inferredType, BottomTypeImpl.instance)) {
-      return;
-    }
-    if (element is PropertyInducingElement) {
-      PropertyInducingElement variable = element as PropertyInducingElement;
-      if (!variable.isConst() && !variable.isFinal()) {
-        return;
-      }
-    }
-    if (staticType == null || (inferredType != null && inferredType.isMoreSpecificThan(staticType))) {
-      _overrideManager.setType(element, inferredType);
-    }
-  }
-  /**
-   * Record that the static type of the given node is the type of the second argument to the method
-   * represented by the given element.
+   * Record that the propagated type of the given node is the given type.
    * @param expression the node whose type is to be recorded
-   * @param element the element representing the method invoked by the given node
+   * @param type the propagated type of the node
    */
-  Object recordArgumentType(IndexExpression expression, MethodElement element) {
-    if (element != null) {
-      List<ParameterElement> parameters2 = element.parameters;
-      if (parameters2 != null && parameters2.length == 2) {
-        return recordType(expression, parameters2[1].type);
-      }
+  void recordPropagatedType(Expression expression, Type2 type) {
+    if (type != null && !type.isDynamic()) {
+      expression.propagatedType = type;
     }
-    return recordType(expression, _dynamicType);
   }
-  /**
-   * Record that the static type of the given node is the return type of the method or function
-   * represented by the given element.
-   * @param expression the node whose type is to be recorded
-   * @param element the element representing the method or function invoked by the given node
-   */
-  Object recordReturnType(Expression expression, Element element) {
-    if (element is PropertyAccessorElement) {
-      FunctionType propertyType = ((element as PropertyAccessorElement)).type;
-      if (propertyType != null) {
-        Type2 returnType2 = propertyType.returnType;
-        if (returnType2 is FunctionType) {
-          Type2 innerReturnType = ((returnType2 as FunctionType)).returnType;
-          if (innerReturnType != null) {
-            return recordType(expression, innerReturnType);
-          }
-        } else if (returnType2.isDartCoreFunction()) {
-          return recordType(expression, _dynamicType);
-        }
-        if (returnType2 != null) {
-          return recordType(expression, returnType2);
-        }
-      }
-    } else if (element is ExecutableElement) {
-      FunctionType type2 = ((element as ExecutableElement)).type;
-      if (type2 != null) {
-        return recordType(expression, type2.returnType);
-      }
-    } else if (element is VariableElement) {
-      Type2 variableType = ((element as VariableElement)).type;
-      if (variableType is FunctionType) {
-        return recordType(expression, ((variableType as FunctionType)).returnType);
-      }
-    }
-    return recordType(expression, _dynamicType);
-  }
+  
   /**
    * Record that the static type of the given node is the given type.
    * @param expression the node whose type is to be recorded
    * @param type the static type of the node
    */
-  Object recordType(Expression expression, Type2 type) {
+  void recordStaticType(Expression expression, Type2 type) {
     if (type == null) {
       expression.staticType = _dynamicType;
     } else {
       expression.staticType = type;
     }
-    return null;
   }
+  
+  /**
+   * Attempts to make a better guess for the static type of the given binary expression.
+   * @param node the binary expression to analyze
+   * @param staticType the static type of the expression as resolved
+   * @return the better type guess, or the same static type as given
+   */
+  Type2 refineBinaryExpressionType(BinaryExpression node, Type2 staticType) {
+    sc.TokenType operator2 = node.operator.type;
+    if (identical(operator2, sc.TokenType.AMPERSAND_AMPERSAND) || identical(operator2, sc.TokenType.BAR_BAR) || identical(operator2, sc.TokenType.EQ_EQ) || identical(operator2, sc.TokenType.BANG_EQ)) {
+      return _typeProvider.boolType;
+    }
+    if (identical(operator2, sc.TokenType.MINUS) || identical(operator2, sc.TokenType.PERCENT) || identical(operator2, sc.TokenType.PLUS) || identical(operator2, sc.TokenType.STAR)) {
+      Type2 doubleType2 = _typeProvider.doubleType;
+      if (identical(getStaticType(node.leftOperand), doubleType2) || identical(getStaticType(node.rightOperand), doubleType2)) {
+        return doubleType2;
+      }
+    }
+    if (identical(operator2, sc.TokenType.MINUS) || identical(operator2, sc.TokenType.PERCENT) || identical(operator2, sc.TokenType.PLUS) || identical(operator2, sc.TokenType.STAR) || identical(operator2, sc.TokenType.TILDE_SLASH)) {
+      Type2 intType2 = _typeProvider.intType;
+      if (identical(getStaticType(node.leftOperand), intType2) && identical(getStaticType(node.rightOperand), intType2)) {
+        staticType = intType2;
+      }
+    }
+    return staticType;
+  }
+  
   /**
    * Set the return type and parameter type information for the given function type based on the
    * given return type and parameter elements.
@@ -5653,26 +7240,61 @@
   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;
+  
   /**
-   * Initialize a newly created override manager to not be in any scope.
+   * Apply a set of overrides that were previously captured.
+   * @param overrides the overrides to be applied
    */
-  TypeOverrideManager() : super() {
+  void applyOverrides(Map<Element, Type2> overrides) {
+    if (_currentScope == null) {
+      throw new IllegalStateException("Cannot apply overrides without a scope");
+    }
+    _currentScope.applyOverrides(overrides);
   }
+  
+  /**
+   * 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() {
+    if (_currentScope == null) {
+      throw new IllegalStateException("Cannot capture local overrides without a scope");
+    }
+    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.
+   * @param variableList the list of variables whose overriding types are to be captured
+   * @return a table mapping elements to their overriding types
+   */
+  Map<Element, Type2> captureOverrides(VariableDeclarationList variableList) {
+    if (_currentScope == null) {
+      throw new IllegalStateException("Cannot capture overrides without a scope");
+    }
+    return _currentScope.captureOverrides(variableList);
+  }
+  
   /**
    * Enter a new override scope.
    */
   void enterScope() {
     _currentScope = new TypeOverrideManager_TypeOverrideScope(_currentScope);
   }
+  
   /**
    * Exit the current override scope.
    */
@@ -5682,6 +7304,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.
@@ -5694,6 +7317,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
@@ -5706,19 +7330,23 @@
     _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
@@ -5726,6 +7354,46 @@
   TypeOverrideManager_TypeOverrideScope(TypeOverrideManager_TypeOverrideScope outerScope) {
     this._outerScope = outerScope;
   }
+  
+  /**
+   * Apply a set of overrides that were previously captured.
+   * @param overrides the overrides to be applied
+   */
+  void applyOverrides(Map<Element, Type2> overrides) {
+    for (MapEntry<Element, Type2> entry in getMapEntrySet(overrides)) {
+      _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.
+   * @param variableList the list of variables whose overriding types are to be captured
+   * @return a table mapping elements to their overriding types
+   */
+  Map<Element, Type2> captureOverrides(VariableDeclarationList variableList) {
+    Map<Element, Type2> overrides = new Map<Element, Type2>();
+    if (variableList.isConst() || variableList.isFinal()) {
+      for (VariableDeclaration variable in variableList.variables) {
+        Element element2 = variable.element;
+        if (element2 != null) {
+          Type2 type = _overridenTypes[element2];
+          if (type != null) {
+            overrides[element2] = type;
+          }
+        }
+      }
+    }
+    return overrides;
+  }
+  
   /**
    * Return the overridden type of the given element, or {@code null} if the type of the element
    * has not been overridden.
@@ -5744,6 +7412,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
@@ -5753,136 +7422,165 @@
     _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).
@@ -5903,6 +7601,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.
@@ -5918,6 +7617,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
@@ -5939,6 +7639,7 @@
     _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,
@@ -5947,10 +7648,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
@@ -5958,11 +7666,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_274_impl(library, source, typeProvider);
+    _jtd_constructor_280_impl(library, source, typeProvider);
   }
-  _jtd_constructor_274_impl(Library library, Source source, TypeProvider typeProvider) {
+  _jtd_constructor_280_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
@@ -5973,9 +7682,9 @@
    * during resolution
    */
   TypeResolverVisitor.con2(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, AnalysisErrorListener errorListener) : super.con2(definingLibrary, source, typeProvider, errorListener) {
-    _jtd_constructor_275_impl(definingLibrary, source, typeProvider, errorListener);
+    _jtd_constructor_281_impl(definingLibrary, source, typeProvider, errorListener);
   }
-  _jtd_constructor_275_impl(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, AnalysisErrorListener errorListener) {
+  _jtd_constructor_281_impl(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, AnalysisErrorListener errorListener) {
     _dynamicType = typeProvider.dynamicType;
   }
   Object visitCatchClause(CatchClause node) {
@@ -5987,7 +7696,7 @@
       if (exceptionTypeName == null) {
         exceptionType = typeProvider.objectType;
       } else {
-        exceptionType = getType5(exceptionTypeName);
+        exceptionType = getType3(exceptionTypeName);
       }
       recordType(exception, exceptionType);
       Element element2 = exception.element;
@@ -6003,12 +7712,14 @@
     return null;
   }
   Object visitClassDeclaration(ClassDeclaration node) {
+    _hasReferenceToSuper = false;
     super.visitClassDeclaration(node);
     ClassElementImpl classElement = getClassElement(node.name);
     InterfaceType superclassType = null;
     ExtendsClause extendsClause2 = node.extendsClause;
     if (extendsClause2 != null) {
-      superclassType = resolveType(extendsClause2.superclass, CompileTimeErrorCode.EXTENDS_NON_CLASS);
+      ErrorCode errorCode = node.withClause == null ? CompileTimeErrorCode.EXTENDS_NON_CLASS : CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS;
+      superclassType = resolveType(extendsClause2.superclass, errorCode);
       if (superclassType != typeProvider.objectType) {
         classElement.validMixin = false;
       }
@@ -6021,6 +7732,7 @@
         }
       }
       classElement.supertype = superclassType;
+      classElement.hasReferenceToSuper2 = _hasReferenceToSuper;
     }
     resolve(classElement, node.withClause, node.implementsClause);
     return null;
@@ -6028,7 +7740,7 @@
   Object visitClassTypeAlias(ClassTypeAlias node) {
     super.visitClassTypeAlias(node);
     ClassElementImpl classElement = getClassElement(node.name);
-    InterfaceType superclassType = resolveType(node.superclass, CompileTimeErrorCode.EXTENDS_NON_CLASS);
+    InterfaceType superclassType = resolveType(node.superclass, CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS);
     if (superclassType == null) {
       superclassType = typeProvider.objectType;
     }
@@ -6054,7 +7766,7 @@
     if (typeName == null) {
       declaredType = _dynamicType;
     } else {
-      declaredType = getType5(typeName);
+      declaredType = getType3(typeName);
     }
     LocalVariableElementImpl element2 = node.element as LocalVariableElementImpl;
     element2.type = declaredType;
@@ -6074,7 +7786,7 @@
       if (typeName == null) {
         type = _dynamicType;
       } else {
-        type = getType5(typeName);
+        type = getType3(typeName);
       }
       parameter.type = type;
     } else {
@@ -6099,8 +7811,10 @@
   Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     super.visitFunctionTypedFormalParameter(node);
     ParameterElementImpl element2 = node.identifier.element as ParameterElementImpl;
-    FunctionTypeImpl type = new FunctionTypeImpl.con1((null as ExecutableElement));
-    setTypeInformation(type, node.returnType, getElements(node.parameters));
+    AnonymousFunctionTypeImpl type = new AnonymousFunctionTypeImpl();
+    List<ParameterElement> parameters2 = getElements(node.parameters);
+    setTypeInformation(type, node.returnType, parameters2);
+    type.baseParameters = parameters2;
     element2.type = type;
     return null;
   }
@@ -6131,7 +7845,7 @@
     if (typeName == null) {
       declaredType = _dynamicType;
     } else {
-      declaredType = getType5(typeName);
+      declaredType = getType3(typeName);
     }
     Element element2 = node.identifier.element;
     if (element2 is ParameterElement) {
@@ -6140,6 +7854,10 @@
     }
     return null;
   }
+  Object visitSuperExpression(SuperExpression node) {
+    _hasReferenceToSuper = true;
+    return super.visitSuperExpression(node);
+  }
   Object visitTypeName(TypeName node) {
     super.visitTypeName(node);
     Identifier typeName = node.name;
@@ -6179,18 +7897,36 @@
         }
       }
     }
-    if (element == null) {
-      Identifier simpleIdentifier;
-      if (typeName is SimpleIdentifier) {
-        simpleIdentifier = typeName;
+    bool elementValid = element is! MultiplyDefinedElement;
+    if (elementValid && element is! ClassElement && isTypeNameInInstanceCreationExpression(node)) {
+      SimpleIdentifier typeNameSimple = getTypeSimpleIdentifier(typeName);
+      InstanceCreationExpression creation = node.parent.parent as InstanceCreationExpression;
+      if (creation.isConst()) {
+        if (element == null) {
+          reportError(CompileTimeErrorCode.UNDEFINED_CLASS, typeNameSimple, [typeName]);
+        } else {
+          reportError(CompileTimeErrorCode.CONST_WITH_NON_TYPE, typeNameSimple, [typeName]);
+        }
+        elementValid = false;
       } else {
-        simpleIdentifier = ((typeName as PrefixedIdentifier)).prefix;
+        if (element != null) {
+          reportError(StaticWarningCode.NEW_WITH_NON_TYPE, typeNameSimple, [typeName]);
+          elementValid = false;
+        }
       }
-      if (simpleIdentifier.name == "boolean") {
-        reportError(StaticWarningCode.UNDEFINED_CLASS_BOOLEAN, simpleIdentifier, []);
+    }
+    if (elementValid && element == null) {
+      SimpleIdentifier typeNameSimple = getTypeSimpleIdentifier(typeName);
+      if (typeNameSimple.name == "boolean") {
+        reportError(StaticWarningCode.UNDEFINED_CLASS_BOOLEAN, typeNameSimple, []);
+      } else if (isTypeNameInCatchClause(node)) {
+        reportError(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, node, [node]);
       } else {
-        reportError(StaticWarningCode.UNDEFINED_CLASS, simpleIdentifier, [simpleIdentifier.name]);
+        reportError(StaticWarningCode.UNDEFINED_CLASS, typeNameSimple, [typeNameSimple.name]);
       }
+      elementValid = false;
+    }
+    if (!elementValid) {
       setElement(typeName, _dynamicType.element);
       typeName.staticType = _dynamicType;
       node.type = _dynamicType;
@@ -6215,6 +7951,9 @@
         node.type = type;
       }
     } else {
+      if (isTypeNameInCatchClause(node)) {
+        reportError(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, node, [node]);
+      }
       setElement(typeName, _dynamicType.element);
       typeName.staticType = _dynamicType;
       node.type = _dynamicType;
@@ -6228,7 +7967,7 @@
       int count = Math.min(argumentCount, parameterCount);
       List<Type2> typeArguments = new List<Type2>();
       for (int i = 0; i < count; i++) {
-        Type2 argumentType = getType5(arguments2[i]);
+        Type2 argumentType = getType3(arguments2[i]);
         if (argumentType != null) {
           typeArguments.add(argumentType);
         }
@@ -6273,7 +8012,7 @@
     if (typeName == null) {
       declaredType = _dynamicType;
     } else {
-      declaredType = getType5(typeName);
+      declaredType = getType3(typeName);
     }
     Element element2 = node.name.element;
     if (element2 is VariableElement) {
@@ -6296,6 +8035,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
@@ -6311,6 +8051,7 @@
     }
     return element2 as ClassElementImpl;
   }
+  
   /**
    * Return an array containing all of the elements associated with the parameters in the given
    * list.
@@ -6327,6 +8068,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
@@ -6349,6 +8091,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.
@@ -6367,18 +8110,20 @@
     }
     return type;
   }
+  
   /**
    * Return the type represented by the given type name.
    * @param typeName the type name representing the type to be returned
    * @return the type represented by the type name
    */
-  Type2 getType5(TypeName typeName) {
+  Type2 getType3(TypeName typeName) {
     Type2 type2 = typeName.type;
     if (type2 == null) {
       return _dynamicType;
     }
     return type2;
   }
+  
   /**
    * Return the type arguments associated with the given type.
    * @param type the type whole type arguments are to be returned
@@ -6392,6 +8137,49 @@
     }
     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
+   * @return the simple identifier of the given (may be qualified) type name.
+   */
+  SimpleIdentifier getTypeSimpleIdentifier(Identifier typeName) {
+    if (typeName is SimpleIdentifier) {
+      return typeName as SimpleIdentifier;
+    } else {
+      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
+   * @return {@code true} if the given type name is used as the exception type in the catch clause.
+   */
+  bool isTypeNameInCatchClause(TypeName typeName) {
+    ASTNode parent2 = typeName.parent;
+    if (parent2 is CatchClause) {
+      CatchClause catchClause = parent2 as CatchClause;
+      return identical(catchClause.exceptionType, typeName);
+    }
+    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
+   * @return {@code true} if the given type name is used as the type in the instance creation
+   * expression
+   */
+  bool isTypeNameInInstanceCreationExpression(TypeName typeName) {
+    ASTNode parent2 = typeName.parent;
+    if (parent2 is ConstructorName && parent2.parent is InstanceCreationExpression) {
+      ConstructorName constructorName = parent2 as ConstructorName;
+      return constructorName != null && identical(constructorName.type, typeName);
+    }
+    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
@@ -6405,6 +8193,7 @@
     }
     return null;
   }
+  
   /**
    * Resolve the types in the given with and implements clauses and associate those types with the
    * given class element.
@@ -6434,20 +8223,15 @@
         String name3 = typeName.name.name;
         if (name3 == dynamicKeyword) {
           reportError(CompileTimeErrorCode.IMPLEMENTS_DYNAMIC, typeName, []);
-        } else {
-          Element element3 = typeName.name.element;
-          if (element3 != null && element3 == classElement) {
-            reportError(CompileTimeErrorCode.IMPLEMENTS_SELF, typeName, [name3]);
-          }
         }
         if (!detectedRepeatOnIndex[i]) {
           for (int j = i + 1; j < typeNames.length; j++) {
-            Element element4 = typeName.name.element;
+            Element element3 = typeName.name.element;
             TypeName typeName2 = typeNames[j];
             Identifier identifier2 = typeName2.name;
             String name2 = identifier2.name;
             Element element2 = identifier2.element;
-            if (element4 != null && element4 == element2) {
+            if (element3 != null && element3 == element2) {
               detectedRepeatOnIndex[j] = true;
               reportError(CompileTimeErrorCode.IMPLEMENTS_REPEATED, typeName2, [name2]);
             }
@@ -6459,6 +8243,7 @@
       }
     }
   }
+  
   /**
    * Return the type specified by the given name.
    * @param typeName the type name specifying the type to be returned
@@ -6477,6 +8262,7 @@
     }
     return null;
   }
+  
   /**
    * Resolve the types in the given list of type names.
    * @param typeNames the type names to be resolved
@@ -6509,6 +8295,7 @@
       }
     }
   }
+  
   /**
    * Set the return type and parameter type information for the given function type based on the
    * given return type and parameter elements.
@@ -6548,11 +8335,13 @@
     }
   }
 }
+
 /**
  * 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
@@ -6562,6 +8351,17 @@
     defineTypeParameters(typeElement);
     defineMembers(typeElement);
   }
+  AnalysisError getErrorForDuplicate(Element existing, Element duplicate) {
+    if (existing is PropertyAccessorElement && duplicate is MethodElement) {
+      if (existing.nameOffset < duplicate.nameOffset) {
+        return new AnalysisError.con2(duplicate.source, duplicate.nameOffset, duplicate.displayName.length, CompileTimeErrorCode.METHOD_AND_GETTER_WITH_SAME_NAME, [existing.displayName]);
+      } else {
+        return new AnalysisError.con2(existing.source, existing.nameOffset, existing.displayName.length, CompileTimeErrorCode.GETTER_AND_METHOD_WITH_SAME_NAME, [existing.displayName]);
+      }
+    }
+    return super.getErrorForDuplicate(existing, duplicate);
+  }
+  
   /**
    * Define the instance members defined by the class.
    * @param typeElement the element representing the type represented by this scope
@@ -6574,6 +8374,7 @@
       define(method);
     }
   }
+  
   /**
    * Define the type parameters for the class.
    * @param typeElement the element representing the type represented by this scope
@@ -6585,16 +8386,19 @@
     }
   }
 }
+
 /**
  * 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
@@ -6604,24 +8408,27 @@
   }
   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
    */
   Scope get enclosingScope => _enclosingScope;
-  Element lookup3(String name, LibraryElement referencingLibrary) {
+  Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) {
     Element element = localLookup(name, referencingLibrary);
     if (element != null) {
       return element;
     }
-    return _enclosingScope.lookup3(name, referencingLibrary);
+    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
@@ -6630,6 +8437,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
@@ -6649,12 +8457,14 @@
     }
   }
 }
+
 /**
  * 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
@@ -6664,6 +8474,7 @@
     defineTypeVariables(typeElement);
     defineParameters(typeElement);
   }
+  
   /**
    * Define the parameters for the function type alias.
    * @param typeElement the element representing the type represented by this scope
@@ -6673,6 +8484,7 @@
       define(parameter);
     }
   }
+  
   /**
    * Define the type variables for the function type alias.
    * @param typeElement the element representing the type represented by this scope
@@ -6684,31 +8496,38 @@
     }
   }
 }
+
 /**
  * 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
@@ -6716,11 +8535,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_280_impl(outerScope, onSwitchStatement, onSwitchMember);
+    _jtd_constructor_286_impl(outerScope, onSwitchStatement, onSwitchMember);
   }
-  _jtd_constructor_280_impl(LabelScope outerScope, bool onSwitchStatement, bool onSwitchMember) {
-    _jtd_constructor_281_impl(outerScope, EMPTY_LABEL, new LabelElementImpl(_EMPTY_LABEL_IDENTIFIER, 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));
   }
+  
   /**
    * Initialize a newly created scope to represent the given label.
    * @param outerScope the label scope enclosing the new label scope
@@ -6728,13 +8548,14 @@
    * @param element the element to which the label resolves
    */
   LabelScope.con2(LabelScope outerScope2, String label2, LabelElement element2) {
-    _jtd_constructor_281_impl(outerScope2, label2, element2);
+    _jtd_constructor_287_impl(outerScope2, label2, element2);
   }
-  _jtd_constructor_281_impl(LabelScope outerScope2, String label2, LabelElement element2) {
+  _jtd_constructor_287_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.
@@ -6742,6 +8563,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.
@@ -6758,25 +8580,75 @@
     }
   }
 }
+
 /**
  * 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.
+   */
+  static bool isTypeAnnotation(Identifier identifier) {
+    ASTNode parent4 = identifier.parent;
+    if (parent4 is TypeName) {
+      ASTNode parent2 = parent4.parent;
+      if (parent2 is FunctionDeclaration) {
+        FunctionDeclaration decl = parent2 as FunctionDeclaration;
+        return identical(decl.returnType, parent4);
+      }
+      if (parent2 is FunctionTypeAlias) {
+        FunctionTypeAlias decl = parent2 as FunctionTypeAlias;
+        return identical(decl.returnType, parent4);
+      }
+      if (parent2 is MethodDeclaration) {
+        MethodDeclaration decl = parent2 as MethodDeclaration;
+        return identical(decl.returnType, parent4);
+      }
+      if (parent2 is VariableDeclarationList) {
+        VariableDeclarationList decl = parent2 as VariableDeclarationList;
+        return identical(decl.type, parent4);
+      }
+      if (parent2 is SimpleFormalParameter) {
+        SimpleFormalParameter decl = parent2 as SimpleFormalParameter;
+        return identical(decl.type, parent4);
+      }
+      if (parent2 is TypeParameter) {
+        TypeParameter decl = parent2 as TypeParameter;
+        return identical(decl.bound, parent4);
+      }
+      if (parent2 is TypeArgumentList) {
+        ASTNode parent3 = parent2.parent;
+        if (parent3 is TypeName) {
+          TypeName typeName = parent3 as TypeName;
+          if (identical((typeName).typeArguments, parent2)) {
+            return isTypeAnnotation(typeName.name);
+          }
+        }
+      }
+      return false;
+    }
+    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
@@ -6789,13 +8661,13 @@
     createImportedNamespaces(definingLibrary);
   }
   void define(Element element) {
-    if (!Scope.isPrivateName(element.name)) {
+    if (!Scope.isPrivateName(element.displayName)) {
       super.define(element);
     }
   }
   LibraryElement get definingLibrary => _definingLibrary;
   AnalysisErrorListener get errorListener => _errorListener;
-  Element lookup3(String name, LibraryElement referencingLibrary) {
+  Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) {
     Element foundElement = localLookup(name, referencingLibrary);
     if (foundElement != null) {
       return foundElement;
@@ -6811,12 +8683,27 @@
       }
     }
     if (foundElement is MultiplyDefinedElementImpl) {
+      String foundEltName = foundElement.displayName;
+      String libName1 = "", libName2 = "";
+      List<Element> conflictingMembers = ((foundElement as MultiplyDefinedElementImpl)).conflictingElements;
+      LibraryElement enclosingLibrary = conflictingMembers[0].getAncestor(LibraryElement);
+      if (enclosingLibrary != null) {
+        libName1 = enclosingLibrary.definingCompilationUnit.displayName;
+      }
+      enclosingLibrary = conflictingMembers[1].getAncestor(LibraryElement);
+      if (enclosingLibrary != null) {
+        libName2 = enclosingLibrary.definingCompilationUnit.displayName;
+      }
+      ErrorCode errorCode = isTypeAnnotation(identifier) ? StaticWarningCode.AMBIGUOUS_IMPORT : CompileTimeErrorCode.AMBIGUOUS_IMPORT;
+      _errorListener.onError(new AnalysisError.con2(source, identifier.offset, identifier.length, errorCode, [foundEltName, libName1, libName2]));
+      return foundElement;
     }
     if (foundElement != null) {
-      defineWithoutChecking(foundElement);
+      defineWithoutChecking2(name, foundElement);
     }
     return foundElement;
   }
+  
   /**
    * Create all of the namespaces associated with the libraries imported into this library. The
    * names are not added to this scope, but are stored for later reference.
@@ -6830,12 +8717,14 @@
     }
   }
 }
+
 /**
  * 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
@@ -6844,6 +8733,20 @@
   LibraryScope(LibraryElement definingLibrary, AnalysisErrorListener errorListener) : super(new LibraryImportScope(definingLibrary, errorListener)) {
     defineTopLevelNames(definingLibrary);
   }
+  AnalysisError getErrorForDuplicate(Element existing, Element duplicate) {
+    if (existing is PrefixElement) {
+      int offset = duplicate.nameOffset;
+      if (duplicate is PropertyAccessorElement) {
+        PropertyAccessorElement accessor = duplicate as PropertyAccessorElement;
+        if (accessor.isSynthetic()) {
+          offset = accessor.variable.nameOffset;
+        }
+      }
+      return new AnalysisError.con2(source, offset, duplicate.displayName.length, CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER, [existing.displayName]);
+    }
+    return super.getErrorForDuplicate(existing, duplicate);
+  }
+  
   /**
    * Add to this scope all of the public top-level names that are defined in the given compilation
    * unit.
@@ -6864,6 +8767,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
@@ -6879,21 +8783,25 @@
     }
   }
 }
+
 /**
  * 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
@@ -6902,6 +8810,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.
@@ -6909,29 +8818,43 @@
    * @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 {
+  
   /**
-   * Initialize a newly created namespace builder.
+   * Create a namespace representing the export namespace of the given {@link ExportElement}.
+   * @param element the export element whose export namespace is to be created
+   * @return the export namespace that was created
    */
-  NamespaceBuilder() : super() {
+  Namespace createExportNamespace(ExportElement element) {
+    LibraryElement exportedLibrary2 = element.exportedLibrary;
+    if (exportedLibrary2 == null) {
+      return Namespace.EMPTY;
+    }
+    Map<String, Element> definedNames = createExportMapping(exportedLibrary2, new Set<LibraryElement>());
+    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 createExportNamespace(LibraryElement library) => new Namespace(createExportMapping(library, new Set<LibraryElement>()));
+  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
@@ -6947,6 +8870,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
@@ -6960,6 +8884,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
@@ -6970,6 +8895,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
@@ -6980,6 +8906,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
@@ -6991,6 +8918,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.
@@ -7011,10 +8939,8 @@
     for (ClassElement element in compilationUnit.types) {
       addIfPublic(definedNames, element);
     }
-    for (VariableElement element in compilationUnit.topLevelVariables) {
-      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
@@ -7032,6 +8958,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
@@ -7049,6 +8976,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
@@ -7075,6 +9003,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
@@ -7085,6 +9014,7 @@
       definedNames.remove(name);
     }
   }
+  
   /**
    * Show only the given names by removing all other names from the given collection of defined
    * names.
@@ -7102,42 +9032,44 @@
     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>();
-  /**
-   * Initialize a newly created scope to be empty.
-   */
-  Scope() : super() {
-  }
+  
   /**
    * 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
@@ -7155,6 +9087,7 @@
       }
     }
   }
+  
   /**
    * Return the element with which the given identifier is associated, or {@code null} if the name
    * is not defined within this scope.
@@ -7163,7 +9096,8 @@
    * implement library-level privacy
    * @return the element with which the given identifier is associated
    */
-  Element lookup(Identifier identifier, LibraryElement referencingLibrary) => lookup3(identifier.name, referencingLibrary);
+  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
@@ -7171,11 +9105,22 @@
   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
+   * @param element the element to be added to this scope
+   */
+  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.
@@ -7188,19 +9133,22 @@
     if (source2 == null) {
       source2 = source;
     }
-    return new AnalysisError.con2(source2, duplicate.nameOffset, duplicate.name.length, CompileTimeErrorCode.DUPLICATE_DEFINITION, [existing.name]);
+    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
@@ -7211,15 +9159,19 @@
    * @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.
+   * @param identifier the identifier node to lookup element for, used to report correct kind of a
+   * problem and associate problem with
    * @param name the name associated with the element to be returned
    * @param referencingLibrary the library that contains the reference to the name, used to
    * implement library-level privacy
    * @return the element with which the given name is associated
    */
-  Element lookup3(String name, LibraryElement referencingLibrary);
+  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
@@ -7231,15 +9183,11 @@
       if (method.name == "-" && method.parameters.length == 0) {
         return UNARY_MINUS;
       }
-    } else if (element is PropertyAccessorElement) {
-      PropertyAccessorElement accessor = element as PropertyAccessorElement;
-      if (accessor.isSetter()) {
-        return "${accessor.name}${SETTER_SUFFIX}";
-      }
     }
     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
@@ -7247,22 +9195,58 @@
  * @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
    */
-  ConstantVerifier(ErrorReporter errorReporter) {
+  ConstantVerifier(ErrorReporter errorReporter, TypeProvider typeProvider) {
     this._errorReporter = errorReporter;
+    this._boolType = typeProvider.boolType;
+    this._intType = typeProvider.intType;
+    this._numType = typeProvider.numType;
+    this._stringType = typeProvider.stringType;
+  }
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    if (node.constKeyword != null) {
+      validateInitializers(node);
+    }
+    return super.visitConstructorDeclaration(node);
   }
   Object visitFunctionExpression(FunctionExpression node) {
     super.visitFunctionExpression(node);
     validateDefaultValues(node.parameters);
     return null;
   }
+  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+    validateConstantArguments(node);
+    return super.visitInstanceCreationExpression(node);
+  }
   Object visitListLiteral(ListLiteral node) {
     super.visitListLiteral(node);
     if (node.modifier != null) {
@@ -7275,20 +9259,39 @@
   Object visitMapLiteral(MapLiteral node) {
     super.visitMapLiteral(node);
     bool isConst = node.modifier != null;
-    Set<String> keys = new Set<String>();
+    bool reportEqualKeys = true;
+    Set<Object> keys = new Set<Object>();
+    List<Expression> invalidKeys = new List<Expression>();
     for (MapLiteralEntry entry in node.entries) {
-      StringLiteral key2 = entry.key;
-      EvaluationResultImpl result = validate(key2, CompileTimeErrorCode.NON_CONSTANT_MAP_KEY);
-      if (result is ValidResult && ((result as ValidResult)).value is String) {
-        String value2 = ((result as ValidResult)).value as String;
-        if (keys.contains(value2)) {
-          _errorReporter.reportError(StaticWarningCode.EQUAL_KEYS_IN_MAP, key2, []);
+      Expression key2 = entry.key;
+      if (isConst) {
+        EvaluationResultImpl result = validate(key2, CompileTimeErrorCode.NON_CONSTANT_MAP_KEY);
+        validate(entry.value, CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE);
+        if (result is ValidResult) {
+          Object value2 = ((result as ValidResult)).value;
+          if (keys.contains(value2)) {
+            invalidKeys.add(key2);
+          } else {
+            javaSetAdd(keys, value2);
+          }
+        }
+      } else {
+        EvaluationResultImpl result = key2.accept(new ConstantVisitor());
+        if (result is ValidResult) {
+          Object value3 = ((result as ValidResult)).value;
+          if (keys.contains(value3)) {
+            invalidKeys.add(key2);
+          } else {
+            javaSetAdd(keys, value3);
+          }
         } else {
-          javaSetAdd(keys, value2);
+          reportEqualKeys = false;
         }
       }
-      if (isConst) {
-        validate(entry.value, CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE);
+    }
+    if (reportEqualKeys) {
+      for (Expression key in invalidKeys) {
+        _errorReporter.reportError2(StaticWarningCode.EQUAL_KEYS_IN_MAP, key, []);
       }
     }
     return null;
@@ -7318,19 +9321,35 @@
     }
     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,
+   * boolean, list, map, or null.
+   * @param value
+   * @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.
    * @param result the result containing any errors that need to be reported
    * @param errorCode the error code to be used if the result represents an error
    */
-  void reportErrors(EvaluationResultImpl result, ErrorCode errorCode) {
+  void reportErrors(EvaluationResultImpl result, ErrorCode errorCode2) {
     if (result is ErrorResult) {
       for (ErrorResult_ErrorData data in ((result as ErrorResult)).errorData) {
-        _errorReporter.reportError(errorCode, data.node, []);
+        ErrorCode dataErrorCode = data.errorCode;
+        if (identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_INT) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM)) {
+          _errorReporter.reportError2(dataErrorCode, data.node, []);
+        } else {
+          _errorReporter.reportError2(errorCode2, data.node, []);
+        }
       }
     }
   }
+  
   /**
    * 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.
@@ -7343,6 +9362,28 @@
     reportErrors(result, errorCode);
     return result;
   }
+  
+  /**
+   * Validate that if the passed instance creation is 'const' then all its arguments are constant
+   * expressions.
+   * @param node the instance creation evaluate
+   */
+  void validateConstantArguments(InstanceCreationExpression node) {
+    if (!node.isConst()) {
+      return;
+    }
+    ArgumentList argumentList2 = node.argumentList;
+    if (argumentList2 == null) {
+      return;
+    }
+    for (Expression argument in argumentList2.arguments) {
+      if (argument is NamedExpression) {
+        argument = ((argument as NamedExpression)).expression;
+      }
+      validate(argument, CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT);
+    }
+  }
+  
   /**
    * Validate that the default value associated with each of the parameters in the given list is a
    * compile time constant.
@@ -7366,53 +9407,169 @@
       }
     }
   }
+  
+  /**
+   * Validates that the given expression is a compile time constant.
+   * @param parameterElements the elements of parameters of constant constructor, they are
+   * considered as a valid potentially constant expressions
+   * @param expression the expression to validate
+   */
+  void validateInitializerExpression(List<ParameterElement> parameterElements, Expression expression) {
+    EvaluationResultImpl result = expression.accept(new ConstantVisitor_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
+   * considered as a valid potentially constant expressions
+   * @param argumentList the argument list to validate
+   */
+  void validateInitializerInvocationArguments(List<ParameterElement> parameterElements, ArgumentList argumentList) {
+    if (argumentList == null) {
+      return;
+    }
+    for (Expression argument in argumentList.arguments) {
+      validateInitializerExpression(parameterElements, argument);
+    }
+  }
+  
+  /**
+   * Validates that the expressions of the given initializers (of a constant constructor) are all
+   * compile time constants.
+   * @param constructor the constant constructor declaration to validate
+   */
+  void validateInitializers(ConstructorDeclaration constructor) {
+    List<ParameterElement> parameterElements = constructor.parameters.elements;
+    NodeList<ConstructorInitializer> initializers2 = constructor.initializers;
+    for (ConstructorInitializer initializer in initializers2) {
+      if (initializer is ConstructorFieldInitializer) {
+        ConstructorFieldInitializer fieldInitializer = initializer as ConstructorFieldInitializer;
+        validateInitializerExpression(parameterElements, fieldInitializer.expression);
+      }
+      if (initializer is RedirectingConstructorInvocation) {
+        RedirectingConstructorInvocation invocation = initializer as RedirectingConstructorInvocation;
+        validateInitializerInvocationArguments(parameterElements, invocation.argumentList);
+      }
+      if (initializer is SuperConstructorInvocation) {
+        SuperConstructorInvocation invocation = initializer as SuperConstructorInvocation;
+        validateInitializerInvocationArguments(parameterElements, invocation.argumentList);
+      }
+    }
+  }
 }
+class ConstantVisitor_10 extends ConstantVisitor {
+  final ConstantVerifier ConstantVerifier_this;
+  List<ParameterElement> parameterElements;
+  ConstantVisitor_10(this.ConstantVerifier_this, this.parameterElements) : super();
+  EvaluationResultImpl visitSimpleIdentifier(SimpleIdentifier node) {
+    Element element2 = node.element;
+    for (ParameterElement parameterElement in parameterElements) {
+      if (identical(parameterElement, element2) && parameterElement != null) {
+        Type2 type2 = parameterElement.type;
+        if (type2 != null) {
+          if (type2.isDynamic()) {
+            return ValidResult.RESULT_DYNAMIC;
+          }
+          if (type2.isSubtypeOf(ConstantVerifier_this._boolType)) {
+            return ValidResult.RESULT_BOOL;
+          }
+          if (type2.isSubtypeOf(ConstantVerifier_this._intType)) {
+            return ValidResult.RESULT_INT;
+          }
+          if (type2.isSubtypeOf(ConstantVerifier_this._numType)) {
+            return ValidResult.RESULT_NUM;
+          }
+          if (type2.isSubtypeOf(ConstantVerifier_this._stringType)) {
+            return ValidResult.RESULT_STRING;
+          }
+        }
+        return ValidResult.RESULT_OBJECT;
+      }
+    }
+    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
+   * @return {@code true} if the given expression is the reference to the type
+   */
+  static bool isTypeReference(Expression expr) {
+    if (expr is Identifier) {
+      Identifier identifier = expr as Identifier;
+      return identifier.element is ClassElement;
+    }
+    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;
+  
   /**
    * 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}.
@@ -7425,15 +9582,37 @@
    * @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.
    */
   List<InterfaceType> _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT;
-  ErrorVerifier(ErrorReporter errorReporter, LibraryElement currentLibrary, TypeProvider typeProvider) {
+  ErrorVerifier(ErrorReporter errorReporter, LibraryElement currentLibrary, TypeProvider typeProvider, InheritanceManager inheritanceManager) {
     this._errorReporter = errorReporter;
     this._currentLibrary = currentLibrary;
     this._isInSystemLibrary = currentLibrary.source.isInSystemLibrary();
     this._typeProvider = typeProvider;
+    this._inheritanceManager = inheritanceManager;
     _isEnclosingConstructorConst = false;
     _isInCatchClause = false;
     _dynamicType = typeProvider.dynamicType;
@@ -7443,14 +9622,29 @@
     checkForArgumentDefinitionTestNonParameter(node);
     return super.visitArgumentDefinitionTest(node);
   }
+  Object visitArgumentList(ArgumentList node) {
+    checkForArgumentTypeNotAssignable(node);
+    return super.visitArgumentList(node);
+  }
   Object visitAssertStatement(AssertStatement node) {
     checkForNonBoolExpression(node);
     return super.visitAssertStatement(node);
   }
   Object visitAssignmentExpression(AssignmentExpression node) {
-    checkForInvalidAssignment(node);
+    sc.Token operator2 = node.operator;
+    sc.TokenType operatorType = operator2.type;
+    if (identical(operatorType, sc.TokenType.EQ)) {
+      checkForInvalidAssignment2(node.leftHandSide, node.rightHandSide);
+    } else {
+      checkForInvalidAssignment(node);
+    }
+    checkForAssignmentToFinal(node);
     return super.visitAssignmentExpression(node);
   }
+  Object visitBinaryExpression(BinaryExpression node) {
+    checkForArgumentTypeNotAssignable2(node.rightOperand);
+    return super.visitBinaryExpression(node);
+  }
   Object visitCatchClause(CatchClause node) {
     bool previousIsInCatchClause = _isInCatchClause;
     try {
@@ -7464,7 +9658,19 @@
     ClassElement outerClass = _enclosingClass;
     try {
       _enclosingClass = node.element;
+      WithClause withClause2 = node.withClause;
+      ImplementsClause implementsClause2 = node.implementsClause;
+      ExtendsClause extendsClause2 = node.extendsClause;
       checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME);
+      checkForMemberWithClassName();
+      checkForAllMixinErrorCodes(withClause2);
+      if (implementsClause2 != null || extendsClause2 != null) {
+        if (!checkForImplementsDisallowedClass(implementsClause2) && !checkForExtendsDisallowedClass(extendsClause2)) {
+          checkForNonAbstractClassInheritsAbstractMember(node);
+          checkForInconsistentMethodInheritance();
+          checkForRecursiveInterfaceInheritance(_enclosingClass, new List<ClassElement>());
+        }
+      }
       ClassElement classElement = node.element;
       if (classElement != null) {
         List<FieldElement> fieldElements = classElement.fields;
@@ -7484,6 +9690,14 @@
   }
   Object visitClassTypeAlias(ClassTypeAlias node) {
     checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
+    checkForAllMixinErrorCodes(node.withClause);
+    ClassElement outerClassElement = _enclosingClass;
+    try {
+      _enclosingClass = node.element;
+      checkForRecursiveInterfaceInheritance(node.element, new List<ClassElement>());
+    } finally {
+      _enclosingClass = outerClassElement;
+    }
     return super.visitClassTypeAlias(node);
   }
   Object visitConditionalExpression(ConditionalExpression node) {
@@ -7498,12 +9712,28 @@
       checkForConstConstructorWithNonFinalField(node);
       checkForConflictingConstructorNameAndMember(node);
       checkForAllFinalInitializedErrorCodes(node);
+      checkForRedirectingConstructorErrorCodes(node);
+      checkForMultipleSuperInitializers(node);
+      checkForRecursiveConstructorRedirect(node);
+      checkForRecursiveFactoryRedirect(node);
+      checkForRedirectToInvalidFunction(node);
+      checkForUndefinedConstructorInInitializerImplicit(node);
+      checkForRedirectToNonConstConstructor(node);
       return super.visitConstructorDeclaration(node);
     } finally {
       _isEnclosingConstructorConst = false;
       _enclosingFunction = outerFunction;
     }
   }
+  Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    _isInConstructorInitializer = true;
+    try {
+      checkForFieldInitializerNotAssignable(node);
+      return super.visitConstructorFieldInitializer(node);
+    } finally {
+      _isInConstructorInitializer = false;
+    }
+  }
   Object visitDefaultFormalParameter(DefaultFormalParameter node) {
     checkForPrivateOptionalParameter(node);
     return super.visitDefaultFormalParameter(node);
@@ -7512,19 +9742,37 @@
     checkForNonBoolCondition(node.condition);
     return super.visitDoStatement(node);
   }
-  Object visitExtendsClause(ExtendsClause node) {
-    checkForExtendsDisallowedClass(node);
-    return super.visitExtendsClause(node);
+  Object visitExportDirective(ExportDirective node) {
+    checkForAmbiguousExport(node);
+    checkForExportDuplicateLibraryName(node);
+    checkForExportInternalLibrary(node);
+    return super.visitExportDirective(node);
   }
   Object visitFieldFormalParameter(FieldFormalParameter node) {
     checkForConstFormalParameter(node);
-    checkForFieldInitializerOutsideConstructor(node);
+    checkForFieldInitializingFormalRedirectingConstructor(node);
     return super.visitFieldFormalParameter(node);
   }
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     ExecutableElement outerFunction = _enclosingFunction;
     try {
+      SimpleIdentifier identifier = node.name;
+      String methoName = "";
+      if (identifier != null) {
+        methoName = identifier.name;
+      }
       _enclosingFunction = node.element;
+      if (node.isSetter() || node.isGetter()) {
+        checkForMismatchedAccessorTypes(node, methoName);
+        if (node.isSetter()) {
+          FunctionExpression functionExpression2 = node.functionExpression;
+          if (functionExpression2 != null) {
+            checkForWrongNumberOfParametersForSetter(node.name, functionExpression2.parameters);
+          }
+          TypeName returnType2 = node.returnType;
+          checkForNonVoidReturnTypeForSetter(returnType2);
+        }
+      }
       return super.visitFunctionDeclaration(node);
     } finally {
       _enclosingFunction = outerFunction;
@@ -7548,9 +9796,14 @@
     checkForNonBoolCondition(node.condition);
     return super.visitIfStatement(node);
   }
-  Object visitImplementsClause(ImplementsClause node) {
-    checkForImplementsDisallowedClass(node);
-    return super.visitImplementsClause(node);
+  Object visitImportDirective(ImportDirective node) {
+    checkForImportDuplicateLibraryName(node);
+    checkForImportInternalLibrary(node);
+    return super.visitImportDirective(node);
+  }
+  Object visitIndexExpression(IndexExpression node) {
+    checkForArgumentTypeNotAssignable2(node.index);
+    return super.visitIndexExpression(node);
   }
   Object visitInstanceCreationExpression(InstanceCreationExpression node) {
     ConstructorName constructorName2 = node.constructorName;
@@ -7558,8 +9811,14 @@
     Type2 type2 = typeName.type;
     if (type2 is InterfaceType) {
       InterfaceType interfaceType = type2 as InterfaceType;
-      checkForConstWithNonConst(node);
       checkForConstOrNewWithAbstractClass(node, typeName, interfaceType);
+      if (node.isConst()) {
+        checkForConstWithNonConst(node);
+        checkForConstWithUndefinedConstructor(node);
+        checkForConstWithTypeParameters(node);
+      } else {
+        checkForNewWithUndefinedConstructor(node);
+      }
       checkForTypeArgumentNotMatchingBounds(node, constructorName2.element, typeName);
     }
     return super.visitInstanceCreationExpression(node);
@@ -7587,27 +9846,74 @@
         }
       }
     }
+    checkForNonConstMapAsExpressionStatement(node);
     return super.visitMapLiteral(node);
   }
   Object visitMethodDeclaration(MethodDeclaration node) {
     ExecutableElement previousFunction = _enclosingFunction;
     try {
       _enclosingFunction = node.element;
-      if (node.isSetter()) {
-        checkForWrongNumberOfParametersForSetter(node);
+      SimpleIdentifier identifier = node.name;
+      String methoName = "";
+      if (identifier != null) {
+        methoName = identifier.name;
+      }
+      if (node.isSetter() || node.isGetter()) {
+        checkForMismatchedAccessorTypes(node, methoName);
+        checkForConflictingInstanceGetterAndSuperclassMember(node);
+      }
+      if (node.isGetter()) {
+        checkForConflictingStaticGetterAndInstanceSetter(node);
+      } else if (node.isSetter()) {
+        checkForWrongNumberOfParametersForSetter(node.name, node.parameters);
+        checkForNonVoidReturnTypeForSetter(node.returnType);
+        checkForConflictingStaticSetterAndInstanceMember(node);
       } else if (node.isOperator()) {
         checkForOptionalParameterInOperator(node);
+        checkForWrongNumberOfParametersForOperator(node);
+        checkForNonVoidReturnTypeForOperator(node);
       }
       checkForConcreteClassWithAbstractMember(node);
+      checkForAllInvalidOverrideErrorCodes(node);
       return super.visitMethodDeclaration(node);
     } finally {
       _enclosingFunction = previousFunction;
     }
   }
+  Object visitMethodInvocation(MethodInvocation node) {
+    checkForStaticAccessToInstanceMember(node.target, node.methodName);
+    return super.visitMethodInvocation(node);
+  }
   Object visitNativeFunctionBody(NativeFunctionBody node) {
     checkForNativeFunctionBodyInNonSDKCode(node);
     return super.visitNativeFunctionBody(node);
   }
+  Object visitPostfixExpression(PostfixExpression node) {
+    checkForAssignmentToFinal2(node.operand);
+    return super.visitPostfixExpression(node);
+  }
+  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+    checkForStaticAccessToInstanceMember(node.prefix, node.identifier);
+    return super.visitPrefixedIdentifier(node);
+  }
+  Object visitPrefixExpression(PrefixExpression node) {
+    if (node.operator.type.isIncrementOperator()) {
+      checkForAssignmentToFinal2(node.operand);
+    }
+    return super.visitPrefixExpression(node);
+  }
+  Object visitPropertyAccess(PropertyAccess node) {
+    checkForStaticAccessToInstanceMember(node.target, node.propertyName);
+    return super.visitPropertyAccess(node);
+  }
+  Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
+    _isInConstructorInitializer = true;
+    try {
+      return super.visitRedirectingConstructorInvocation(node);
+    } finally {
+      _isInConstructorInitializer = false;
+    }
+  }
   Object visitRethrowExpression(RethrowExpression node) {
     checkForRethrowOutsideCatch(node);
     return super.visitRethrowExpression(node);
@@ -7620,11 +9926,30 @@
     checkForConstFormalParameter(node);
     return super.visitSimpleFormalParameter(node);
   }
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    checkForReferenceToDeclaredVariableInInitializer(node);
+    checkForImplicitThisReferenceInInitializer(node);
+    return super.visitSimpleIdentifier(node);
+  }
+  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    _isInConstructorInitializer = true;
+    try {
+      return super.visitSuperConstructorInvocation(node);
+    } finally {
+      _isInConstructorInitializer = false;
+    }
+  }
   Object visitSwitchStatement(SwitchStatement node) {
     checkForCaseExpressionTypeImplementsEquals(node);
     checkForInconsistentCaseExpressionTypes(node);
+    checkForSwitchExpressionNotAssignable(node);
+    checkForCaseBlocksNotTerminated(node);
     return super.visitSwitchStatement(node);
   }
+  Object visitThisExpression(ThisExpression node) {
+    checkForInvalidReferenceToThis(node);
+    return super.visitThisExpression(node);
+  }
   Object visitThrowExpression(ThrowExpression node) {
     checkForConstEvalThrowsException(node);
     return super.visitThrowExpression(node);
@@ -7637,6 +9962,22 @@
     checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME);
     return super.visitTypeParameter(node);
   }
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    SimpleIdentifier nameNode = node.name;
+    Expression initializerNode = node.initializer;
+    checkForInvalidAssignment2(nameNode, initializerNode);
+    nameNode.accept(this);
+    String name2 = nameNode.name;
+    javaSetAdd(_namesForReferenceToDeclaredVariableInInitializer, name2);
+    try {
+      if (initializerNode != null) {
+        initializerNode.accept(this);
+      }
+    } finally {
+      _namesForReferenceToDeclaredVariableInInitializer.remove(name2);
+    }
+    return null;
+  }
   Object visitVariableDeclarationList(VariableDeclarationList node) {
     checkForBuiltInIdentifierAsName2(node);
     return super.visitVariableDeclarationList(node);
@@ -7649,11 +9990,12 @@
     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.
    * @param node the {@link ConstructorDeclaration} to evaluate
-   * @return return {@code true} if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see #initialFieldElementsMap
    * @see CompileTimeErrorCode#FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR
    * @see CompileTimeErrorCode#FINAL_INITIALIZED_MULTIPLE_TIMES
@@ -7677,12 +10019,12 @@
           fieldElementsMap[fieldElement] = INIT_STATE.INIT_IN_FIELD_FORMAL;
         } else if (identical(state, INIT_STATE.INIT_IN_DECLARATION)) {
           if (fieldElement.isFinal() || fieldElement.isConst()) {
-            _errorReporter.reportError(CompileTimeErrorCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR, formalParameter.identifier, [fieldElement.name]);
+            _errorReporter.reportError2(CompileTimeErrorCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR, formalParameter.identifier, [fieldElement.displayName]);
             foundError = true;
           }
         } else if (identical(state, INIT_STATE.INIT_IN_FIELD_FORMAL)) {
           if (fieldElement.isFinal() || fieldElement.isConst()) {
-            _errorReporter.reportError(CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES, formalParameter.identifier, [fieldElement.name]);
+            _errorReporter.reportError2(CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES, formalParameter.identifier, [fieldElement.displayName]);
             foundError = true;
           }
         }
@@ -7701,14 +10043,14 @@
             fieldElementsMap[fieldElement] = INIT_STATE.INIT_IN_INITIALIZERS;
           } else if (identical(state, INIT_STATE.INIT_IN_DECLARATION)) {
             if (fieldElement.isFinal() || fieldElement.isConst()) {
-              _errorReporter.reportError(CompileTimeErrorCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION, fieldName2, []);
+              _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION, fieldName2, []);
               foundError = true;
             }
           } else if (identical(state, INIT_STATE.INIT_IN_FIELD_FORMAL)) {
-            _errorReporter.reportError(CompileTimeErrorCode.FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER, fieldName2, []);
+            _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER, fieldName2, []);
             foundError = true;
           } else if (identical(state, INIT_STATE.INIT_IN_INITIALIZERS)) {
-            _errorReporter.reportError(CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS, fieldName2, [fieldElement.name]);
+            _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS, fieldName2, [fieldElement.displayName]);
             foundError = true;
           }
         }
@@ -7716,6 +10058,180 @@
     }
     return foundError;
   }
+  
+  /**
+   * This checks the passed method declaration against override-error codes.
+   * @param node the {@link MethodDeclaration} to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
+   * @see CompileTimeErrorCode#INVALID_OVERRIDE_REQUIRED
+   * @see CompileTimeErrorCode#INVALID_OVERRIDE_POSITIONAL
+   * @see CompileTimeErrorCode#INVALID_OVERRIDE_NAMED
+   * @see StaticWarningCode#INVALID_GETTER_OVERRIDE_RETURN_TYPE
+   * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_RETURN_TYPE
+   * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE
+   * @see StaticWarningCode#INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE
+   * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE
+   * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE
+   */
+  bool checkForAllInvalidOverrideErrorCodes(MethodDeclaration node) {
+    if (_enclosingClass == null || node.isStatic() || node.body is NativeFunctionBody) {
+      return false;
+    }
+    ExecutableElement executableElement = node.element;
+    if (executableElement == null) {
+      return false;
+    }
+    SimpleIdentifier methodName = node.name;
+    if (methodName.isSynthetic()) {
+      return false;
+    }
+    String methodNameStr = methodName.name;
+    ExecutableElement overriddenExecutable = _inheritanceManager.lookupInheritance(_enclosingClass, executableElement.name);
+    if (overriddenExecutable == null) {
+      if (!node.isGetter() && !node.isSetter() && !node.isOperator()) {
+        Set<ClassElement> visitedClasses = new Set<ClassElement>();
+        InterfaceType superclassType = _enclosingClass.supertype;
+        ClassElement superclassElement = superclassType == null ? null : superclassType.element;
+        while (superclassElement != null && !visitedClasses.contains(superclassElement)) {
+          javaSetAdd(visitedClasses, superclassElement);
+          List<FieldElement> fieldElts = superclassElement.fields;
+          for (FieldElement fieldElt in fieldElts) {
+            if (fieldElt.name == methodNameStr && fieldElt.isStatic()) {
+              _errorReporter.reportError2(StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, methodName, [methodNameStr, fieldElt.enclosingElement.displayName]);
+              return true;
+            }
+          }
+          List<PropertyAccessorElement> propertyAccessorElts = superclassElement.accessors;
+          for (PropertyAccessorElement accessorElt in propertyAccessorElts) {
+            if (accessorElt.name == methodNameStr && accessorElt.isStatic()) {
+              _errorReporter.reportError2(StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, methodName, [methodNameStr, accessorElt.enclosingElement.displayName]);
+              return true;
+            }
+          }
+          List<MethodElement> methodElements = superclassElement.methods;
+          for (MethodElement methodElement in methodElements) {
+            if (methodElement.name == methodNameStr && methodElement.isStatic()) {
+              _errorReporter.reportError2(StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, methodName, [methodNameStr, methodElement.enclosingElement.displayName]);
+              return true;
+            }
+          }
+          superclassType = superclassElement.supertype;
+          superclassElement = superclassType == null ? null : superclassType.element;
+        }
+      }
+      return false;
+    }
+    FunctionType overridingFT = executableElement.type;
+    FunctionType overriddenFT = overriddenExecutable.type;
+    InterfaceType enclosingType = _enclosingClass.type;
+    overriddenFT = _inheritanceManager.substituteTypeArgumentsInMemberFromInheritance(overriddenFT, methodNameStr, enclosingType);
+    if (overridingFT == null || overriddenFT == null) {
+      return false;
+    }
+    Type2 overridingFTReturnType = overridingFT.returnType;
+    Type2 overriddenFTReturnType = overriddenFT.returnType;
+    List<Type2> overridingNormalPT = overridingFT.normalParameterTypes;
+    List<Type2> overriddenNormalPT = overriddenFT.normalParameterTypes;
+    List<Type2> overridingPositionalPT = overridingFT.optionalParameterTypes;
+    List<Type2> overriddenPositionalPT = overriddenFT.optionalParameterTypes;
+    Map<String, Type2> overridingNamedPT = overridingFT.namedParameterTypes;
+    Map<String, Type2> overriddenNamedPT = overriddenFT.namedParameterTypes;
+    if (overridingNormalPT.length != overriddenNormalPT.length) {
+      _errorReporter.reportError2(CompileTimeErrorCode.INVALID_OVERRIDE_REQUIRED, methodName, [overriddenNormalPT.length, overriddenExecutable.enclosingElement.displayName]);
+      return true;
+    }
+    if (overridingPositionalPT.length < overriddenPositionalPT.length) {
+      _errorReporter.reportError2(CompileTimeErrorCode.INVALID_OVERRIDE_POSITIONAL, methodName, [overriddenPositionalPT.length, overriddenExecutable.enclosingElement.displayName]);
+      return true;
+    }
+    Set<String> overridingParameterNameSet = overridingNamedPT.keys.toSet();
+    JavaIterator<String> overriddenParameterNameIterator = new JavaIterator(overriddenNamedPT.keys.toSet());
+    while (overriddenParameterNameIterator.hasNext) {
+      String overriddenParamName = overriddenParameterNameIterator.next();
+      if (!overridingParameterNameSet.contains(overriddenParamName)) {
+        _errorReporter.reportError2(CompileTimeErrorCode.INVALID_OVERRIDE_NAMED, methodName, [overriddenParamName, overriddenExecutable.enclosingElement.displayName]);
+        return true;
+      }
+    }
+    if (overriddenFTReturnType != VoidTypeImpl.instance && !overridingFTReturnType.isAssignableTo(overriddenFTReturnType)) {
+      _errorReporter.reportError2(!node.isGetter() ? StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE : StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE, methodName, [overridingFTReturnType.displayName, overriddenFTReturnType.displayName, overriddenExecutable.enclosingElement.displayName]);
+      return true;
+    }
+    FormalParameterList formalParameterList = node.parameters;
+    if (formalParameterList == null) {
+      return false;
+    }
+    NodeList<FormalParameter> parameterNodeList = formalParameterList.parameters;
+    int parameterIndex = 0;
+    for (int i = 0; i < overridingNormalPT.length; i++) {
+      if (!overridingNormalPT[i].isAssignableTo(overriddenNormalPT[i])) {
+        _errorReporter.reportError2(!node.isSetter() ? StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE : StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE, parameterNodeList[parameterIndex], [overridingNormalPT[i].displayName, overriddenNormalPT[i].displayName, overriddenExecutable.enclosingElement.displayName]);
+        return true;
+      }
+      parameterIndex++;
+    }
+    for (int i = 0; i < overriddenPositionalPT.length; i++) {
+      if (!overridingPositionalPT[i].isAssignableTo(overriddenPositionalPT[i])) {
+        _errorReporter.reportError2(StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE, parameterNodeList[parameterIndex], [overridingPositionalPT[i].displayName, overriddenPositionalPT[i].displayName, overriddenExecutable.enclosingElement.displayName]);
+        return true;
+      }
+      parameterIndex++;
+    }
+    JavaIterator<MapEntry<String, Type2>> overriddenNamedPTIterator = new JavaIterator(getMapEntrySet(overriddenNamedPT));
+    while (overriddenNamedPTIterator.hasNext) {
+      MapEntry<String, Type2> overriddenNamedPTEntry = overriddenNamedPTIterator.next();
+      Type2 overridingType = overridingNamedPT[overriddenNamedPTEntry.getKey()];
+      if (overridingType == null) {
+        continue;
+      }
+      if (!overriddenNamedPTEntry.getValue().isAssignableTo(overridingType)) {
+        NormalFormalParameter parameterToSelect = null;
+        for (FormalParameter formalParameter in parameterNodeList) {
+          if (formalParameter is DefaultFormalParameter && identical(formalParameter.kind, ParameterKind.NAMED)) {
+            DefaultFormalParameter defaultFormalParameter = formalParameter as DefaultFormalParameter;
+            NormalFormalParameter normalFormalParameter = defaultFormalParameter.parameter;
+            if (overriddenNamedPTEntry.getKey() == normalFormalParameter.identifier.name) {
+              parameterToSelect = normalFormalParameter;
+              break;
+            }
+          }
+        }
+        if (parameterToSelect != null) {
+          _errorReporter.reportError2(StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE, parameterToSelect, [overridingType.displayName, overriddenNamedPTEntry.getValue().displayName, overriddenExecutable.enclosingElement.displayName]);
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+  
+  /**
+   * This verifies that all classes of the passed 'with' clause are valid.
+   * @param node the 'with' clause to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#MIXIN_DECLARES_CONSTRUCTOR
+   * @see CompileTimeErrorCode#MIXIN_INHERITS_FROM_NOT_OBJECT
+   * @see CompileTimeErrorCode#MIXIN_REFERENCES_SUPER
+   */
+  bool checkForAllMixinErrorCodes(WithClause withClause) {
+    if (withClause == null) {
+      return false;
+    }
+    bool problemReported = false;
+    for (TypeName mixinName in withClause.mixinTypes) {
+      Type2 mixinType = mixinName.type;
+      if (mixinType is! InterfaceType) {
+        continue;
+      }
+      ClassElement mixinElement = ((mixinType as InterfaceType)).element;
+      problemReported = javaBooleanOr(problemReported, checkForMixinDeclaresConstructor(mixinName, mixinElement));
+      problemReported = javaBooleanOr(problemReported, checkForMixinInheritsNotFromObject(mixinName, mixinElement));
+      problemReported = javaBooleanOr(problemReported, checkForMixinReferencesSuper(mixinName, mixinElement));
+    }
+    return problemReported;
+  }
+  
   /**
    * This checks that the return statement of the form <i>return e;</i> is not in a generative
    * constructor.
@@ -7737,47 +10253,193 @@
     Type2 expectedReturnType = functionType == null ? DynamicTypeImpl.instance : functionType.returnType;
     Expression returnExpression = node.expression;
     bool isGenerativeConstructor = _enclosingFunction is ConstructorElement && !((_enclosingFunction as ConstructorElement)).isFactory();
-    if (returnExpression != null) {
-      if (isGenerativeConstructor) {
-        _errorReporter.reportError(CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR, returnExpression, []);
-        return true;
+    if (isGenerativeConstructor) {
+      if (returnExpression == null) {
+        return false;
       }
-      if (!expectedReturnType.isVoid()) {
-        Type2 actualReturnType = getType(returnExpression);
-        if (!actualReturnType.isAssignableTo(expectedReturnType)) {
-          _errorReporter.reportError(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [actualReturnType.name, expectedReturnType.name, _enclosingFunction.name]);
-          return true;
-        }
+      _errorReporter.reportError2(CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR, returnExpression, []);
+      return true;
+    }
+    if (returnExpression == null) {
+      if (VoidTypeImpl.instance.isAssignableTo(expectedReturnType)) {
+        return false;
       }
+      _errorReporter.reportError2(StaticWarningCode.RETURN_WITHOUT_VALUE, node, []);
+      return true;
+    }
+    Type2 staticReturnType = getStaticType(returnExpression);
+    if (expectedReturnType.isVoid()) {
+      if (staticReturnType.isVoid() || staticReturnType.isDynamic() || identical(staticReturnType, BottomTypeImpl.instance)) {
+        return false;
+      }
+      _errorReporter.reportError2(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [staticReturnType.displayName, expectedReturnType.displayName, _enclosingFunction.displayName]);
+      return true;
+    }
+    bool isStaticAssignable = staticReturnType.isAssignableTo(expectedReturnType);
+    Type2 propagatedReturnType = getPropagatedType(returnExpression);
+    if (propagatedReturnType == null) {
+      if (isStaticAssignable) {
+        return false;
+      }
+      _errorReporter.reportError2(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [staticReturnType.displayName, expectedReturnType.displayName, _enclosingFunction.displayName]);
+      return true;
     } else {
-      if (!isGenerativeConstructor && !VoidTypeImpl.instance.isAssignableTo(expectedReturnType)) {
-        _errorReporter.reportError(StaticWarningCode.RETURN_WITHOUT_VALUE, node, []);
+      bool isPropagatedAssignable = propagatedReturnType.isAssignableTo(expectedReturnType);
+      if (isStaticAssignable || isPropagatedAssignable) {
+        return false;
+      }
+      _errorReporter.reportError2(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [staticReturnType.displayName, expectedReturnType.displayName, _enclosingFunction.displayName]);
+      return true;
+    }
+  }
+  
+  /**
+   * This verifies that the export namespace of the passed export directive does not export any name
+   * already exported by other export directive.
+   * @param node the export directive node to report problem on
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#AMBIGUOUS_EXPORT
+   */
+  bool checkForAmbiguousExport(ExportDirective node) {
+    if (node.element is! ExportElement) {
+      return false;
+    }
+    ExportElement exportElement = node.element as ExportElement;
+    LibraryElement exportedLibrary2 = exportElement.exportedLibrary;
+    if (exportedLibrary2 == null) {
+      return false;
+    }
+    Namespace namespace = new NamespaceBuilder().createExportNamespace(exportElement);
+    Set<String> newNames = namespace.definedNames.keys.toSet();
+    for (String name in newNames) {
+      ExportElement prevElement = _exportedNames[name];
+      if (prevElement != null && prevElement != exportElement) {
+        _errorReporter.reportError2(CompileTimeErrorCode.AMBIGUOUS_EXPORT, node, [name, prevElement.exportedLibrary.definingCompilationUnit.displayName, exportedLibrary2.definingCompilationUnit.displayName]);
+        return true;
+      } else {
+        _exportedNames[name] = exportElement;
       }
     }
     return false;
   }
+  
   /**
    * This verifies that the passed argument definition test identifier is a parameter.
    * @param node the {@link ArgumentDefinitionTest} to evaluate
-   * @return return {@code true} if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#ARGUMENT_DEFINITION_TEST_NON_PARAMETER
    */
   bool checkForArgumentDefinitionTestNonParameter(ArgumentDefinitionTest node) {
     SimpleIdentifier identifier2 = node.identifier;
     Element element2 = identifier2.element;
     if (element2 != null && element2 is! ParameterElement) {
-      _errorReporter.reportError(CompileTimeErrorCode.ARGUMENT_DEFINITION_TEST_NON_PARAMETER, identifier2, [identifier2.name]);
+      _errorReporter.reportError2(CompileTimeErrorCode.ARGUMENT_DEFINITION_TEST_NON_PARAMETER, identifier2, [identifier2.name]);
       return true;
     }
     return false;
   }
+  
+  /**
+   * This verifies that the passed arguments can be assigned to their corresponding parameters.
+   * @param node the arguments to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
+   */
+  bool checkForArgumentTypeNotAssignable(ArgumentList argumentList) {
+    if (argumentList == null) {
+      return false;
+    }
+    bool problemReported = false;
+    for (Expression argument in argumentList.arguments) {
+      problemReported = javaBooleanOr(problemReported, checkForArgumentTypeNotAssignable2(argument));
+    }
+    return problemReported;
+  }
+  
+  /**
+   * This verifies that the passed argument can be assigned to their corresponding parameters.
+   * @param node the argument to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
+   */
+  bool checkForArgumentTypeNotAssignable2(Expression argument) {
+    if (argument == null) {
+      return false;
+    }
+    ParameterElement parameterElement2 = argument.parameterElement;
+    if (parameterElement2 == null) {
+      return false;
+    }
+    Type2 parameterType = parameterElement2.type;
+    if (parameterType == null) {
+      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]);
+    return true;
+  }
+  
+  /**
+   * This verifies that left hand side of the passed assignment expression is not final.
+   * @param node the assignment expression to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#ASSIGNMENT_TO_FINAL
+   */
+  bool checkForAssignmentToFinal(AssignmentExpression node) {
+    Expression leftExpression = node.leftHandSide;
+    return checkForAssignmentToFinal2(leftExpression);
+  }
+  
+  /**
+   * This verifies that the passed expression is not final.
+   * @param node the expression to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#ASSIGNMENT_TO_FINAL
+   */
+  bool checkForAssignmentToFinal2(Expression expression) {
+    Element element = null;
+    if (expression is Identifier) {
+      element = ((expression as Identifier)).element;
+    }
+    if (expression is PropertyAccess) {
+      element = ((expression as PropertyAccess)).propertyName.element;
+    }
+    if (element is VariableElement) {
+      VariableElement leftVar = element as VariableElement;
+      if (leftVar.isFinal()) {
+        _errorReporter.reportError2(StaticWarningCode.ASSIGNMENT_TO_FINAL, expression, []);
+        return true;
+      }
+      return false;
+    }
+    if (element is PropertyAccessorElement) {
+      PropertyAccessorElement leftAccessor = element as PropertyAccessorElement;
+      if (!leftAccessor.isSetter()) {
+        _errorReporter.reportError2(StaticWarningCode.ASSIGNMENT_TO_FINAL, expression, []);
+        return true;
+      }
+      return false;
+    }
+    return false;
+  }
+  
   /**
    * This verifies that the passed identifier is not a keyword, and generates the passed error code
    * on the identifier if it is a keyword.
    * @param identifier the identifier to check to ensure that it is not a keyword
    * @param errorCode if the passed identifier is a keyword then this error code is created on the
    * identifier, the error code will be one of{@link CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_NAME},{@link CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME} or{@link CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME}
-   * @return return {@code true} if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_NAME
    * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME
    * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME
@@ -7785,15 +10447,16 @@
   bool checkForBuiltInIdentifierAsName(SimpleIdentifier identifier, ErrorCode errorCode) {
     sc.Token token2 = identifier.token;
     if (identical(token2.type, sc.TokenType.KEYWORD)) {
-      _errorReporter.reportError(errorCode, identifier, [identifier.name]);
+      _errorReporter.reportError2(errorCode, identifier, [identifier.name]);
       return true;
     }
     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
-   * @return return {@code true} if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE
    */
   bool checkForBuiltInIdentifierAsName2(VariableDeclarationList node) {
@@ -7805,7 +10468,7 @@
         sc.Token token2 = simpleIdentifier.token;
         if (identical(token2.type, sc.TokenType.KEYWORD)) {
           if (((token2 as sc.KeywordToken)).keyword != sc.Keyword.DYNAMIC) {
-            _errorReporter.reportError(CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE, identifier, [identifier.name]);
+            _errorReporter.reportError2(CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE, identifier, [identifier.name]);
             return true;
           }
         }
@@ -7813,29 +10476,86 @@
     }
     return false;
   }
+  
+  /**
+   * This verifies that the given switch case is terminated with 'break', 'continue', 'return' or
+   * 'throw'.
+   * @param node the switch case to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#CASE_BLOCK_NOT_TERMINATED
+   */
+  bool checkForCaseBlockNotTerminated(SwitchCase node) {
+    NodeList<Statement> statements2 = node.statements;
+    if (statements2.isEmpty) {
+      ASTNode parent2 = node.parent;
+      if (parent2 is SwitchStatement) {
+        SwitchStatement switchStatement = parent2 as SwitchStatement;
+        NodeList<SwitchMember> members2 = switchStatement.members;
+        int index = members2.indexOf(node);
+        if (index != -1 && index < members2.length - 1) {
+          return false;
+        }
+      }
+    } else {
+      Statement statement = statements2[statements2.length - 1];
+      if (statement is BreakStatement || statement is ContinueStatement || statement is ReturnStatement) {
+        return false;
+      }
+      if (statement is ExpressionStatement) {
+        Expression expression2 = ((statement as ExpressionStatement)).expression;
+        if (expression2 is ThrowExpression) {
+          return false;
+        }
+      }
+    }
+    _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'.
+   * @param node the switch statement containing the cases to be checked
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#CASE_BLOCK_NOT_TERMINATED
+   */
+  bool checkForCaseBlocksNotTerminated(SwitchStatement node) {
+    bool foundError = false;
+    NodeList<SwitchMember> members2 = node.members;
+    int lastMember = members2.length - 1;
+    for (int i = 0; i < lastMember; i++) {
+      SwitchMember member = members2[i];
+      if (member is SwitchCase) {
+        foundError = javaBooleanOr(foundError, checkForCaseBlockNotTerminated((member as SwitchCase)));
+      }
+    }
+    return foundError;
+  }
+  
   /**
    * This verifies that the passed switch statement does not have a case expression with the
    * operator '==' overridden.
    * @param node the switch statement to evaluate
-   * @return return {@code true} if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS
    */
   bool checkForCaseExpressionTypeImplementsEquals(SwitchStatement node) {
     Expression expression2 = node.expression;
-    Type2 type = expression2.staticType;
+    Type2 type = getStaticType(expression2);
     if (type != null && type != _typeProvider.intType && type != _typeProvider.stringType) {
       Element element2 = type.element;
       if (element2 is ClassElement) {
         ClassElement classElement = element2 as ClassElement;
         MethodElement method = classElement.lookUpMethod("==", _currentLibrary);
         if (method != null && method.enclosingElement.type != _typeProvider.objectType) {
-          _errorReporter.reportError(CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, expression2, [element2.name]);
+          _errorReporter.reportError2(CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, expression2, [element2.displayName]);
           return true;
         }
       }
     }
     return false;
   }
+  
   /**
    * This verifies that the passed method declaration is abstract only if the enclosing class is
    * also abstract.
@@ -7846,39 +10566,183 @@
   bool checkForConcreteClassWithAbstractMember(MethodDeclaration node) {
     if (node.isAbstract() && _enclosingClass != null && !_enclosingClass.isAbstract()) {
       SimpleIdentifier methodName = node.name;
-      _errorReporter.reportError(StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, methodName, [methodName.name, _enclosingClass.name]);
+      _errorReporter.reportError2(StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, methodName, [methodName.name, _enclosingClass.displayName]);
       return true;
     }
     return false;
   }
+  
+  /**
+   * This verifies all possible conflicts of the constructor name with other constructors and
+   * members of the same class.
+   * @param node the constructor declaration to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#DUPLICATE_CONSTRUCTOR_DEFAULT
+   * @see CompileTimeErrorCode#DUPLICATE_CONSTRUCTOR_NAME
+   * @see CompileTimeErrorCode#CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD
+   * @see CompileTimeErrorCode#CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD
+   */
   bool checkForConflictingConstructorNameAndMember(ConstructorDeclaration node) {
     ConstructorElement constructorElement = node.element;
     SimpleIdentifier constructorName = node.name;
+    String name2 = constructorElement.name;
+    ClassElement classElement = constructorElement.enclosingElement;
+    List<ConstructorElement> constructors2 = classElement.constructors;
+    for (ConstructorElement otherConstructor in constructors2) {
+      if (identical(otherConstructor, constructorElement)) {
+        continue;
+      }
+      if (name2 == otherConstructor.name) {
+        if (name2 == null || name2.length == 0) {
+          _errorReporter.reportError2(CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_DEFAULT, node, []);
+        } else {
+          _errorReporter.reportError2(CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME, node, [name2]);
+        }
+        return true;
+      }
+    }
     if (constructorName != null && constructorElement != null && !constructorName.isSynthetic()) {
-      String name2 = constructorName.name;
-      ClassElement classElement = constructorElement.enclosingElement;
       List<FieldElement> fields2 = classElement.fields;
       for (FieldElement field in fields2) {
         if (field.name == name2) {
-          _errorReporter.reportError(CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD, node, [name2]);
+          _errorReporter.reportError2(CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD, node, [name2]);
           return true;
         }
       }
       List<MethodElement> methods2 = classElement.methods;
       for (MethodElement method in methods2) {
         if (method.name == name2) {
-          _errorReporter.reportError(CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD, node, [name2]);
+          _errorReporter.reportError2(CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD, node, [name2]);
           return true;
         }
       }
     }
     return false;
   }
+  
   /**
-   * This verifies that the passed constructor declaration is not 'const' if it has a non-final
+   * 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.
+   * @param node the method declaration to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER
+   * @see StaticWarningCode#CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER
+   */
+  bool checkForConflictingInstanceGetterAndSuperclassMember(MethodDeclaration node) {
+    if (node.isStatic()) {
+      return false;
+    }
+    SimpleIdentifier nameNode = node.name;
+    if (nameNode == null) {
+      return false;
+    }
+    String name2 = nameNode.name;
+    if (_enclosingClass == null) {
+      return false;
+    }
+    InterfaceType enclosingType = _enclosingClass.type;
+    ExecutableElement superElement;
+    superElement = enclosingType.lookUpGetterInSuperclass(name2, _currentLibrary);
+    if (superElement == null) {
+      superElement = enclosingType.lookUpSetterInSuperclass(name2, _currentLibrary);
+    }
+    if (superElement == null) {
+      superElement = enclosingType.lookUpMethodInSuperclass(name2, _currentLibrary);
+    }
+    if (superElement == null) {
+      return false;
+    }
+    if (!superElement.isStatic()) {
+      return false;
+    }
+    ClassElement superElementClass = superElement.enclosingElement as ClassElement;
+    InterfaceType superElementType = superElementClass.type;
+    if (node.isGetter()) {
+      _errorReporter.reportError2(StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER, nameNode, [superElementType.displayName]);
+    } else {
+      _errorReporter.reportError2(StaticWarningCode.CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER, nameNode, [superElementType.displayName]);
+    }
+    return true;
+  }
+  
+  /**
+   * This verifies that the enclosing class does not have an instance member with the same name as
+   * the passed static getter method declaration.
+   * @param node the method declaration to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER
+   */
+  bool checkForConflictingStaticGetterAndInstanceSetter(MethodDeclaration node) {
+    if (!node.isStatic()) {
+      return false;
+    }
+    SimpleIdentifier nameNode = node.name;
+    if (nameNode == null) {
+      return false;
+    }
+    String name2 = nameNode.name;
+    if (_enclosingClass == null) {
+      return false;
+    }
+    InterfaceType enclosingType = _enclosingClass.type;
+    ExecutableElement setter = enclosingType.lookUpSetter(name2, _currentLibrary);
+    if (setter == null) {
+      return false;
+    }
+    if (setter.isStatic()) {
+      return false;
+    }
+    ClassElement setterClass = setter.enclosingElement as ClassElement;
+    InterfaceType setterType = setterClass.type;
+    _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.
+   * @param node the method declaration to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER
+   */
+  bool checkForConflictingStaticSetterAndInstanceMember(MethodDeclaration node) {
+    if (!node.isStatic()) {
+      return false;
+    }
+    SimpleIdentifier nameNode = node.name;
+    if (nameNode == null) {
+      return false;
+    }
+    String name2 = nameNode.name;
+    if (_enclosingClass == null) {
+      return false;
+    }
+    InterfaceType enclosingType = _enclosingClass.type;
+    ExecutableElement member;
+    member = enclosingType.lookUpMethod(name2, _currentLibrary);
+    if (member == null) {
+      member = enclosingType.lookUpGetter(name2, _currentLibrary);
+    }
+    if (member == null) {
+      member = enclosingType.lookUpSetter(name2, _currentLibrary);
+    }
+    if (member == null) {
+      return false;
+    }
+    if (member.isStatic()) {
+      return false;
+    }
+    ClassElement memberClass = member.enclosingElement as ClassElement;
+    InterfaceType memberType = memberClass.type;
+    _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.
-   * @param node the instance creation expression to evaluate
-   * @return return {@code true} if and only if an error code is generated on the passed node
+   * @param node the constructor declaration to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD
    */
   bool checkForConstConstructorWithNonFinalField(ConstructorDeclaration node) {
@@ -7886,52 +10750,50 @@
       return false;
     }
     ConstructorElement constructorElement = node.element;
-    if (constructorElement != null) {
-      ClassElement classElement = constructorElement.enclosingElement;
-      List<FieldElement> elements = classElement.fields;
-      for (FieldElement field in elements) {
-        if (!field.isFinal() && !field.isConst() && !field.isStatic() && !field.isSynthetic()) {
-          _errorReporter.reportError(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD, node, []);
-          return true;
-        }
-      }
+    ClassElement classElement = constructorElement.enclosingElement;
+    if (!classElement.hasNonFinalField()) {
+      return false;
     }
-    return false;
+    _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.
    * @param node the throw expression expression to evaluate
-   * @return return {@code true} if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONST_EVAL_THROWS_EXCEPTION
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_THROWS_EXCEPTION
    */
   bool checkForConstEvalThrowsException(ThrowExpression node) {
     if (_isEnclosingConstructorConst) {
-      _errorReporter.reportError(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, node, []);
+      _errorReporter.reportError2(CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION, node, []);
       return true;
     }
     return false;
   }
+  
   /**
    * This verifies that the passed normal formal parameter is not 'const'.
    * @param node the normal formal parameter to evaluate
-   * @return return {@code true} if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#CONST_FORMAL_PARAMETER
    */
   bool checkForConstFormalParameter(NormalFormalParameter node) {
     if (node.isConst()) {
-      _errorReporter.reportError(CompileTimeErrorCode.CONST_FORMAL_PARAMETER, node, []);
+      _errorReporter.reportError2(CompileTimeErrorCode.CONST_FORMAL_PARAMETER, node, []);
       return true;
     }
     return false;
   }
+  
   /**
    * This verifies that the passed instance creation expression is not being invoked on an abstract
    * class.
    * @param node the instance creation expression to evaluate
    * @param typeName the {@link TypeName} of the {@link ConstructorName} from the{@link InstanceCreationExpression}, this is the AST node that the error is attached to
    * @param type the type being constructed with this {@link InstanceCreationExpression}
-   * @return return {@code true} if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticWarningCode#CONST_WITH_ABSTRACT_CLASS
    * @see StaticWarningCode#NEW_WITH_ABSTRACT_CLASS
    */
@@ -7940,34 +10802,116 @@
       ConstructorElement element2 = node.element;
       if (element2 != null && !element2.isFactory()) {
         if (identical(((node.keyword as sc.KeywordToken)).keyword, sc.Keyword.CONST)) {
-          _errorReporter.reportError(StaticWarningCode.CONST_WITH_ABSTRACT_CLASS, typeName, []);
+          _errorReporter.reportError2(StaticWarningCode.CONST_WITH_ABSTRACT_CLASS, typeName, []);
         } else {
-          _errorReporter.reportError(StaticWarningCode.NEW_WITH_ABSTRACT_CLASS, typeName, []);
+          _errorReporter.reportError2(StaticWarningCode.NEW_WITH_ABSTRACT_CLASS, typeName, []);
         }
         return true;
       }
     }
     return false;
   }
+  
   /**
-   * This verifies that if the passed instance creation expression is 'const', then it is not being
-   * invoked on a constructor that is not 'const'.
+   * This verifies that the passed 'const' instance creation expression is not being invoked on a
+   * constructor that is not 'const'.
+   * <p>
+   * This method assumes that the instance creation was tested to be 'const' before being called.
    * @param node the instance creation expression to evaluate
-   * @return return {@code true} if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#CONST_WITH_NON_CONST
    */
   bool checkForConstWithNonConst(InstanceCreationExpression node) {
     ConstructorElement constructorElement = node.element;
-    if (node.isConst() && constructorElement != null && !constructorElement.isConst()) {
-      _errorReporter.reportError(CompileTimeErrorCode.CONST_WITH_NON_CONST, node, []);
+    if (constructorElement != null && !constructorElement.isConst()) {
+      _errorReporter.reportError2(CompileTimeErrorCode.CONST_WITH_NON_CONST, node, []);
       return true;
     }
     return false;
   }
+  
+  /**
+   * This verifies that the passed 'const' instance creation expression does not reference any type
+   * parameters.
+   * <p>
+   * This method assumes that the instance creation was tested to be 'const' before being called.
+   * @param node the instance creation expression to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_WITH_TYPE_PARAMETERS
+   */
+  bool checkForConstWithTypeParameters(InstanceCreationExpression node) {
+    ConstructorName constructorName2 = node.constructorName;
+    if (constructorName2 == null) {
+      return false;
+    }
+    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
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_WITH_TYPE_PARAMETERS
+   */
+  bool checkForConstWithTypeParameters2(TypeName typeName) {
+    if (typeName == null) {
+      return false;
+    }
+    Identifier name2 = typeName.name;
+    if (name2 == null) {
+      return false;
+    }
+    if (name2.element is TypeVariableElement) {
+      _errorReporter.reportError2(CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS, name2, []);
+    }
+    TypeArgumentList typeArguments2 = typeName.typeArguments;
+    if (typeArguments2 != null) {
+      bool hasError = false;
+      for (TypeName argument in typeArguments2.arguments) {
+        hasError = javaBooleanOr(hasError, checkForConstWithTypeParameters2(argument));
+      }
+      return hasError;
+    }
+    return false;
+  }
+  
+  /**
+   * This verifies that if the passed 'const' instance creation expression is being invoked on the
+   * resolved constructor.
+   * <p>
+   * This method assumes that the instance creation was tested to be 'const' before being called.
+   * @param node the instance creation expression to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_WITH_UNDEFINED_CONSTRUCTOR
+   * @see CompileTimeErrorCode#CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT
+   */
+  bool checkForConstWithUndefinedConstructor(InstanceCreationExpression node) {
+    if (node.element != null) {
+      return false;
+    }
+    ConstructorName constructorName2 = node.constructorName;
+    if (constructorName2 == null) {
+      return false;
+    }
+    TypeName type2 = constructorName2.type;
+    if (type2 == null) {
+      return false;
+    }
+    Identifier className = type2.name;
+    SimpleIdentifier name2 = constructorName2.name;
+    if (name2 != null) {
+      _errorReporter.reportError2(CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR, name2, [className, name2]);
+    } else {
+      _errorReporter.reportError2(CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, constructorName2, [className]);
+    }
+    return true;
+  }
+  
   /**
    * This verifies that there are no default parameters in the passed function type alias.
    * @param node the function type alias to evaluate
-   * @return return {@code true} if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS
    */
   bool checkForDefaultValueInFunctionTypeAlias(FunctionTypeAlias node) {
@@ -7978,25 +10922,90 @@
       if (formalParameter is DefaultFormalParameter) {
         DefaultFormalParameter defaultFormalParameter = formalParameter as DefaultFormalParameter;
         if (defaultFormalParameter.defaultValue != null) {
-          _errorReporter.reportError(CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS, node, []);
+          _errorReporter.reportError2(CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS, node, []);
           result = true;
         }
       }
     }
     return result;
   }
+  
+  /**
+   * This verifies the passed import has unique name among other exported libraries.
+   * @param node the export directive to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#EXPORT_DUPLICATED_LIBRARY_NAME
+   */
+  bool checkForExportDuplicateLibraryName(ExportDirective node) {
+    Element nodeElement = node.element;
+    if (nodeElement is! ExportElement) {
+      return false;
+    }
+    ExportElement nodeExportElement = nodeElement as ExportElement;
+    LibraryElement nodeLibrary = nodeExportElement.exportedLibrary;
+    if (nodeLibrary == null) {
+      return false;
+    }
+    String name2 = nodeLibrary.name;
+    LibraryElement prevLibrary = _nameToExportElement[name2];
+    if (prevLibrary != null) {
+      if (prevLibrary != nodeLibrary) {
+        _errorReporter.reportError2(StaticWarningCode.EXPORT_DUPLICATED_LIBRARY_NAME, node, [prevLibrary.definingCompilationUnit.displayName, nodeLibrary.definingCompilationUnit.displayName, name2]);
+        return true;
+      }
+    } else {
+      _nameToExportElement[name2] = nodeLibrary;
+    }
+    return false;
+  }
+  
+  /**
+   * Check that if the visiting library is not system, then any passed library should not be SDK
+   * internal library.
+   * @param node the export directive to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#EXPORT_INTERNAL_LIBRARY
+   */
+  bool checkForExportInternalLibrary(ExportDirective node) {
+    if (_isInSystemLibrary) {
+      return false;
+    }
+    Element element2 = node.element;
+    if (element2 is! ExportElement) {
+      return false;
+    }
+    ExportElement exportElement = element2 as ExportElement;
+    DartSdk sdk = _currentLibrary.context.sourceFactory.dartSdk;
+    String uri2 = exportElement.uri;
+    SdkLibrary sdkLibrary = sdk.getSdkLibrary(uri2);
+    if (sdkLibrary == null) {
+      return false;
+    }
+    if (!sdkLibrary.isInternal()) {
+      return false;
+    }
+    _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
-   * @return return {@code true} if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS
    */
-  bool checkForExtendsDisallowedClass(ExtendsClause extendsClause) => checkForExtendsOrImplementsDisallowedClass(extendsClause.superclass, CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS);
+  bool checkForExtendsDisallowedClass(ExtendsClause extendsClause) {
+    if (extendsClause == null) {
+      return false;
+    }
+    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'.
    * @param node the type name to test
-   * @return return {@code true} if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see #checkForExtendsDisallowedClass(ExtendsClause)
    * @see #checkForImplementsDisallowedClass(ImplementsClause)
    * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS
@@ -8019,29 +11028,76 @@
             }
           }
         }
-        _errorReporter.reportError(errorCode, typeName, [disallowedType.name]);
+        _errorReporter.reportError2(errorCode, typeName, [disallowedType.displayName]);
         return true;
       }
     }
     return false;
   }
+  
+  /**
+   * This verifies that the passed constructor field initializer has compatible field and
+   * initializer expression types.
+   * @param node the constructor field initializer to test
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE
+   * @see StaticWarningCode#FIELD_INITIALIZER_NOT_ASSIGNABLE
+   */
+  bool checkForFieldInitializerNotAssignable(ConstructorFieldInitializer node) {
+    Element fieldNameElement = node.fieldName.element;
+    if (fieldNameElement is! FieldElement) {
+      return false;
+    }
+    FieldElement fieldElement = fieldNameElement as FieldElement;
+    Type2 fieldType = fieldElement.type;
+    Expression expression2 = node.expression;
+    if (expression2 == null) {
+      return false;
+    }
+    Type2 staticType = getStaticType(expression2);
+    if (staticType == null) {
+      return false;
+    }
+    if (staticType.isAssignableTo(fieldType)) {
+      return false;
+    }
+    Type2 propagatedType = getPropagatedType(expression2);
+    if (propagatedType != null && propagatedType.isAssignableTo(fieldType)) {
+      return false;
+    }
+    if (_isEnclosingConstructorConst) {
+      _errorReporter.reportError2(CompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE, expression2, [(propagatedType == null ? staticType : propagatedType).displayName, fieldType.displayName]);
+    } else {
+      _errorReporter.reportError2(StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE, expression2, [(propagatedType == null ? staticType : propagatedType).displayName, fieldType.displayName]);
+    }
+    return true;
+  }
+  
   /**
    * This verifies that the passed field formal parameter is in a constructor declaration.
    * @param node the field formal parameter to test
-   * @return return {@code true} if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR
    */
-  bool checkForFieldInitializerOutsideConstructor(FieldFormalParameter node) {
-    ASTNode parent2 = node.parent;
-    if (parent2 != null) {
-      ASTNode grandparent = parent2.parent;
-      if (grandparent != null && grandparent is! ConstructorDeclaration && grandparent.parent is! ConstructorDeclaration) {
-        _errorReporter.reportError(CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, node, []);
+  bool checkForFieldInitializingFormalRedirectingConstructor(FieldFormalParameter node) {
+    ConstructorDeclaration constructor = node.getAncestor(ConstructorDeclaration);
+    if (constructor == null) {
+      _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, node, []);
+      return true;
+    }
+    if (constructor.factoryKeyword != null) {
+      _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZER_FACTORY_CONSTRUCTOR, node, []);
+      return true;
+    }
+    for (ConstructorInitializer initializer in constructor.initializers) {
+      if (initializer is RedirectingConstructorInvocation) {
+        _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR, node, []);
         return true;
       }
     }
     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
@@ -8066,6 +11122,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)}.
@@ -8079,31 +11136,142 @@
       NodeList<VariableDeclaration> variables2 = node.variables;
       for (VariableDeclaration variable in variables2) {
         if (variable.initializer == null) {
-          _errorReporter.reportError(CompileTimeErrorCode.FINAL_NOT_INITIALIZED, variable, [variable.name.name]);
+          _errorReporter.reportError2(CompileTimeErrorCode.FINAL_NOT_INITIALIZED, variable, [variable.name.name]);
           foundError = true;
         }
       }
     }
     return foundError;
   }
+  
   /**
    * This verifies that the passed implements clause does not implement classes such as 'num' or
    * 'String'.
    * @param node the implements clause to test
-   * @return return {@code true} if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS
    */
   bool checkForImplementsDisallowedClass(ImplementsClause implementsClause) {
+    if (implementsClause == null) {
+      return false;
+    }
     bool foundError = false;
     for (TypeName type in implementsClause.interfaces) {
       foundError = javaBooleanOr(foundError, checkForExtendsOrImplementsDisallowedClass(type, CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS));
     }
     return foundError;
   }
+  
+  /**
+   * This verifies that if the passed identifier is part of constructor initializer, then it does
+   * not reference implicitly 'this' expression.
+   * @param node the simple identifier to test
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#IMPLICIT_THIS_REFERENCE_IN_INITIALIZER
+   */
+  bool checkForImplicitThisReferenceInInitializer(SimpleIdentifier node) {
+    if (!_isInConstructorInitializer) {
+      return false;
+    }
+    Element element2 = node.element;
+    if (!(element2 is MethodElement || element2 is PropertyAccessorElement)) {
+      return false;
+    }
+    ExecutableElement executableElement = element2 as ExecutableElement;
+    if (executableElement.isStatic()) {
+      return false;
+    }
+    Element enclosingElement2 = element2.enclosingElement;
+    if (enclosingElement2 is! ClassElement) {
+      return false;
+    }
+    ASTNode parent2 = node.parent;
+    if (parent2 is MethodInvocation) {
+      MethodInvocation invocation = parent2 as MethodInvocation;
+      if (identical(invocation.methodName, node) && invocation.realTarget != null) {
+        return false;
+      }
+    }
+    {
+      if (parent2 is PropertyAccess) {
+        PropertyAccess access = parent2 as PropertyAccess;
+        if (identical(access.propertyName, node) && access.realTarget != null) {
+          return false;
+        }
+      }
+      if (parent2 is PrefixedIdentifier) {
+        PrefixedIdentifier prefixed = parent2 as PrefixedIdentifier;
+        if (identical(prefixed.identifier, node)) {
+          return false;
+        }
+      }
+    }
+    _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
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#IMPORT_DUPLICATED_LIBRARY_NAME
+   */
+  bool checkForImportDuplicateLibraryName(ImportDirective node) {
+    Element nodeElement = node.element;
+    if (nodeElement is! ImportElement) {
+      return false;
+    }
+    ImportElement nodeImportElement = nodeElement as ImportElement;
+    LibraryElement nodeLibrary = nodeImportElement.importedLibrary;
+    if (nodeLibrary == null) {
+      return false;
+    }
+    String name2 = nodeLibrary.name;
+    LibraryElement prevLibrary = _nameToImportElement[name2];
+    if (prevLibrary != null) {
+      if (prevLibrary != nodeLibrary) {
+        _errorReporter.reportError2(StaticWarningCode.IMPORT_DUPLICATED_LIBRARY_NAME, node, [prevLibrary.definingCompilationUnit.displayName, nodeLibrary.definingCompilationUnit.displayName, name2]);
+        return true;
+      }
+    } else {
+      _nameToImportElement[name2] = nodeLibrary;
+    }
+    return false;
+  }
+  
+  /**
+   * Check that if the visiting library is not system, then any passed library should not be SDK
+   * internal library.
+   * @param node the import directive to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#IMPORT_INTERNAL_LIBRARY
+   */
+  bool checkForImportInternalLibrary(ImportDirective node) {
+    if (_isInSystemLibrary) {
+      return false;
+    }
+    Element element2 = node.element;
+    if (element2 is! ImportElement) {
+      return false;
+    }
+    ImportElement importElement = element2 as ImportElement;
+    DartSdk sdk = _currentLibrary.context.sourceFactory.dartSdk;
+    String uri2 = importElement.uri;
+    SdkLibrary sdkLibrary = sdk.getSdkLibrary(uri2);
+    if (sdkLibrary == null) {
+      return false;
+    }
+    if (!sdkLibrary.isInternal()) {
+      return false;
+    }
+    _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
-   * @return return {@code true} if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#INCONSISTENT_CASE_EXPRESSION_TYPES
    */
   bool checkForInconsistentCaseExpressionTypes(SwitchStatement node) {
@@ -8115,11 +11283,11 @@
         SwitchCase switchCase = switchMember as SwitchCase;
         Expression expression2 = switchCase.expression;
         if (firstType == null) {
-          firstType = expression2.staticType;
+          firstType = getBestType(expression2);
         } else {
-          Type2 nType = expression2.staticType;
+          Type2 nType = getBestType(expression2);
           if (firstType != nType) {
-            _errorReporter.reportError(CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES, expression2, [expression2.toSource(), firstType.name]);
+            _errorReporter.reportError2(CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES, expression2, [expression2.toSource(), firstType.displayName]);
             foundError = true;
           }
         }
@@ -8127,39 +11295,115 @@
     }
     return foundError;
   }
+  
   /**
-   * This verifies that the passed assignment expression represents a valid assignment.
-   * @param node the assignment expression to evaluate
-   * @return return {@code true} if and only if an error code is generated on the passed node
+   * For each class declaration, this method is called which verifies that all inherited members are
+   * inherited consistently.
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#INCONSISTENT_METHOD_INHERITANCE
+   */
+  bool checkForInconsistentMethodInheritance() {
+    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(_enclosingClass);
+    Set<AnalysisError> errors = _inheritanceManager.getErrors(_enclosingClass);
+    if (errors == null || errors.isEmpty) {
+      return false;
+    }
+    for (AnalysisError error in errors) {
+      _errorReporter.reportError(error);
+    }
+    return true;
+  }
+  
+  /**
+   * Given an assignment using a compound assignment operator, this verifies that the given
+   * assignment is valid.
+   * @param node the assignment expression being tested
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticTypeWarningCode#INVALID_ASSIGNMENT
    */
   bool checkForInvalidAssignment(AssignmentExpression node) {
     Expression lhs = node.leftHandSide;
-    Expression rhs = node.rightHandSide;
+    if (lhs == null) {
+      return false;
+    }
     VariableElement leftElement = getVariableElement(lhs);
-    Type2 leftType = (leftElement == null) ? getType(lhs) : leftElement.type;
-    Type2 rightType = getType(rhs);
+    Type2 leftType = (leftElement == null) ? getStaticType(lhs) : leftElement.type;
+    MethodElement invokedMethod = node.element;
+    if (invokedMethod == null) {
+      return false;
+    }
+    Type2 rightType = invokedMethod.type.returnType;
+    if (leftType == null || rightType == null) {
+      return false;
+    }
     if (!rightType.isAssignableTo(leftType)) {
-      _errorReporter.reportError(StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [rightType.name, leftType.name]);
+      _errorReporter.reportError2(StaticTypeWarningCode.INVALID_ASSIGNMENT, node.rightHandSide, [rightType.displayName, leftType.displayName]);
       return true;
     }
     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
+   * @param rhs the right hand side expression
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#INVALID_ASSIGNMENT
+   */
+  bool checkForInvalidAssignment2(Expression lhs, Expression rhs) {
+    if (lhs == null || rhs == null) {
+      return false;
+    }
+    VariableElement leftElement = getVariableElement(lhs);
+    Type2 leftType = (leftElement == null) ? getStaticType(lhs) : leftElement.type;
+    Type2 staticRightType = getStaticType(rhs);
+    bool isStaticAssignable = staticRightType.isAssignableTo(leftType);
+    Type2 propagatedRightType = getPropagatedType(rhs);
+    if (propagatedRightType == null) {
+      if (!isStaticAssignable) {
+        _errorReporter.reportError2(StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [staticRightType.displayName, leftType.displayName]);
+        return true;
+      }
+    } else {
+      bool isPropagatedAssignable = propagatedRightType.isAssignableTo(leftType);
+      if (!isStaticAssignable && !isPropagatedAssignable) {
+        _errorReporter.reportError2(StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [staticRightType.displayName, leftType.displayName]);
+        return true;
+      }
+    }
+    return false;
+  }
+  
+  /**
+   * This verifies that the usage of the passed 'this' is valid.
+   * @param node the 'this' expression to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#INVALID_REFERENCE_TO_THIS
+   */
+  bool checkForInvalidReferenceToThis(ThisExpression node) {
+    if (!isThisInValidContext(node)) {
+      _errorReporter.reportError2(CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, node, []);
+      return true;
+    }
+    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}
-   * @return return {@code true} if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#INVALID_TYPE_ARGUMENT_FOR_KEY
    */
   bool checkForInvalidTypeArgumentForKey(NodeList<TypeName> arguments) {
     TypeName firstArgument = arguments[0];
     Type2 firstArgumentType = firstArgument.type;
     if (firstArgumentType != null && firstArgumentType != _typeProvider.stringType) {
-      _errorReporter.reportError(CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_FOR_KEY, firstArgument, []);
+      _errorReporter.reportError2(CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_FOR_KEY, firstArgument, []);
       return true;
     }
     return false;
   }
+  
   /**
    * Checks to ensure that the passed {@link ListLiteral} or {@link MapLiteral} does not have a type
    * parameter as a type argument.
@@ -8171,63 +11415,376 @@
     bool foundError = false;
     for (TypeName typeName in arguments) {
       if (typeName.type is TypeVariableType) {
-        _errorReporter.reportError(errorCode, typeName, [typeName.name]);
+        _errorReporter.reportError2(errorCode, typeName, [typeName.name]);
         foundError = true;
       }
     }
     return foundError;
   }
+  
+  /**
+   * This verifies that the {@link #enclosingClass} does not define members with the same name as
+   * the enclosing class.
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#MEMBER_WITH_CLASS_NAME
+   */
+  bool checkForMemberWithClassName() {
+    if (_enclosingClass == null) {
+      return false;
+    }
+    String className = _enclosingClass.name;
+    if (className == null) {
+      return false;
+    }
+    bool problemReported = false;
+    for (PropertyAccessorElement accessor in _enclosingClass.accessors) {
+      if (className == accessor.name) {
+        _errorReporter.reportError3(CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME, accessor.nameOffset, className.length, []);
+        problemReported = true;
+      }
+    }
+    return problemReported;
+  }
+  
+  /**
+   * Check to make sure that all similarly typed accessors are of the same type (including inherited
+   * accessors).
+   * @param node The accessor currently being visited.
+   */
+  void checkForMismatchedAccessorTypes(Declaration accessorDeclaration, String accessorTextName) {
+    PropertyAccessorElement counterpartAccessor = null;
+    ExecutableElement accessorElement = accessorDeclaration.element as ExecutableElement;
+    if (accessorElement is! PropertyAccessorElement) {
+      return;
+    }
+    PropertyAccessorElement propertyAccessorElement = accessorElement as PropertyAccessorElement;
+    counterpartAccessor = propertyAccessorElement.correspondingSetter;
+    if (counterpartAccessor == null) {
+      return;
+    }
+    Type2 getterType = null;
+    Type2 setterType = null;
+    if (propertyAccessorElement.isGetter()) {
+      getterType = getGetterType(propertyAccessorElement);
+      setterType = getSetterType(counterpartAccessor);
+    } else if (propertyAccessorElement.isSetter()) {
+      setterType = getSetterType(propertyAccessorElement);
+      counterpartAccessor = propertyAccessorElement.correspondingGetter;
+      getterType = getGetterType(counterpartAccessor);
+    }
+    if (setterType != null && getterType != null && !getterType.isAssignableTo(setterType)) {
+      _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
+   * @param mixinElement the mixing to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#MIXIN_DECLARES_CONSTRUCTOR
+   */
+  bool checkForMixinDeclaresConstructor(TypeName mixinName, ClassElement mixinElement) {
+    for (ConstructorElement constructor in mixinElement.constructors) {
+      if (!constructor.isSynthetic() && !constructor.isFactory()) {
+        _errorReporter.reportError2(CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR, mixinName, [mixinElement.name]);
+        return true;
+      }
+    }
+    return false;
+  }
+  
+  /**
+   * This verifies that the passed mixin has the 'Object' superclass.
+   * @param mixinName the node to report problem on
+   * @param mixinElement the mixing to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#MIXIN_INHERITS_FROM_NOT_OBJECT
+   */
+  bool checkForMixinInheritsNotFromObject(TypeName mixinName, ClassElement mixinElement) {
+    InterfaceType mixinSupertype = mixinElement.supertype;
+    if (mixinSupertype != null) {
+      if (!mixinSupertype.isObject() || !mixinElement.isTypedef() && mixinElement.mixins.length != 0) {
+        _errorReporter.reportError2(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, mixinName, [mixinElement.name]);
+        return true;
+      }
+    }
+    return false;
+  }
+  
+  /**
+   * This verifies that the passed mixin does not reference 'super'.
+   * @param mixinName the node to report problem on
+   * @param mixinElement the mixing to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#MIXIN_REFERENCES_SUPER
+   */
+  bool checkForMixinReferencesSuper(TypeName mixinName, ClassElement mixinElement) {
+    if (mixinElement.hasReferenceToSuper()) {
+      _errorReporter.reportError2(CompileTimeErrorCode.MIXIN_REFERENCES_SUPER, mixinName, [mixinElement.name]);
+    }
+    return false;
+  }
+  
+  /**
+   * This verifies that the passed constructor has at most one 'super' initializer.
+   * @param node the constructor declaration to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#MULTIPLE_SUPER_INITIALIZERS
+   */
+  bool checkForMultipleSuperInitializers(ConstructorDeclaration node) {
+    int numSuperInitializers = 0;
+    for (ConstructorInitializer initializer in node.initializers) {
+      if (initializer is SuperConstructorInvocation) {
+        numSuperInitializers++;
+        if (numSuperInitializers > 1) {
+          _errorReporter.reportError2(CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS, initializer, []);
+        }
+      }
+    }
+    return numSuperInitializers > 0;
+  }
+  
   /**
    * Checks to ensure that native function bodies can only in SDK code.
    * @param node the native function body to test
-   * @return return {@code true} if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see ParserErrorCode#NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE
    */
   bool checkForNativeFunctionBodyInNonSDKCode(NativeFunctionBody node) {
     if (!_isInSystemLibrary) {
-      _errorReporter.reportError(ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE, node, []);
+      _errorReporter.reportError2(ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE, node, []);
       return true;
     }
     return false;
   }
+  
+  /**
+   * This verifies that the passed 'new' instance creation expression invokes existing constructor.
+   * <p>
+   * This method assumes that the instance creation was tested to be 'new' before being called.
+   * @param node the instance creation expression to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#NEW_WITH_UNDEFINED_CONSTRUCTOR
+   */
+  bool checkForNewWithUndefinedConstructor(InstanceCreationExpression node) {
+    if (node.element != null) {
+      return false;
+    }
+    ConstructorName constructorName2 = node.constructorName;
+    if (constructorName2 == null) {
+      return false;
+    }
+    TypeName type2 = constructorName2.type;
+    if (type2 == null) {
+      return false;
+    }
+    Identifier className = type2.name;
+    SimpleIdentifier name2 = constructorName2.name;
+    if (name2 != null) {
+      _errorReporter.reportError2(StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR, name2, [className, name2]);
+    } else {
+      _errorReporter.reportError2(StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, constructorName2, [className]);
+    }
+    return true;
+  }
+  
+  /**
+   * This checks that passed class declaration overrides all members required by its superclasses
+   * and interfaces.
+   * @param node the {@link ClassDeclaration} to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE
+   * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO
+   * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE
+   * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR
+   * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS
+   */
+  bool checkForNonAbstractClassInheritsAbstractMember(ClassDeclaration node) {
+    if (_enclosingClass.isAbstract()) {
+      return false;
+    }
+    Set<ExecutableElement> missingOverrides = new Set<ExecutableElement>();
+    Set<String> methodsInEnclosingClass = new Set<String>();
+    Set<String> accessorsInEnclosingClass = new Set<String>();
+    List<MethodElement> methods2 = _enclosingClass.methods;
+    for (MethodElement method in methods2) {
+      javaSetAdd(methodsInEnclosingClass, method.name);
+    }
+    List<PropertyAccessorElement> accessors2 = _enclosingClass.accessors;
+    for (PropertyAccessorElement accessor in accessors2) {
+      javaSetAdd(accessorsInEnclosingClass, accessor.name);
+    }
+    Map<String, ExecutableElement> membersInheritedFromSuperclasses = _inheritanceManager.getMapOfMembersInheritedFromClasses(_enclosingClass);
+    for (MapEntry<String, ExecutableElement> entry in getMapEntrySet(membersInheritedFromSuperclasses)) {
+      ExecutableElement executableElt = entry.getValue();
+      if (executableElt is MethodElement) {
+        MethodElement methodElt = executableElt as MethodElement;
+        if (methodElt.isAbstract()) {
+          String methodName = entry.getKey();
+          if (!methodsInEnclosingClass.contains(methodName)) {
+            javaSetAdd(missingOverrides, executableElt);
+          }
+        }
+      } else if (executableElt is PropertyAccessorElement) {
+        PropertyAccessorElement propertyAccessorElt = executableElt as PropertyAccessorElement;
+        if (propertyAccessorElt.isAbstract()) {
+          String accessorName = entry.getKey();
+          if (!accessorsInEnclosingClass.contains(accessorName)) {
+            javaSetAdd(missingOverrides, executableElt);
+          }
+        }
+      }
+    }
+    Map<String, ExecutableElement> membersInheritedFromInterfaces = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(_enclosingClass);
+    for (MapEntry<String, ExecutableElement> entry in getMapEntrySet(membersInheritedFromInterfaces)) {
+      ExecutableElement executableElt = entry.getValue();
+      ExecutableElement elt = membersInheritedFromSuperclasses[executableElt.name];
+      if (elt != null) {
+        if (elt is MethodElement && !((elt as MethodElement)).isAbstract()) {
+          continue;
+        } else if (elt is PropertyAccessorElement && !((elt as PropertyAccessorElement)).isAbstract()) {
+          continue;
+        }
+      }
+      if (executableElt is MethodElement) {
+        String methodName = entry.getKey();
+        if (!methodsInEnclosingClass.contains(methodName)) {
+          javaSetAdd(missingOverrides, executableElt);
+        }
+      } else if (executableElt is PropertyAccessorElement) {
+        String accessorName = entry.getKey();
+        if (!accessorsInEnclosingClass.contains(accessorName)) {
+          javaSetAdd(missingOverrides, executableElt);
+        }
+      }
+    }
+    int missingOverridesSize = missingOverrides.length;
+    if (missingOverridesSize == 0) {
+      return false;
+    }
+    List<ExecutableElement> missingOverridesArray = new List.from(missingOverrides);
+    if (missingOverridesSize == 1) {
+      _errorReporter.reportError2(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE, node.name, [missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName]);
+    } else if (missingOverridesSize == 2) {
+      _errorReporter.reportError2(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO, node.name, [missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName, missingOverridesArray[1].enclosingElement.displayName, missingOverridesArray[1].displayName]);
+    } else if (missingOverridesSize == 3) {
+      _errorReporter.reportError2(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE, node.name, [missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName, missingOverridesArray[1].enclosingElement.displayName, missingOverridesArray[1].displayName, missingOverridesArray[2].enclosingElement.displayName, missingOverridesArray[2].displayName]);
+    } else if (missingOverridesSize == 4) {
+      _errorReporter.reportError2(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR, node.name, [missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName, missingOverridesArray[1].enclosingElement.displayName, missingOverridesArray[1].displayName, missingOverridesArray[2].enclosingElement.displayName, missingOverridesArray[2].displayName, missingOverridesArray[3].enclosingElement.displayName, missingOverridesArray[3].displayName]);
+    } else {
+      _errorReporter.reportError2(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS, node.name, [missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName, missingOverridesArray[1].enclosingElement.displayName, missingOverridesArray[1].displayName, missingOverridesArray[2].enclosingElement.displayName, missingOverridesArray[2].displayName, missingOverridesArray[3].enclosingElement.displayName, missingOverridesArray[3].displayName, missingOverridesArray.length - 4]);
+    }
+    return true;
+  }
+  
   /**
    * Checks to ensure that the expressions that need to be of type bool, are. Otherwise an error is
    * reported on the expression.
    * @param condition the conditional expression to test
-   * @return return {@code true} if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticTypeWarningCode#NON_BOOL_CONDITION
    */
   bool checkForNonBoolCondition(Expression condition) {
-    Type2 conditionType = getType(condition);
+    Type2 conditionType = getStaticType(condition);
     if (conditionType != null && !conditionType.isAssignableTo(_typeProvider.boolType)) {
-      _errorReporter.reportError(StaticTypeWarningCode.NON_BOOL_CONDITION, condition, []);
+      _errorReporter.reportError2(StaticTypeWarningCode.NON_BOOL_CONDITION, condition, []);
       return true;
     }
     return false;
   }
+  
   /**
    * This verifies that the passed assert statement has either a 'bool' or '() -> bool' input.
    * @param node the assert statement to evaluate
-   * @return return {@code true} if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticTypeWarningCode#NON_BOOL_EXPRESSION
    */
   bool checkForNonBoolExpression(AssertStatement node) {
     Expression expression = node.condition;
-    Type2 type = getType(expression);
+    Type2 type = getStaticType(expression);
     if (type is InterfaceType) {
       if (!type.isAssignableTo(_typeProvider.boolType)) {
-        _errorReporter.reportError(StaticTypeWarningCode.NON_BOOL_EXPRESSION, expression, []);
+        _errorReporter.reportError2(StaticTypeWarningCode.NON_BOOL_EXPRESSION, expression, []);
         return true;
       }
     } else if (type is FunctionType) {
       FunctionType functionType = type as FunctionType;
       if (functionType.typeArguments.length == 0 && !functionType.returnType.isAssignableTo(_typeProvider.boolType)) {
-        _errorReporter.reportError(StaticTypeWarningCode.NON_BOOL_EXPRESSION, expression, []);
+        _errorReporter.reportError2(StaticTypeWarningCode.NON_BOOL_EXPRESSION, expression, []);
         return true;
       }
     }
     return false;
   }
+  
+  /**
+   * This verifies the passed map literal either:
+   * <ul>
+   * <li>has {@code const modifier}</li>
+   * <li>has explicit type arguments</li>
+   * <li>is not start of the statement</li>
+   * <ul>
+   * @param node the map literal to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#NON_CONST_MAP_AS_EXPRESSION_STATEMENT
+   */
+  bool checkForNonConstMapAsExpressionStatement(MapLiteral node) {
+    if (node.modifier != null) {
+      return false;
+    }
+    if (node.typeArguments != null) {
+      return false;
+    }
+    Statement statement = node.getAncestor(ExpressionStatement);
+    if (statement == null) {
+      return false;
+    }
+    if (statement.beginToken != node.beginToken) {
+      return false;
+    }
+    _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.
+   * @param node the method declaration to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#NON_VOID_RETURN_FOR_OPERATOR
+   */
+  bool checkForNonVoidReturnTypeForOperator(MethodDeclaration node) {
+    SimpleIdentifier name2 = node.name;
+    if (name2.name != "[]=") {
+      return false;
+    }
+    TypeName typeName = node.returnType;
+    if (typeName != null) {
+      Type2 type2 = typeName.type;
+      if (type2 != null && !type2.isVoid()) {
+        _errorReporter.reportError2(StaticWarningCode.NON_VOID_RETURN_FOR_OPERATOR, typeName, []);
+      }
+    }
+    return false;
+  }
+  
+  /**
+   * This verifies the passed setter has no return type or the {@code void} return type.
+   * @param typeName the type name to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#NON_VOID_RETURN_FOR_SETTER
+   */
+  bool checkForNonVoidReturnTypeForSetter(TypeName typeName) {
+    if (typeName != null) {
+      Type2 type2 = typeName.type;
+      if (type2 != null && !type2.isVoid()) {
+        _errorReporter.reportError2(StaticWarningCode.NON_VOID_RETURN_FOR_SETTER, typeName, []);
+      }
+    }
+    return false;
+  }
+  
   /**
    * This verifies the passed operator-method declaration, does not have an optional parameter.
    * <p>
@@ -8246,12 +11803,13 @@
     NodeList<FormalParameter> formalParameters = parameterList.parameters;
     for (FormalParameter formalParameter in formalParameters) {
       if (formalParameter.kind.isOptional()) {
-        _errorReporter.reportError(CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR, formalParameter, []);
+        _errorReporter.reportError2(CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR, formalParameter, []);
         foundError = true;
       }
     }
     return foundError;
   }
+  
   /**
    * This checks for named optional parameters that begin with '_'.
    * @param node the default formal parameter to evaluate
@@ -8264,12 +11822,266 @@
       NormalFormalParameter parameter2 = node.parameter;
       SimpleIdentifier name = parameter2.identifier;
       if (!name.isSynthetic() && name.name.startsWith("_")) {
-        _errorReporter.reportError(CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER, node, []);
+        _errorReporter.reportError2(CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER, node, []);
         return true;
       }
     }
     return false;
   }
+  
+  /**
+   * This checks if the passed constructor declaration is the redirecting generative constructor and
+   * references itself directly or indirectly.
+   * @param node the constructor declaration to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#RECURSIVE_CONSTRUCTOR_REDIRECT
+   */
+  bool checkForRecursiveConstructorRedirect(ConstructorDeclaration node) {
+    if (node.factoryKeyword != null) {
+      return false;
+    }
+    for (ConstructorInitializer initializer in node.initializers) {
+      if (initializer is RedirectingConstructorInvocation) {
+        ConstructorElement element2 = node.element;
+        if (!hasRedirectingFactoryConstructorCycle(element2)) {
+          return false;
+        }
+        _errorReporter.reportError2(CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT, initializer, []);
+        return true;
+      }
+    }
+    return false;
+  }
+  
+  /**
+   * This checks if the passed constructor declaration has redirected constructor and references
+   * itself directly or indirectly.
+   * @param node the constructor declaration to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#RECURSIVE_FACTORY_REDIRECT
+   */
+  bool checkForRecursiveFactoryRedirect(ConstructorDeclaration node) {
+    ConstructorName redirectedConstructorNode = node.redirectedConstructor;
+    if (redirectedConstructorNode == null) {
+      return false;
+    }
+    ConstructorElement element2 = node.element;
+    if (!hasRedirectingFactoryConstructorCycle(element2)) {
+      return false;
+    }
+    _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
+   * @param list a list containing the potentially cyclic implements path
+   * @return {@code true} if and only if an error code is generated on the passed element
+   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE
+   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS
+   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS
+   */
+  bool checkForRecursiveInterfaceInheritance(ClassElement classElt, List<ClassElement> list) {
+    if (classElt == null) {
+      return false;
+    }
+    InterfaceType supertype2 = classElt.supertype;
+    list.add(classElt);
+    if (list.length != 1 && _enclosingClass == classElt) {
+      String enclosingClassName = _enclosingClass.displayName;
+      if (list.length > 2) {
+        String separator = ", ";
+        int listLength = list.length;
+        JavaStringBuilder builder = new JavaStringBuilder();
+        for (int i = 0; i < listLength; i++) {
+          builder.append(list[i].displayName);
+          if (i != listLength - 1) {
+            builder.append(separator);
+          }
+        }
+        _errorReporter.reportError3(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, _enclosingClass.nameOffset, enclosingClassName.length, [enclosingClassName, builder.toString()]);
+        return true;
+      } else if (list.length == 2) {
+        ErrorCode errorCode = supertype2 != null && _enclosingClass == supertype2.element ? CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS : CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS;
+        _errorReporter.reportError3(errorCode, _enclosingClass.nameOffset, enclosingClassName.length, [enclosingClassName]);
+        return true;
+      }
+    }
+    for (int i = 1; i < list.length - 1; i++) {
+      if (classElt == list[i]) {
+        list.removeAt(list.length - 1);
+        return false;
+      }
+    }
+    List<ClassElement> interfaceElements;
+    List<InterfaceType> interfaceTypes = classElt.interfaces;
+    if (supertype2 != null && !supertype2.isObject()) {
+      interfaceElements = new List<ClassElement>(interfaceTypes.length + 1);
+      interfaceElements[0] = supertype2.element;
+      for (int i = 0; i < interfaceTypes.length; i++) {
+        interfaceElements[i + 1] = interfaceTypes[i].element;
+      }
+    } else {
+      interfaceElements = new List<ClassElement>(interfaceTypes.length);
+      for (int i = 0; i < interfaceTypes.length; i++) {
+        interfaceElements[i] = interfaceTypes[i].element;
+      }
+    }
+    for (ClassElement classElt2 in interfaceElements) {
+      if (checkForRecursiveInterfaceInheritance(classElt2, list)) {
+        return true;
+      }
+    }
+    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.
+   * @param node the constructor declaration to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS
+   * @see CompileTimeErrorCode#SUPER_IN_REDIRECTING_CONSTRUCTOR
+   * @see CompileTimeErrorCode#FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR
+   */
+  bool checkForRedirectingConstructorErrorCodes(ConstructorDeclaration node) {
+    int numProblems = 0;
+    int numRedirections = 0;
+    for (ConstructorInitializer initializer in node.initializers) {
+      if (initializer is RedirectingConstructorInvocation) {
+        if (numRedirections > 0) {
+          _errorReporter.reportError2(CompileTimeErrorCode.MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS, initializer, []);
+          numProblems++;
+        }
+        numRedirections++;
+      }
+    }
+    if (numRedirections > 0) {
+      for (ConstructorInitializer initializer in node.initializers) {
+        if (initializer is SuperConstructorInvocation) {
+          _errorReporter.reportError2(CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR, initializer, []);
+          numProblems++;
+        }
+        if (initializer is ConstructorFieldInitializer) {
+          _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR, initializer, []);
+          numProblems++;
+        }
+      }
+    }
+    return numProblems != 0;
+  }
+  
+  /**
+   * This checks if the passed constructor declaration has redirected constructor with compatible
+   * function type.
+   * @param node the constructor declaration to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#REDIRECT_TO_INVALID_RETURN_TYPE
+   * @see StaticWarningCode#REDIRECT_TO_INVALID_FUNCTION_TYPE
+   */
+  bool checkForRedirectToInvalidFunction(ConstructorDeclaration node) {
+    ConstructorName redirectedNode = node.redirectedConstructor;
+    if (redirectedNode == null) {
+      return false;
+    }
+    ConstructorElement redirectedElement = redirectedNode.element;
+    if (redirectedElement == null) {
+      return false;
+    }
+    FunctionType redirectedType = redirectedElement.type;
+    Type2 redirectedReturnType = redirectedType.returnType;
+    FunctionType constructorType = node.element.type;
+    Type2 constructorReturnType = constructorType.returnType;
+    if (!redirectedReturnType.isSubtypeOf(constructorReturnType)) {
+      _errorReporter.reportError2(StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE, redirectedNode, [redirectedReturnType, constructorReturnType]);
+      return true;
+    }
+    if (!redirectedType.isSubtypeOf(constructorType)) {
+      _errorReporter.reportError2(StaticWarningCode.REDIRECT_TO_INVALID_FUNCTION_TYPE, redirectedNode, [redirectedType, constructorType]);
+      return true;
+    }
+    return false;
+  }
+  
+  /**
+   * This checks if the passed constructor declaration has redirected constructor and references
+   * itself directly or indirectly. TODO(scheglov)
+   * @param node the constructor declaration to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#REDIRECT_TO_NON_CONST_CONSTRUCTOR
+   */
+  bool checkForRedirectToNonConstConstructor(ConstructorDeclaration node) {
+    ConstructorName redirectedConstructorNode = node.redirectedConstructor;
+    if (redirectedConstructorNode == null) {
+      return false;
+    }
+    ConstructorElement element2 = node.element;
+    if (element2 == null) {
+      return false;
+    }
+    if (!element2.isConst()) {
+      return false;
+    }
+    ConstructorElement redirectedConstructor2 = element2.redirectedConstructor;
+    if (redirectedConstructor2 == null) {
+      return false;
+    }
+    if (redirectedConstructor2.isConst()) {
+      return false;
+    }
+    _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.
+   * @param node the identifier to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER
+   */
+  bool checkForReferenceToDeclaredVariableInInitializer(SimpleIdentifier node) {
+    ASTNode parent2 = node.parent;
+    if (parent2 is PrefixedIdentifier) {
+      PrefixedIdentifier prefixedIdentifier = parent2 as PrefixedIdentifier;
+      if (identical(prefixedIdentifier.identifier, node)) {
+        return false;
+      }
+    }
+    if (parent2 is PropertyAccess) {
+      PropertyAccess propertyAccess = parent2 as PropertyAccess;
+      if (identical(propertyAccess.propertyName, node)) {
+        return false;
+      }
+    }
+    if (parent2 is MethodInvocation) {
+      MethodInvocation methodInvocation = parent2 as MethodInvocation;
+      if (methodInvocation.target != null && identical(methodInvocation.methodName, node)) {
+        return false;
+      }
+    }
+    if (parent2 is ConstructorName) {
+      ConstructorName constructorName = parent2 as ConstructorName;
+      if (identical(constructorName.name, node)) {
+        return false;
+      }
+    }
+    if (parent2 is Label) {
+      Label label = parent2 as Label;
+      if (identical(label.label, node)) {
+        return false;
+      }
+    }
+    String name2 = node.name;
+    if (!_namesForReferenceToDeclaredVariableInInitializer.contains(name2)) {
+      return false;
+    }
+    _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
@@ -8278,11 +12090,66 @@
    */
   bool checkForRethrowOutsideCatch(RethrowExpression node) {
     if (!_isInCatchClause) {
-      _errorReporter.reportError(CompileTimeErrorCode.RETHROW_OUTSIDE_CATCH, node, []);
+      _errorReporter.reportError2(CompileTimeErrorCode.RETHROW_OUTSIDE_CATCH, node, []);
       return true;
     }
     return false;
   }
+  
+  /**
+   * This checks that if the given "target" is the type reference then the "name" is not the
+   * reference to a instance member.
+   * @param target the target of the name access to evaluate
+   * @param name the accessed name to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#STATIC_ACCESS_TO_INSTANCE_MEMBER
+   */
+  bool checkForStaticAccessToInstanceMember(Expression target, SimpleIdentifier name2) {
+    Element element2 = name2.element;
+    if (element2 is! ExecutableElement) {
+      return false;
+    }
+    ExecutableElement memberElement = element2 as ExecutableElement;
+    if (memberElement.isStatic()) {
+      return false;
+    }
+    if (!isTypeReference(target)) {
+      return false;
+    }
+    _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.
+   * @param node the 'switch' statement to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#SWITCH_EXPRESSION_NOT_ASSIGNABLE
+   */
+  bool checkForSwitchExpressionNotAssignable(SwitchStatement node) {
+    Expression expression2 = node.expression;
+    Type2 expressionType = getStaticType(expression2);
+    if (expressionType == null) {
+      return false;
+    }
+    NodeList<SwitchMember> members2 = node.members;
+    for (SwitchMember switchMember in members2) {
+      if (switchMember is! SwitchCase) {
+        continue;
+      }
+      SwitchCase switchCase = switchMember as SwitchCase;
+      Expression caseExpression = switchCase.expression;
+      Type2 caseType = getStaticType(caseExpression);
+      if (expressionType.isAssignableTo(caseType)) {
+        return false;
+      }
+      _errorReporter.reportError2(StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE, expression2, [expressionType, caseType]);
+      return true;
+    }
+    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
@@ -8290,7 +12157,7 @@
    * @param node the instance creation expression to evaluate
    * @param typeName the {@link TypeName} of the {@link ConstructorName} from the{@link InstanceCreationExpression}, this is the AST node that the error is attached to
    * @param constructorElement the {@link ConstructorElement} from the instance creation expression
-   * @return return {@code true} if and only if an error code is generated on the passed node
+   * @return {@code true} if and only if an error code is generated on the passed node
    * @see StaticTypeWarningCode#TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
    */
   bool checkForTypeArgumentNotMatchingBounds(InstanceCreationExpression node, ConstructorElement constructorElement, TypeName typeName) {
@@ -8304,7 +12171,7 @@
         Type2 boundType = boundingElts[i].bound;
         if (argType != null && boundType != null) {
           if (!argType.isSubtypeOf(boundType)) {
-            _errorReporter.reportError(StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, argTypeName, [argTypeName.name, boundingElts[i].name]);
+            _errorReporter.reportError2(StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, argTypeName, [argTypeName.name, boundingElts[i].displayName]);
             return true;
           }
         }
@@ -8312,36 +12179,168 @@
     }
     return false;
   }
+  
   /**
-   * This verifies if the passed setter method declaration, has only one parameter.
-   * <p>
-   * This method assumes that the method declaration was tested to be a setter before being called.
-   * @param node the method declaration to evaluate
-   * @return return {@code true} if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER
+   * This checks that if the passed generative constructor has no explicit super constructor
+   * invocation, then super class has the default generative constructor.
+   * @param node the constructor declaration to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT
+   * @see CompileTimeErrorCode#NON_GENERATIVE_CONSTRUCTOR
    */
-  bool checkForWrongNumberOfParametersForSetter(MethodDeclaration node) {
+  bool checkForUndefinedConstructorInInitializerImplicit(ConstructorDeclaration node) {
+    if (node.factoryKeyword != null) {
+      return false;
+    }
+    if (_enclosingClass == null) {
+      return false;
+    }
+    InterfaceType superType = _enclosingClass.supertype;
+    if (superType == null) {
+      return false;
+    }
+    ClassElement superElement = superType.element;
+    for (ConstructorInitializer constructorInitializer in node.initializers) {
+      if (constructorInitializer is SuperConstructorInvocation) {
+        return false;
+      }
+    }
+    ConstructorElement superDefaultConstructor = superElement.unnamedConstructor;
+    if (superDefaultConstructor != null) {
+      if (superDefaultConstructor.isFactory()) {
+        _errorReporter.reportError2(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, node.returnType, [superDefaultConstructor]);
+        return true;
+      }
+      return false;
+    }
+    _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>
+   * This method assumes that the method declaration was tested to be an operator declaration before
+   * being called.
+   * @param node the method declaration to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR
+   */
+  bool checkForWrongNumberOfParametersForOperator(MethodDeclaration node) {
     FormalParameterList parameterList = node.parameters;
     if (parameterList == null) {
       return false;
     }
-    NodeList<FormalParameter> formalParameters = parameterList.parameters;
-    int numberOfParameters = formalParameters.length;
-    if (numberOfParameters != 1) {
-      _errorReporter.reportError(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER, node.name, [numberOfParameters]);
+    int numParameters = parameterList.parameters.length;
+    SimpleIdentifier nameNode = node.name;
+    if (nameNode == null) {
+      return false;
+    }
+    String name2 = nameNode.name;
+    int expected = -1;
+    if ("[]=" == name2) {
+      expected = 2;
+    } else if ("<" == name2 || ">" == name2 || "<=" == name2 || ">=" == name2 || "==" == name2 || "+" == name2 || "/" == name2 || "~/" == name2 || "*" == name2 || "%" == name2 || "|" == name2 || "^" == name2 || "&" == name2 || "<<" == name2 || ">>" == name2 || "[]" == name2) {
+      expected = 1;
+    } else if ("~" == name2) {
+      expected = 0;
+    }
+    if (expected != -1 && numParameters != expected) {
+      _errorReporter.reportError2(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR, nameNode, [name2, expected, numParameters]);
+      return true;
+    }
+    if ("-" == name2 && numParameters > 1) {
+      _errorReporter.reportError2(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS, nameNode, [numParameters]);
       return true;
     }
     return false;
   }
+  
   /**
-   * Return the 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 type of the given expression
+   * This verifies if the passed setter parameter list have only one parameter.
+   * <p>
+   * This method assumes that the method declaration was tested to be a setter before being called.
+   * @param setterName the name of the setter to report problems on
+   * @param parameterList the parameter list to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER
    */
-  Type2 getType(Expression expression) {
-    Type2 type = expression.staticType;
-    return type == null ? _dynamicType : type;
+  bool checkForWrongNumberOfParametersForSetter(SimpleIdentifier setterName, FormalParameterList parameterList) {
+    if (setterName == null) {
+      return false;
+    }
+    if (parameterList == null) {
+      return false;
+    }
+    int numberOfParameters = parameterList.parameters.length;
+    if (numberOfParameters != 1) {
+      _errorReporter.reportError2(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER, setterName, [numberOfParameters]);
+      return true;
+    }
+    return false;
   }
+  
+  /**
+   * Return the propagated type of the given expression, or the static type if there is no
+   * propagated type information.
+   * @param expression the expression whose type is to be returned
+   * @return the propagated or static type of the given expression, whichever is best
+   */
+  Type2 getBestType(Expression expression) {
+    Type2 type = getPropagatedType(expression);
+    if (type == null) {
+      type = getStaticType(expression);
+    }
+    return type;
+  }
+  
+  /**
+   * Returns the Type (return type) for a given getter.
+   * @param propertyAccessorElement
+   * @return The type of the given getter.
+   */
+  Type2 getGetterType(PropertyAccessorElement propertyAccessorElement) {
+    FunctionType functionType = propertyAccessorElement.type;
+    if (functionType != null) {
+      return functionType.returnType;
+    } else {
+      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
+   * @return The type of the given setter.
+   */
+  Type2 getSetterType(PropertyAccessorElement propertyAccessorElement) {
+    List<ParameterElement> setterParameters = propertyAccessorElement.parameters;
+    if (setterParameters.length == 0) {
+      return null;
+    }
+    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
+   * @return the static type of the given expression
+   */
+  Type2 getStaticType(Expression expression) {
+    Type2 type = expression.staticType;
+    if (type == null) {
+      return _dynamicType;
+    }
+    return type;
+  }
+  
   /**
    * Return the variable element represented by the given expression, or {@code null} if there is no
    * such element.
@@ -8357,7 +12356,51 @@
     }
     return null;
   }
+  
+  /**
+   * @return {@code true} if the given constructor redirects to itself, directly or indirectly
+   */
+  bool hasRedirectingFactoryConstructorCycle(ConstructorElement element) {
+    Set<ConstructorElement> constructors = new Set<ConstructorElement>();
+    ConstructorElement current = element;
+    while (current != null) {
+      if (constructors.contains(current)) {
+        return identical(current, element);
+      }
+      javaSetAdd(constructors, current);
+      current = current.redirectedConstructor;
+      if (current is ConstructorMember) {
+        current = ((current as ConstructorMember)).baseElement;
+      }
+    }
+    return false;
+  }
+  
+  /**
+   * @param node the 'this' expression to analyze
+   * @return {@code true} if the given 'this' expression is in the valid context
+   */
+  bool isThisInValidContext(ThisExpression node) {
+    for (ASTNode n = node; n != null; n = n.parent) {
+      if (n is CompilationUnit) {
+        return false;
+      }
+      if (n is ConstructorDeclaration) {
+        ConstructorDeclaration constructor = n as ConstructorDeclaration;
+        return constructor.factoryKeyword == null;
+      }
+      if (n is ConstructorFieldInitializer) {
+        return false;
+      }
+      if (n is MethodDeclaration) {
+        MethodDeclaration method = n as MethodDeclaration;
+        return !method.isStatic();
+      }
+    }
+    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
@@ -8370,14 +12413,18 @@
   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];
-  final String __name;
-  final int __ordinal;
-  int get ordinal => __ordinal;
-  INIT_STATE(this.__name, this.__ordinal) {
+  
+  /// 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) {
   }
-  int compareTo(INIT_STATE other) => __ordinal - other.__ordinal;
-  String toString() => __name;
+  int compareTo(INIT_STATE other) => ordinal - other.ordinal;
+  String toString() => name;
 }
+
 /**
  * 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
@@ -8390,30 +12437,35 @@
   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];
-  final String __name;
-  final int __ordinal;
-  int get ordinal => __ordinal;
+  
+  /// 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
    * @param message the message template used to create the message to be displayed for the error
    */
-  ResolverErrorCode(this.__name, this.__ordinal, ErrorType type, String message) {
+  ResolverErrorCode(this.name, this.ordinal, ErrorType type, String message) {
     this._type = type;
     this._message = message;
   }
   ErrorSeverity get errorSeverity => _type.severity;
   String get message => _message;
   ErrorType get type => _type;
-  bool needsRecompilation() => true;
-  int compareTo(ResolverErrorCode other) => __ordinal - other.__ordinal;
-  String toString() => __name;
-}
+  int compareTo(ResolverErrorCode other) => ordinal - other.ordinal;
+  String toString() => name;
+}
\ No newline at end of file
diff --git a/pkg/analyzer_experimental/lib/src/generated/scanner.dart b/pkg/analyzer_experimental/lib/src/generated/scanner.dart
index 205e54d..954e066 100644
--- a/pkg/analyzer_experimental/lib/src/generated/scanner.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/scanner.dart
@@ -10,20 +10,24 @@
 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.
@@ -70,6 +74,7 @@
       return new KeywordState(result, null);
     }
   }
+  
   /**
    * Create the initial state in the state machine.
    * @return the state that was created
@@ -83,16 +88,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.
@@ -103,12 +111,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
@@ -116,6 +126,7 @@
    */
   KeywordState next(int c) => _table[c - 0x61];
 }
+
 /**
  * The enumeration {@code ScannerErrorCode} defines the error codes used for errors detected by the
  * scanner.
@@ -129,37 +140,44 @@
   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];
-  final String __name;
-  final int __ordinal;
-  int get ordinal => __ordinal;
+  
+  /// 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
    */
-  ScannerErrorCode(this.__name, this.__ordinal, String message) {
+  ScannerErrorCode(this.name, this.ordinal, String message) {
     this._message = message;
   }
   ErrorSeverity get errorSeverity => ErrorSeverity.ERROR;
   String get message => _message;
   ErrorType get type => ErrorType.SYNTACTIC_ERROR;
-  bool needsRecompilation() => true;
-  int compareTo(ScannerErrorCode other) => __ordinal - other.__ordinal;
-  String toString() => __name;
+  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.
@@ -172,6 +190,7 @@
   }
   Token get precedingComments => _precedingComment;
 }
+
 /**
  * The enumeration {@code Keyword} defines the keywords in the Dart programming language.
  * @coverage dart.engine.parser
@@ -226,22 +245,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];
-  String __name;
-  int __ordinal = 0;
-  int get ordinal => __ordinal;
+  
+  /// 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
@@ -253,46 +279,49 @@
     }
     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(String ___name, int ___ordinal, String syntax) {
-    _jtd_constructor_309_impl(___name, ___ordinal, syntax);
+  Keyword.con1(this.name, this.ordinal, String syntax) {
+    _jtd_constructor_316_impl(syntax);
   }
-  _jtd_constructor_309_impl(String ___name, int ___ordinal, String syntax) {
-    _jtd_constructor_310_impl(___name, ___ordinal, syntax, false);
+  _jtd_constructor_316_impl(String syntax) {
+    _jtd_constructor_317_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}.
    * @param syntax the lexeme for the keyword
    * @param isPseudoKeyword {@code true} if this keyword is a pseudo-keyword
    */
-  Keyword.con2(String ___name, int ___ordinal, String syntax2, bool isPseudoKeyword) {
-    _jtd_constructor_310_impl(___name, ___ordinal, syntax2, isPseudoKeyword);
+  Keyword.con2(this.name, this.ordinal, String syntax2, bool isPseudoKeyword) {
+    _jtd_constructor_317_impl(syntax2, isPseudoKeyword);
   }
-  _jtd_constructor_310_impl(String ___name, int ___ordinal, String syntax2, bool isPseudoKeyword) {
-    __name = ___name;
-    __ordinal = ___ordinal;
+  _jtd_constructor_317_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.
    * @return {@code true} if this keyword is a pseudo-keyword
    */
   bool isPseudoKeyword() => _isPseudoKeyword2;
-  int compareTo(Keyword other) => __ordinal - other.__ordinal;
-  String toString() => __name;
+  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.
@@ -305,51 +334,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
@@ -364,11 +405,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
@@ -376,11 +419,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
@@ -401,11 +446,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.
@@ -416,11 +463,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.
    */
@@ -539,8 +588,9 @@
       recordStartOfLine();
       return next;
     } else if (next == 0xA) {
+      next = advance();
       recordStartOfLine();
-      return advance();
+      return next;
     } else if (next == 0x9 || next == 0x20) {
       return advance();
     }
@@ -674,6 +724,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
@@ -694,11 +745,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
@@ -717,7 +770,7 @@
       return next;
     }
   }
-  int select2(int choice, TokenType yesType, TokenType noType, int offset) {
+  int select4(int choice, TokenType yesType, TokenType noType, int offset) {
     int next = advance();
     if (next == choice) {
       appendToken2(yesType, offset);
@@ -824,7 +877,7 @@
     if (!hasDigit) {
       appendStringToken(TokenType.INT, getString(start, -2));
       if (0x2E == next) {
-        return select2(0x2E, TokenType.PERIOD_PERIOD_PERIOD, TokenType.PERIOD_PERIOD, offset - 1);
+        return select4(0x2E, TokenType.PERIOD_PERIOD_PERIOD, TokenType.PERIOD_PERIOD, offset - 1);
       }
       appendToken2(TokenType.PERIOD, offset - 1);
       return bigSwitch(next);
@@ -922,8 +975,10 @@
   }
   int tokenizeInterpolatedIdentifier(int next, int start) {
     appendStringToken2(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 0);
-    beginToken();
-    next = tokenizeKeywordOrIdentifier(next, false);
+    if (((0x41 <= next && next <= 0x5A) || (0x61 <= next && next <= 0x7A) || next == 0x5F)) {
+      beginToken();
+      next = tokenizeKeywordOrIdentifier(next, false);
+    }
     beginToken();
     return next;
   }
@@ -1222,16 +1277,19 @@
     }
   }
 }
+
 /**
  * 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
@@ -1244,24 +1302,29 @@
   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
@@ -1288,16 +1351,19 @@
     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.
@@ -1310,28 +1376,34 @@
   }
   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
@@ -1341,6 +1413,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.
@@ -1348,26 +1421,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
@@ -1375,21 +1453,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
@@ -1397,11 +1479,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.
@@ -1413,6 +1497,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.
@@ -1423,6 +1508,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.
@@ -1432,12 +1518,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
@@ -1446,28 +1534,34 @@
     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
@@ -1481,6 +1575,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.
@@ -1519,16 +1614,19 @@
     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.
@@ -1541,15 +1639,18 @@
   }
   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
@@ -1558,6 +1659,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
@@ -1566,16 +1668,19 @@
   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
@@ -1584,11 +1689,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
@@ -1597,117 +1704,140 @@
     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];
-  String __name;
-  int __ordinal = 0;
-  int get ordinal => __ordinal;
+  
+  /// 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(String ___name, int ___ordinal) {
-    _jtd_constructor_319_impl(___name, ___ordinal);
+  TokenClass.con1(this.name, this.ordinal) {
+    _jtd_constructor_326_impl();
   }
-  _jtd_constructor_319_impl(String ___name, int ___ordinal) {
-    _jtd_constructor_320_impl(___name, ___ordinal, 0);
+  _jtd_constructor_326_impl() {
+    _jtd_constructor_327_impl(0);
   }
-  TokenClass.con2(String ___name, int ___ordinal, int precedence2) {
-    _jtd_constructor_320_impl(___name, ___ordinal, precedence2);
+  TokenClass.con2(this.name, this.ordinal, int precedence2) {
+    _jtd_constructor_327_impl(precedence2);
   }
-  _jtd_constructor_320_impl(String ___name, int ___ordinal, int precedence2) {
-    __name = ___name;
-    __ordinal = ___ordinal;
+  _jtd_constructor_327_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.
    * @return the precedence of tokens of this class
    */
   int get precedence => _precedence;
-  int compareTo(TokenClass other) => __ordinal - other.__ordinal;
-  String toString() => __name;
+  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.
@@ -1720,12 +1850,14 @@
   }
   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.
    */
@@ -1798,54 +1930,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];
-  String __name;
-  int __ordinal = 0;
-  int get ordinal => __ordinal;
+  
+  /// 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(String ___name, int ___ordinal) {
-    _jtd_constructor_321_impl(___name, ___ordinal);
+  TokenType.con1(this.name, this.ordinal) {
+    _jtd_constructor_328_impl();
   }
-  _jtd_constructor_321_impl(String ___name, int ___ordinal) {
-    _jtd_constructor_322_impl(___name, ___ordinal, TokenClass.NO_CLASS, null);
+  _jtd_constructor_328_impl() {
+    _jtd_constructor_329_impl(TokenClass.NO_CLASS, null);
   }
-  TokenType.con2(String ___name, int ___ordinal, TokenClass tokenClass2, String lexeme2) {
-    _jtd_constructor_322_impl(___name, ___ordinal, tokenClass2, lexeme2);
+  TokenType.con2(this.name, this.ordinal, TokenClass tokenClass2, String lexeme2) {
+    _jtd_constructor_329_impl(tokenClass2, lexeme2);
   }
-  _jtd_constructor_322_impl(String ___name, int ___ordinal, TokenClass tokenClass2, String lexeme2) {
-    __name = ___name;
-    __ordinal = ___ordinal;
+  _jtd_constructor_329_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
@@ -1857,55 +1997,64 @@
    * @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
    */
   bool isUserDefinableOperator() => identical(_lexeme, "==") || identical(_lexeme, "~") || identical(_lexeme, "[]") || identical(_lexeme, "[]=") || identical(_lexeme, "*") || identical(_lexeme, "/") || identical(_lexeme, "%") || identical(_lexeme, "~/") || identical(_lexeme, "+") || identical(_lexeme, "-") || identical(_lexeme, "<<") || identical(_lexeme, ">>") || identical(_lexeme, ">=") || identical(_lexeme, ">") || identical(_lexeme, "<=") || identical(_lexeme, "<") || identical(_lexeme, "&") || identical(_lexeme, "^") || identical(_lexeme, "|");
-  int compareTo(TokenType other) => __ordinal - other.__ordinal;
-  String toString() => __name;
+  int compareTo(TokenType other) => ordinal - other.ordinal;
+  String toString() => name;
 }
 class TokenType_EOF extends TokenType {
-  TokenType_EOF(String ___name, int ___ordinal, TokenClass arg0, String arg1) : super.con2(___name, ___ordinal, arg0, arg1);
+  TokenType_EOF(String name, int ordinal, TokenClass arg0, String arg1) : super.con2(name, ordinal, arg0, arg1);
   String toString() => "-eof-";
 }
\ No newline at end of file
diff --git a/pkg/analyzer_experimental/lib/src/generated/sdk.dart b/pkg/analyzer_experimental/lib/src/generated/sdk.dart
index 9825059..f988973 100644
--- a/pkg/analyzer_experimental/lib/src/generated/sdk.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/sdk.dart
@@ -8,93 +8,118 @@
 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
@@ -108,15 +133,19 @@
   bool isDart2JsLibrary() => (_platforms & DART2JS_PLATFORM) != 0;
   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
@@ -124,12 +153,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
@@ -137,6 +168,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
@@ -144,6 +176,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
@@ -151,6 +184,7 @@
   void set path(String path2) {
     this._path = path2;
   }
+  
   /**
    * Record that this library can be run on the VM.
    */
@@ -158,36 +192,37 @@
     _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>();
-  /**
-   * Initialize a newly created library map to be empty.
-   */
-  LibraryMap() : super() {
-  }
+  
   /**
    * 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
@@ -196,25 +231,35 @@
   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";
+  
   /**
    * The short name of the dart SDK html library.
    */
   static 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";
+  
   /**
    * Return the source representing the file with the given URI.
    * @param contentCache the content cache used to access the contents of the mapped source
@@ -224,27 +269,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 47abce7..afba118 100644
--- a/pkg/analyzer_experimental/lib/src/generated/sdk_io.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/sdk_io.dart
@@ -16,103 +16,122 @@
 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 version number that is returned when the real version number could not be determined.
-   */
-  static String _DEFAULT_VERSION = "0";
+  
   /**
    * 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).
@@ -125,6 +144,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
@@ -146,6 +166,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
@@ -165,6 +186,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
@@ -180,22 +202,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.
@@ -215,12 +241,15 @@
     }
     return null;
   }
+  
   /**
    * Return the directory within the SDK directory that contains the libraries.
    * @return the directory that contains the libraries
    */
   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.
@@ -229,7 +258,7 @@
   String get sdkVersion {
     {
       if (_sdkVersion == null) {
-        _sdkVersion = _DEFAULT_VERSION;
+        _sdkVersion = DartSdk.DEFAULT_VERSION;
         JavaFile revisionFile = new JavaFile.relative(_sdkDirectory, _REVISION_FILE_NAME);
         try {
           String revision = revisionFile.readAsStringSync();
@@ -242,11 +271,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
@@ -262,29 +293,33 @@
     }
     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
    */
   bool isDartiumInstalled() => dartiumExecutable != null;
   Source mapDartUri(ContentCache contentCache, String dartUri) {
-    SdkLibrary library = _libraryMap.getLibrary(dartUri);
+    SdkLibrary library = getSdkLibrary(dartUri);
     if (library == null) {
       return null;
     }
     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
@@ -296,6 +331,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
@@ -309,6 +345,7 @@
       return _DARTIUM_EXECUTABLE_NAME_LINUX;
     }
   }
+  
   /**
    * Read all of the configuration files to initialize the library maps.
    */
@@ -322,6 +359,7 @@
       _libraryMap = new LibraryMap();
     }
   }
+  
   /**
    * Initialize the state of the SDK.
    */
@@ -331,6 +369,7 @@
     }
   }
 }
+
 /**
  * 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
@@ -354,13 +393,14 @@
  * @coverage dart.engine.sdk
  */
 class SdkLibrariesReader {
+  
   /**
    * Return the library map read from the given source.
    * @return the library map read from the given source
    */
   LibraryMap readFrom(JavaFile librariesFile, String libraryFileContents) {
     List<bool> foundError = [false];
-    AnalysisErrorListener errorListener = new AnalysisErrorListener_10(foundError);
+    AnalysisErrorListener errorListener = new AnalysisErrorListener_9(foundError);
     Source source = new FileBasedSource.con2(null, librariesFile, UriKind.FILE_URI);
     StringScanner scanner = new StringScanner(source, libraryFileContents, errorListener);
     Parser parser = new Parser(source, errorListener);
@@ -373,39 +413,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.
@@ -451,9 +499,9 @@
     return null;
   }
 }
-class AnalysisErrorListener_10 implements AnalysisErrorListener {
+class AnalysisErrorListener_9 implements AnalysisErrorListener {
   List<bool> foundError;
-  AnalysisErrorListener_10(this.foundError);
+  AnalysisErrorListener_9(this.foundError);
   void onError(AnalysisError error) {
     foundError[0] = true;
   }
diff --git a/pkg/analyzer_experimental/lib/src/generated/source.dart b/pkg/analyzer_experimental/lib/src/generated/source.dart
index 1be6594..456b0e8 100644
--- a/pkg/analyzer_experimental/lib/src/generated/source.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/source.dart
@@ -7,45 +7,52 @@
 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_333_impl(contentCache2, resolvers2);
+    _jtd_constructor_340_impl(contentCache2, resolvers2);
   }
-  _jtd_constructor_333_impl(ContentCache contentCache2, List<UriResolver> resolvers2) {
+  _jtd_constructor_340_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_334_impl(resolvers);
+    _jtd_constructor_341_impl(resolvers);
   }
-  _jtd_constructor_334_impl(List<UriResolver> resolvers) {
-    _jtd_constructor_333_impl(new ContentCache(), resolvers);
+  _jtd_constructor_341_impl(List<UriResolver> resolvers) {
+    _jtd_constructor_340_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.
@@ -54,7 +61,7 @@
    */
   Source forUri(String absoluteUri) {
     try {
-      Uri uri = Uri.parse(absoluteUri);
+      Uri uri = parseUriWithException(absoluteUri);
       if (uri.isAbsolute) {
         return resolveUri2(null, uri);
       }
@@ -62,6 +69,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
@@ -78,7 +86,7 @@
       throw new IllegalArgumentException("Invalid source kind in encoding: ${kind}");
     }
     try {
-      Uri uri = Uri.parse(encoding.substring(1));
+      Uri uri = parseUriWithException(encoding.substring(1));
       for (UriResolver resolver in _resolvers) {
         Source result = resolver.fromEncoding(_contentCache, kind, uri);
         if (result != null) {
@@ -90,16 +98,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.
@@ -115,6 +126,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
@@ -125,11 +137,27 @@
    */
   Source resolveUri(Source containingSource, String containedUri) {
     try {
-      return resolveUri2(containingSource, Uri.parse(containedUri));
+      return resolveUri2(containingSource, parseUriWithException(containedUri));
     } on URISyntaxException catch (exception) {
       return null;
     }
   }
+  
+  /**
+   * Return an absolute URI that represents the given source.
+   * @param source the source to get URI for
+   * @return the absolute URI representing the given source, may be {@code null}
+   */
+  Uri restoreUri(Source source) {
+    for (UriResolver resolver in _resolvers) {
+      Uri uri = resolver.restoreAbsolute(source);
+      if (uri != null) {
+        return uri;
+      }
+    }
+    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
@@ -140,6 +168,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>
@@ -150,6 +179,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.
@@ -159,6 +189,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.
@@ -168,6 +199,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
@@ -190,6 +222,7 @@
     }
   }
 }
+
 /**
  * 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
@@ -197,11 +230,7 @@
  * @coverage dart.engine.source
  */
 abstract class UriResolver {
-  /**
-   * Initialize a newly created resolver.
-   */
-  UriResolver() : super() {
-  }
+  
   /**
    * 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
@@ -213,6 +242,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.
@@ -221,17 +251,27 @@
    * @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
+   * @return the absolute URI representing the given source, may be {@code null}
+   */
+  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);
+  
   /**
    * Return {@code true} if the given object is a source that represents the same source code as
    * this source.
@@ -241,11 +281,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
@@ -255,6 +297,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.
@@ -262,6 +305,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
@@ -269,6 +313,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
@@ -278,12 +323,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
@@ -292,17 +339,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.
@@ -317,17 +367,20 @@
    */
   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
@@ -335,25 +388,30 @@
    */
   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
@@ -361,47 +419,60 @@
    */
   static final SourceKind UNKNOWN = new SourceKind('UNKNOWN', 3);
   static final List<SourceKind> values = [HTML, LIBRARY, PART, UNKNOWN];
-  final String __name;
-  final int __ordinal;
-  int get ordinal => __ordinal;
-  SourceKind(this.__name, this.__ordinal) {
+  
+  /// 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) {
   }
-  int compareTo(SourceKind other) => __ordinal - other.__ordinal;
-  String toString() => __name;
+  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];
-  final String __name;
-  final int __ordinal;
-  int get ordinal => __ordinal;
+  
+  /// 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.
    */
-  UriKind(this.__name, this.__ordinal, int encoding) {
+  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.
@@ -421,29 +492,34 @@
     }
     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
    */
   int get encoding => _encoding;
-  int compareTo(UriKind other) => __ordinal - other.__ordinal;
-  String toString() => __name;
+  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
@@ -453,22 +529,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>.
    */
@@ -483,15 +564,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.
@@ -499,10 +583,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.
@@ -510,7 +596,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.
    */
@@ -526,6 +618,7 @@
     }
     return true;
   }
+  
   /**
    * @return {@code true} if this {@link SourceRange} starts in <code>otherRange</code>.
    */
@@ -540,6 +633,7 @@
     return builder.toString();
   }
 }
+
 /**
  * The interface {@code SourceContainer} is used by clients to define a collection of sources
  * <p>
@@ -550,6 +644,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
@@ -557,25 +652,30 @@
    */
   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) => uri.scheme == _DART_SCHEME;
+  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.
@@ -590,6 +690,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.
@@ -602,16 +703,19 @@
     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.
@@ -625,6 +729,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
@@ -640,19 +745,23 @@
     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.
@@ -663,37 +772,38 @@
     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>();
-  /**
-   * Initialize a newly created cache to be empty.
-   */
-  ContentCache() : super() {
-  }
+  
   /**
    * Return the contents of the given source, or {@code null} if this cache does not override the
    * contents of the source.
@@ -703,6 +813,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.
@@ -712,6 +823,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
@@ -728,4 +840,4 @@
       _stampMap[source] = JavaSystem.currentTimeMillis();
     }
   }
-}
+}
\ No newline at end of file
diff --git a/pkg/analyzer_experimental/lib/src/generated/source_io.dart b/pkg/analyzer_experimental/lib/src/generated/source_io.dart
index 5d5a49f..7b7f4b0 100644
--- a/pkg/analyzer_experimental/lib/src/generated/source_io.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/source_io.dart
@@ -11,28 +11,34 @@
 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.
@@ -40,11 +46,12 @@
    * @param file the file represented by this source
    */
   FileBasedSource.con1(ContentCache contentCache, JavaFile file) {
-    _jtd_constructor_329_impl(contentCache, file);
+    _jtd_constructor_336_impl(contentCache, file);
   }
-  _jtd_constructor_329_impl(ContentCache contentCache, JavaFile file) {
-    _jtd_constructor_330_impl(contentCache, file, UriKind.FILE_URI);
+  _jtd_constructor_336_impl(ContentCache contentCache, JavaFile file) {
+    _jtd_constructor_337_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
@@ -52,9 +59,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_330_impl(contentCache2, file2, uriKind2);
+    _jtd_constructor_337_impl(contentCache2, file2, uriKind2);
   }
-  _jtd_constructor_330_impl(ContentCache contentCache2, JavaFile file2, UriKind uriKind2) {
+  _jtd_constructor_337_impl(ContentCache contentCache2, JavaFile file2, UriKind uriKind2) {
     this._contentCache = contentCache2;
     this._file = file2;
     this._uriKind = uriKind2;
@@ -99,6 +106,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}.
@@ -106,6 +114,7 @@
    */
   JavaFile get file => _file;
 }
+
 /**
  * Instances of the class {@code PackageUriResolver} resolve {@code package} URI's in the context of
  * an application.
@@ -116,20 +125,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";
+  
+  /**
+   * 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) => uri.scheme == _PACKAGE_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.
@@ -179,6 +197,28 @@
     }
     return new FileBasedSource.con2(contentCache, getCanonicalFile(_packagesDirectories[0], pkgName, relPath), UriKind.PACKAGE_URI);
   }
+  Uri restoreAbsolute(Source source) {
+    if (source is FileBasedSource) {
+      String sourcePath = ((source as FileBasedSource)).file.getPath();
+      for (JavaFile packagesDirectory in _packagesDirectories) {
+        List<JavaFile> pkgFolders = packagesDirectory.listFiles();
+        if (pkgFolders != null) {
+          for (JavaFile pkgFolder in pkgFolders) {
+            try {
+              String pkgCanonicalPath = pkgFolder.getCanonicalPath();
+              if (sourcePath.startsWith(pkgCanonicalPath)) {
+                String relPath = sourcePath.substring(pkgCanonicalPath.length);
+                return parseUriWithException("${_PACKAGE_SCHEME}:${pkgFolder.getName()}${relPath}");
+              }
+            } catch (e) {
+            }
+          }
+        }
+      }
+    }
+    return null;
+  }
+  
   /**
    * Answer the canonical file for the specified package.
    * @param packagesDirectory the "packages" directory (not {@code null})
@@ -192,17 +232,24 @@
     try {
       pkgDir = pkgDir.getCanonicalFile();
     } on IOException catch (e) {
-      AnalysisEngine.instance.logger.logError2("Canonical failed: ${pkgDir}", e);
+      if (!e.toString().contains("Required key not available")) {
+        AnalysisEngine.instance.logger.logError2("Canonical failed: ${pkgDir}", e);
+      } else if (_CanLogRequiredKeyIoException) {
+        _CanLogRequiredKeyIoException = false;
+        AnalysisEngine.instance.logger.logError2("Canonical failed: ${pkgDir}", e);
+      }
     }
     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.
@@ -215,33 +262,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_327_impl(directory);
+    _jtd_constructor_334_impl(directory);
   }
-  _jtd_constructor_327_impl(JavaFile directory) {
-    _jtd_constructor_328_impl(directory.getPath());
+  _jtd_constructor_334_impl(JavaFile directory) {
+    _jtd_constructor_335_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_328_impl(path2);
+    _jtd_constructor_335_impl(path2);
   }
-  _jtd_constructor_328_impl(String path2) {
+  _jtd_constructor_335_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)
@@ -250,27 +301,24 @@
   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";
+  
   /**
    * 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;
-  /**
-   * Initialize a newly created resolver to resolve {@code file} URI's relative to the given root
-   * directory.
-   */
-  FileUriResolver() : super() {
-  }
   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 a2ff948..af701a1 100644
--- a/pkg/analyzer_experimental/lib/src/generated/utilities_dart.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/utilities_dart.dart
@@ -4,6 +4,7 @@
 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
@@ -15,25 +16,31 @@
   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];
-  final String __name;
-  final int __ordinal;
-  int get ordinal => __ordinal;
+  
+  /// 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
    */
-  ParameterKind(this.__name, this.__ordinal, bool isOptional) {
+  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
    */
   bool isOptional() => _isOptional2;
-  int compareTo(ParameterKind other) => __ordinal - other.__ordinal;
-  String toString() => __name;
+  int compareTo(ParameterKind other) => ordinal - other.ordinal;
+  String toString() => name;
 }
\ No newline at end of file
diff --git a/pkg/analyzer_experimental/test/generated/ast_test.dart b/pkg/analyzer_experimental/test/generated/ast_test.dart
index 7a8031d..b7c4697 100644
--- a/pkg/analyzer_experimental/test/generated/ast_test.dart
+++ b/pkg/analyzer_experimental/test/generated/ast_test.dart
@@ -185,6 +185,7 @@
     });
   }
 }
+
 /**
  * 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
@@ -372,6 +373,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.
@@ -416,11 +418,6 @@
   static VariableDeclarationStatement variableDeclarationStatement2(Keyword keyword, List<VariableDeclaration> variables) => variableDeclarationStatement(keyword, null, variables);
   static WhileStatement whileStatement(Expression condition, Statement body) => new WhileStatement.full(TokenFactory.token(Keyword.WHILE), TokenFactory.token3(TokenType.OPEN_PAREN), condition, TokenFactory.token3(TokenType.CLOSE_PAREN), body);
   static WithClause withClause(List<TypeName> types) => new WithClause.full(TokenFactory.token(Keyword.WITH), list(types));
-  /**
-   * Prevent the creation of instances of this class.
-   */
-  ASTFactory() {
-  }
 }
 class SimpleIdentifierTest extends ParserTestCase {
   void test_inDeclarationContext_argumentDefinition() {
@@ -569,6 +566,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
@@ -676,13 +674,16 @@
   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];
-  final String __name;
-  final int __ordinal;
-  int get ordinal => __ordinal;
-  AssignmentKind(this.__name, this.__ordinal) {
+  
+  /// 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) {
   }
-  int compareTo(AssignmentKind other) => __ordinal - other.__ordinal;
-  String toString() => __name;
+  int compareTo(AssignmentKind other) => ordinal - other.ordinal;
+  String toString() => name;
 }
 class WrapperKind implements Comparable<WrapperKind> {
   static final WrapperKind PREFIXED_LEFT = new WrapperKind('PREFIXED_LEFT', 0);
@@ -691,13 +692,47 @@
   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];
-  final String __name;
-  final int __ordinal;
-  int get ordinal => __ordinal;
-  WrapperKind(this.__name, this.__ordinal) {
+  
+  /// 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) {
   }
-  int compareTo(WrapperKind other) => __ordinal - other.__ordinal;
-  String toString() => __name;
+  int compareTo(WrapperKind other) => ordinal - other.ordinal;
+  String toString() => name;
+}
+class BreadthFirstVisitorTest extends ParserTestCase {
+  void testIt() {
+    String source = EngineTestCase.createSource(["class A {", "  bool get g => true;", "}", "class B {", "  int f() {", "    num q() {", "      return 3;", "    }", "  return q() + 4;", "  }", "}", "A f(var p) {", "  if ((p as A).g) {", "    return p;", "  } else {", "    return null;", "  }", "}"]);
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(source, []);
+    List<ASTNode> nodes = new List<ASTNode>();
+    BreadthFirstVisitor<Object> visitor = new BreadthFirstVisitor_15(nodes);
+    visitor.visitAllNodes(unit);
+    EngineTestCase.assertSize(59, nodes);
+    EngineTestCase.assertInstanceOf(CompilationUnit, nodes[0]);
+    EngineTestCase.assertInstanceOf(ClassDeclaration, nodes[2]);
+    EngineTestCase.assertInstanceOf(FunctionDeclaration, nodes[3]);
+    EngineTestCase.assertInstanceOf(FunctionDeclarationStatement, nodes[27]);
+    EngineTestCase.assertInstanceOf(IntegerLiteral, nodes[58]);
+  }
+  static dartSuite() {
+    _ut.group('BreadthFirstVisitorTest', () {
+      _ut.test('testIt', () {
+        final __test = new BreadthFirstVisitorTest();
+        runJUnitTest(__test, __test.testIt);
+      });
+    });
+  }
+}
+class BreadthFirstVisitor_15 extends BreadthFirstVisitor<Object> {
+  List<ASTNode> nodes;
+  BreadthFirstVisitor_15(this.nodes) : super();
+  Object visitNode(ASTNode node) {
+    nodes.add(node);
+    return super.visitNode(node);
+  }
 }
 class ConstantEvaluatorTest extends ParserTestCase {
   void fail_constructor() {
@@ -1886,6 +1921,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.
@@ -2875,6 +2911,7 @@
   ConstantEvaluatorTest.dartSuite();
   NodeLocatorTest.dartSuite();
   ToSourceVisitorTest.dartSuite();
+  BreadthFirstVisitorTest.dartSuite();
   IndexExpressionTest.dartSuite();
   SimpleIdentifierTest.dartSuite();
 }
\ No newline at end of file
diff --git a/pkg/analyzer_experimental/test/generated/element_test.dart b/pkg/analyzer_experimental/test/generated/element_test.dart
index c13d1dc..2dc5be5 100644
--- a/pkg/analyzer_experimental/test/generated/element_test.dart
+++ b/pkg/analyzer_experimental/test/generated/element_test.dart
@@ -173,6 +173,7 @@
   }
 }
 class InterfaceTypeImplTest extends EngineTestCase {
+  
   /**
    * The type provider used to access the types.
    */
@@ -208,6 +209,12 @@
     InterfaceType object = classA.supertype;
     JUnitTestCase.assertEquals(0, InterfaceTypeImpl.computeLongestInheritancePathToObject(object));
   }
+  void test_computeLongestInheritancePathToObject_recursion() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    classA.supertype = classB.type;
+    JUnitTestCase.assertEquals(2, InterfaceTypeImpl.computeLongestInheritancePathToObject(classA.type));
+  }
   void test_computeLongestInheritancePathToObject_singleInterfacePath() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
@@ -237,19 +244,17 @@
     classD.interfaces = <InterfaceType> [classC.type];
     classE.interfaces = <InterfaceType> [classB.type, classD.type];
     Set<InterfaceType> superinterfacesOfD = InterfaceTypeImpl.computeSuperinterfaceSet(classD.type);
-    JUnitTestCase.assertNotNull(superinterfacesOfD);
+    EngineTestCase.assertSize3(3, superinterfacesOfD);
     JUnitTestCase.assertTrue(superinterfacesOfD.contains(ElementFactory.object.type));
     JUnitTestCase.assertTrue(superinterfacesOfD.contains(classA.type));
     JUnitTestCase.assertTrue(superinterfacesOfD.contains(classC.type));
-    JUnitTestCase.assertEquals(3, superinterfacesOfD.length);
     Set<InterfaceType> superinterfacesOfE = InterfaceTypeImpl.computeSuperinterfaceSet(classE.type);
-    JUnitTestCase.assertNotNull(superinterfacesOfE);
+    EngineTestCase.assertSize3(5, superinterfacesOfE);
     JUnitTestCase.assertTrue(superinterfacesOfE.contains(ElementFactory.object.type));
     JUnitTestCase.assertTrue(superinterfacesOfE.contains(classA.type));
     JUnitTestCase.assertTrue(superinterfacesOfE.contains(classB.type));
     JUnitTestCase.assertTrue(superinterfacesOfE.contains(classC.type));
     JUnitTestCase.assertTrue(superinterfacesOfE.contains(classD.type));
-    JUnitTestCase.assertEquals(5, superinterfacesOfE.length);
   }
   void test_computeSuperinterfaceSet_multipleSuperclassPaths() {
     ClassElement classA = ElementFactory.classElement2("A", []);
@@ -259,19 +264,24 @@
     ClassElementImpl classE = ElementFactory.classElement("E", classB.type, []);
     classE.interfaces = <InterfaceType> [classD.type];
     Set<InterfaceType> superinterfacesOfD = InterfaceTypeImpl.computeSuperinterfaceSet(classD.type);
-    JUnitTestCase.assertNotNull(superinterfacesOfD);
+    EngineTestCase.assertSize3(3, superinterfacesOfD);
     JUnitTestCase.assertTrue(superinterfacesOfD.contains(ElementFactory.object.type));
     JUnitTestCase.assertTrue(superinterfacesOfD.contains(classA.type));
     JUnitTestCase.assertTrue(superinterfacesOfD.contains(classC.type));
-    JUnitTestCase.assertEquals(3, superinterfacesOfD.length);
     Set<InterfaceType> superinterfacesOfE = InterfaceTypeImpl.computeSuperinterfaceSet(classE.type);
-    JUnitTestCase.assertNotNull(superinterfacesOfE);
+    EngineTestCase.assertSize3(5, superinterfacesOfE);
     JUnitTestCase.assertTrue(superinterfacesOfE.contains(ElementFactory.object.type));
     JUnitTestCase.assertTrue(superinterfacesOfE.contains(classA.type));
     JUnitTestCase.assertTrue(superinterfacesOfE.contains(classB.type));
     JUnitTestCase.assertTrue(superinterfacesOfE.contains(classC.type));
     JUnitTestCase.assertTrue(superinterfacesOfE.contains(classD.type));
-    JUnitTestCase.assertEquals(5, superinterfacesOfE.length);
+  }
+  void test_computeSuperinterfaceSet_recursion() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    classA.supertype = classB.type;
+    Set<InterfaceType> superinterfacesOfB = InterfaceTypeImpl.computeSuperinterfaceSet(classB.type);
+    EngineTestCase.assertSize3(2, superinterfacesOfB);
   }
   void test_computeSuperinterfaceSet_singleInterfacePath() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
@@ -280,40 +290,34 @@
     classB.interfaces = <InterfaceType> [classA.type];
     classC.interfaces = <InterfaceType> [classB.type];
     Set<InterfaceType> superinterfacesOfA = InterfaceTypeImpl.computeSuperinterfaceSet(classA.type);
-    JUnitTestCase.assertNotNull(superinterfacesOfA);
+    EngineTestCase.assertSize3(1, superinterfacesOfA);
     JUnitTestCase.assertTrue(superinterfacesOfA.contains(ElementFactory.object.type));
-    JUnitTestCase.assertEquals(1, superinterfacesOfA.length);
     Set<InterfaceType> superinterfacesOfB = InterfaceTypeImpl.computeSuperinterfaceSet(classB.type);
-    JUnitTestCase.assertNotNull(superinterfacesOfB);
+    EngineTestCase.assertSize3(2, superinterfacesOfB);
     JUnitTestCase.assertTrue(superinterfacesOfB.contains(ElementFactory.object.type));
     JUnitTestCase.assertTrue(superinterfacesOfB.contains(classA.type));
-    JUnitTestCase.assertEquals(2, superinterfacesOfB.length);
     Set<InterfaceType> superinterfacesOfC = InterfaceTypeImpl.computeSuperinterfaceSet(classC.type);
-    JUnitTestCase.assertNotNull(superinterfacesOfC);
+    EngineTestCase.assertSize3(3, superinterfacesOfC);
     JUnitTestCase.assertTrue(superinterfacesOfC.contains(ElementFactory.object.type));
     JUnitTestCase.assertTrue(superinterfacesOfC.contains(classA.type));
     JUnitTestCase.assertTrue(superinterfacesOfC.contains(classB.type));
-    JUnitTestCase.assertEquals(3, superinterfacesOfC.length);
   }
   void test_computeSuperinterfaceSet_singleSuperclassPath() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
     ClassElement classC = ElementFactory.classElement("C", classB.type, []);
     Set<InterfaceType> superinterfacesOfA = InterfaceTypeImpl.computeSuperinterfaceSet(classA.type);
-    JUnitTestCase.assertNotNull(superinterfacesOfA);
+    EngineTestCase.assertSize3(1, superinterfacesOfA);
     JUnitTestCase.assertTrue(superinterfacesOfA.contains(ElementFactory.object.type));
-    JUnitTestCase.assertEquals(1, superinterfacesOfA.length);
     Set<InterfaceType> superinterfacesOfB = InterfaceTypeImpl.computeSuperinterfaceSet(classB.type);
-    JUnitTestCase.assertNotNull(superinterfacesOfB);
+    EngineTestCase.assertSize3(2, superinterfacesOfB);
     JUnitTestCase.assertTrue(superinterfacesOfB.contains(ElementFactory.object.type));
     JUnitTestCase.assertTrue(superinterfacesOfB.contains(classA.type));
-    JUnitTestCase.assertEquals(2, superinterfacesOfB.length);
     Set<InterfaceType> superinterfacesOfC = InterfaceTypeImpl.computeSuperinterfaceSet(classC.type);
-    JUnitTestCase.assertNotNull(superinterfacesOfC);
+    EngineTestCase.assertSize3(3, superinterfacesOfC);
     JUnitTestCase.assertTrue(superinterfacesOfC.contains(ElementFactory.object.type));
     JUnitTestCase.assertTrue(superinterfacesOfC.contains(classA.type));
     JUnitTestCase.assertTrue(superinterfacesOfC.contains(classB.type));
-    JUnitTestCase.assertEquals(3, superinterfacesOfC.length);
   }
   void test_creation() {
     JUnitTestCase.assertNotNull(new InterfaceTypeImpl.con1(ElementFactory.classElement2("A", [])));
@@ -545,13 +549,18 @@
     JUnitTestCase.assertEquals(typeA, typeB.getLeastUpperBound(typeC));
     JUnitTestCase.assertEquals(typeA, typeC.getLeastUpperBound(typeB));
   }
+  void test_getLeastUpperBound_twoComparables() {
+    InterfaceType string = _typeProvider.stringType;
+    InterfaceType num = _typeProvider.numType;
+    JUnitTestCase.assertEquals(_typeProvider.objectType, string.getLeastUpperBound(num));
+  }
   void test_getLeastUpperBound_typeParameters_different() {
     InterfaceType listType2 = _typeProvider.listType;
     InterfaceType intType2 = _typeProvider.intType;
     InterfaceType doubleType2 = _typeProvider.doubleType;
     InterfaceType listOfIntType = listType2.substitute5(<Type2> [intType2]);
     InterfaceType listOfDoubleType = listType2.substitute5(<Type2> [doubleType2]);
-    JUnitTestCase.assertEquals(listType2.substitute5(<Type2> [_typeProvider.numType]), listOfIntType.getLeastUpperBound(listOfDoubleType));
+    JUnitTestCase.assertEquals(listType2.substitute5(<Type2> [_typeProvider.dynamicType]), listOfIntType.getLeastUpperBound(listOfDoubleType));
   }
   void test_getLeastUpperBound_typeParameters_same() {
     InterfaceType listType2 = _typeProvider.listType;
@@ -733,7 +742,38 @@
     InterfaceType type2 = ElementFactory.classElement2("A", []).type;
     JUnitTestCase.assertTrue(type2.isMoreSpecificThan(DynamicTypeImpl.instance));
   }
-  void test_isMoreSpecificThan_indirectSupertype() {
+  void test_isMoreSpecificThan_self() {
+    InterfaceType type2 = ElementFactory.classElement2("A", []).type;
+    JUnitTestCase.assertTrue(type2.isMoreSpecificThan(type2));
+  }
+  void test_isMoreSpecificThan_transitive_interface() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    ClassElementImpl classC = ElementFactory.classElement2("C", []);
+    classC.interfaces = <InterfaceType> [classB.type];
+    InterfaceType typeA = classA.type;
+    InterfaceType typeC = classC.type;
+    JUnitTestCase.assertTrue(typeC.isMoreSpecificThan(typeA));
+  }
+  void test_isMoreSpecificThan_transitive_mixin() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    ClassElementImpl classC = ElementFactory.classElement2("C", []);
+    classC.mixins = <InterfaceType> [classB.type];
+    InterfaceType typeA = classA.type;
+    InterfaceType typeC = classC.type;
+    JUnitTestCase.assertTrue(typeC.isMoreSpecificThan(typeA));
+  }
+  void test_isMoreSpecificThan_transitive_recursive() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    ClassElementImpl classC = ElementFactory.classElement2("C", []);
+    InterfaceType typeA = classA.type;
+    InterfaceType typeC = classC.type;
+    classA.supertype = classB.type;
+    JUnitTestCase.assertFalse(typeA.isMoreSpecificThan(typeC));
+  }
+  void test_isMoreSpecificThan_transitive_superclass() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
     ClassElement classC = ElementFactory.classElement("C", classB.type, []);
@@ -741,10 +781,6 @@
     InterfaceType typeC = classC.type;
     JUnitTestCase.assertTrue(typeC.isMoreSpecificThan(typeA));
   }
-  void test_isMoreSpecificThan_self() {
-    InterfaceType type2 = ElementFactory.classElement2("A", []).type;
-    JUnitTestCase.assertTrue(type2.isMoreSpecificThan(type2));
-  }
   void test_isSubtypeOf_directSubtype() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
@@ -760,15 +796,6 @@
     JUnitTestCase.assertFalse(dynamicType.isSubtypeOf(typeA));
     JUnitTestCase.assertTrue(typeA.isSubtypeOf(dynamicType));
   }
-  void test_isSubtypeOf_indirectSubtype() {
-    ClassElement classA = ElementFactory.classElement2("A", []);
-    ClassElement classB = ElementFactory.classElement("B", classA.type, []);
-    ClassElement classC = ElementFactory.classElement("C", classB.type, []);
-    InterfaceType typeA = classA.type;
-    InterfaceType typeC = classC.type;
-    JUnitTestCase.assertTrue(typeC.isSubtypeOf(typeA));
-    JUnitTestCase.assertFalse(typeA.isSubtypeOf(typeC));
-  }
   void test_isSubtypeOf_interface() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
@@ -794,7 +821,7 @@
     classC.mixins = <InterfaceType> [typeB];
     JUnitTestCase.assertTrue(typeC.isSubtypeOf(typeB));
     JUnitTestCase.assertTrue(typeC.isSubtypeOf(typeObject));
-    JUnitTestCase.assertFalse(typeC.isSubtypeOf(typeA));
+    JUnitTestCase.assertTrue(typeC.isSubtypeOf(typeA));
     JUnitTestCase.assertFalse(typeA.isSubtypeOf(typeC));
   }
   void test_isSubtypeOf_object() {
@@ -809,6 +836,24 @@
     InterfaceType typeA = classA.type;
     JUnitTestCase.assertTrue(typeA.isSubtypeOf(typeA));
   }
+  void test_isSubtypeOf_transitive_recursive() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    ClassElementImpl classC = ElementFactory.classElement2("C", []);
+    InterfaceType typeA = classA.type;
+    InterfaceType typeC = classC.type;
+    classA.supertype = classB.type;
+    JUnitTestCase.assertFalse(typeA.isSubtypeOf(typeC));
+  }
+  void test_isSubtypeOf_transitive_superclass() {
+    ClassElement classA = ElementFactory.classElement2("A", []);
+    ClassElement classB = ElementFactory.classElement("B", classA.type, []);
+    ClassElement classC = ElementFactory.classElement("C", classB.type, []);
+    InterfaceType typeA = classA.type;
+    InterfaceType typeC = classC.type;
+    JUnitTestCase.assertTrue(typeC.isSubtypeOf(typeA));
+    JUnitTestCase.assertFalse(typeA.isSubtypeOf(typeC));
+  }
   void test_isSubtypeOf_typeArguments() {
     ClassElement classA = ElementFactory.classElement2("A", ["E"]);
     ClassElement classI = ElementFactory.classElement2("I", []);
@@ -880,7 +925,7 @@
     classC.mixins = <InterfaceType> [typeB];
     JUnitTestCase.assertTrue(typeB.isSupertypeOf(typeC));
     JUnitTestCase.assertTrue(typeObject.isSupertypeOf(typeC));
-    JUnitTestCase.assertFalse(typeA.isSupertypeOf(typeC));
+    JUnitTestCase.assertTrue(typeA.isSupertypeOf(typeC));
     JUnitTestCase.assertFalse(typeC.isSupertypeOf(typeA));
   }
   void test_isSupertypeOf_object() {
@@ -918,6 +963,16 @@
     ((unit as CompilationUnitElementImpl)).types = <ClassElement> [classA, classB];
     JUnitTestCase.assertSame(getterG, typeB.lookUpGetter(getterName, library2));
   }
+  void test_lookUpGetter_recursive() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    InterfaceType typeA = classA.type;
+    ClassElementImpl classB = ElementFactory.classElement("B", typeA, []);
+    classA.supertype = classB.type;
+    LibraryElementImpl library2 = ElementFactory.library(createAnalysisContext(), "lib");
+    CompilationUnitElement unit = library2.definingCompilationUnit;
+    ((unit as CompilationUnitElementImpl)).types = <ClassElement> [classA, classB];
+    JUnitTestCase.assertNull(typeA.lookUpGetter("g", library2));
+  }
   void test_lookUpGetter_unimplemented() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
@@ -974,6 +1029,16 @@
     EngineTestCase.assertLength(1, parameterTypes);
     JUnitTestCase.assertSame(typeI, parameterTypes[0]);
   }
+  void test_lookUpMethod_recursive() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    InterfaceType typeA = classA.type;
+    ClassElementImpl classB = ElementFactory.classElement("B", typeA, []);
+    classA.supertype = classB.type;
+    LibraryElementImpl library2 = ElementFactory.library(createAnalysisContext(), "lib");
+    CompilationUnitElement unit = library2.definingCompilationUnit;
+    ((unit as CompilationUnitElementImpl)).types = <ClassElement> [classA, classB];
+    JUnitTestCase.assertNull(typeA.lookUpMethod("m", library2));
+  }
   void test_lookUpMethod_unimplemented() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
@@ -1005,6 +1070,16 @@
     ((unit as CompilationUnitElementImpl)).types = <ClassElement> [classA, classB];
     JUnitTestCase.assertSame(setterS, typeB.lookUpSetter(setterName, library2));
   }
+  void test_lookUpSetter_recursive() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    InterfaceType typeA = classA.type;
+    ClassElementImpl classB = ElementFactory.classElement("B", typeA, []);
+    classA.supertype = classB.type;
+    LibraryElementImpl library2 = ElementFactory.library(createAnalysisContext(), "lib");
+    CompilationUnitElement unit = library2.definingCompilationUnit;
+    ((unit as CompilationUnitElementImpl)).types = <ClassElement> [classA, classB];
+    JUnitTestCase.assertNull(typeA.lookUpSetter("s", library2));
+  }
   void test_lookUpSetter_unimplemented() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
@@ -1060,6 +1135,10 @@
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_computeLongestInheritancePathToObject_object);
       });
+      _ut.test('test_computeLongestInheritancePathToObject_recursion', () {
+        final __test = new InterfaceTypeImplTest();
+        runJUnitTest(__test, __test.test_computeLongestInheritancePathToObject_recursion);
+      });
       _ut.test('test_computeLongestInheritancePathToObject_singleInterfacePath', () {
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_computeLongestInheritancePathToObject_singleInterfacePath);
@@ -1076,6 +1155,10 @@
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_computeSuperinterfaceSet_multipleSuperclassPaths);
       });
+      _ut.test('test_computeSuperinterfaceSet_recursion', () {
+        final __test = new InterfaceTypeImplTest();
+        runJUnitTest(__test, __test.test_computeSuperinterfaceSet_recursion);
+      });
       _ut.test('test_computeSuperinterfaceSet_singleInterfacePath', () {
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_computeSuperinterfaceSet_singleInterfacePath);
@@ -1172,6 +1255,10 @@
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_getLeastUpperBound_sharedSuperinterface4);
       });
+      _ut.test('test_getLeastUpperBound_twoComparables', () {
+        final __test = new InterfaceTypeImplTest();
+        runJUnitTest(__test, __test.test_getLeastUpperBound_twoComparables);
+      });
       _ut.test('test_getLeastUpperBound_typeParameters_different', () {
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_getLeastUpperBound_typeParameters_different);
@@ -1256,14 +1343,26 @@
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_isMoreSpecificThan_dynamic);
       });
-      _ut.test('test_isMoreSpecificThan_indirectSupertype', () {
-        final __test = new InterfaceTypeImplTest();
-        runJUnitTest(__test, __test.test_isMoreSpecificThan_indirectSupertype);
-      });
       _ut.test('test_isMoreSpecificThan_self', () {
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_isMoreSpecificThan_self);
       });
+      _ut.test('test_isMoreSpecificThan_transitive_interface', () {
+        final __test = new InterfaceTypeImplTest();
+        runJUnitTest(__test, __test.test_isMoreSpecificThan_transitive_interface);
+      });
+      _ut.test('test_isMoreSpecificThan_transitive_mixin', () {
+        final __test = new InterfaceTypeImplTest();
+        runJUnitTest(__test, __test.test_isMoreSpecificThan_transitive_mixin);
+      });
+      _ut.test('test_isMoreSpecificThan_transitive_recursive', () {
+        final __test = new InterfaceTypeImplTest();
+        runJUnitTest(__test, __test.test_isMoreSpecificThan_transitive_recursive);
+      });
+      _ut.test('test_isMoreSpecificThan_transitive_superclass', () {
+        final __test = new InterfaceTypeImplTest();
+        runJUnitTest(__test, __test.test_isMoreSpecificThan_transitive_superclass);
+      });
       _ut.test('test_isSubtypeOf_directSubtype', () {
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_isSubtypeOf_directSubtype);
@@ -1272,10 +1371,6 @@
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_isSubtypeOf_dynamic);
       });
-      _ut.test('test_isSubtypeOf_indirectSubtype', () {
-        final __test = new InterfaceTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_indirectSubtype);
-      });
       _ut.test('test_isSubtypeOf_interface', () {
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_isSubtypeOf_interface);
@@ -1292,6 +1387,14 @@
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_isSubtypeOf_self);
       });
+      _ut.test('test_isSubtypeOf_transitive_recursive', () {
+        final __test = new InterfaceTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_transitive_recursive);
+      });
+      _ut.test('test_isSubtypeOf_transitive_superclass', () {
+        final __test = new InterfaceTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_transitive_superclass);
+      });
       _ut.test('test_isSubtypeOf_typeArguments', () {
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_isSubtypeOf_typeArguments);
@@ -1332,6 +1435,10 @@
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_lookUpGetter_inherited);
       });
+      _ut.test('test_lookUpGetter_recursive', () {
+        final __test = new InterfaceTypeImplTest();
+        runJUnitTest(__test, __test.test_lookUpGetter_recursive);
+      });
       _ut.test('test_lookUpGetter_unimplemented', () {
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_lookUpGetter_unimplemented);
@@ -1348,6 +1455,10 @@
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_lookUpMethod_parameterized);
       });
+      _ut.test('test_lookUpMethod_recursive', () {
+        final __test = new InterfaceTypeImplTest();
+        runJUnitTest(__test, __test.test_lookUpMethod_recursive);
+      });
       _ut.test('test_lookUpMethod_unimplemented', () {
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_lookUpMethod_unimplemented);
@@ -1360,6 +1471,10 @@
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_lookUpSetter_inherited);
       });
+      _ut.test('test_lookUpSetter_recursive', () {
+        final __test = new InterfaceTypeImplTest();
+        runJUnitTest(__test, __test.test_lookUpSetter_recursive);
+      });
       _ut.test('test_lookUpSetter_unimplemented', () {
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_lookUpSetter_unimplemented);
@@ -1422,12 +1537,14 @@
     });
   }
 }
+
 /**
  * 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'.
    */
@@ -1453,7 +1570,15 @@
     return element;
   }
   static ClassElementImpl classElement2(String typeName, List<String> parameterNames) => classElement(typeName, object.type, parameterNames);
-  static ConstructorElementImpl constructorElement(String name) => new ConstructorElementImpl(name == null ? null : ASTFactory.identifier3(name));
+  static ConstructorElementImpl constructorElement(ClassElement clazz, String name) {
+    Type2 type2 = clazz.type;
+    ConstructorElementImpl constructor = new ConstructorElementImpl(name == null ? null : ASTFactory.identifier3(name));
+    FunctionTypeImpl constructorType = new FunctionTypeImpl.con1(constructor);
+    constructorType.normalParameterTypes = <Type2> [type2];
+    constructorType.returnType = type2;
+    constructor.type = constructorType;
+    return constructor;
+  }
   static ExportElementImpl exportFor(LibraryElement exportedLibrary2, List<NamespaceCombinator> combinators2) {
     ExportElementImpl spec = new ExportElementImpl();
     spec.exportedLibrary = exportedLibrary2;
@@ -1468,7 +1593,9 @@
     field.type = type2;
     PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl.con2(field);
     getter.getter = true;
+    getter.static = isStatic;
     getter.synthetic = true;
+    getter.variable = field;
     field.getter = getter;
     FunctionTypeImpl getterType = new FunctionTypeImpl.con1(getter);
     getterType.returnType = type2;
@@ -1476,7 +1603,9 @@
     if (!isConst && !isFinal) {
       PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl.con2(field);
       setter.setter = true;
+      setter.static = isStatic;
       setter.synthetic = true;
+      setter.variable = field;
       field.setter = setter;
       FunctionTypeImpl setterType = new FunctionTypeImpl.con1(getter);
       setterType.normalParameterTypes = <Type2> [type2];
@@ -1495,22 +1624,36 @@
     if (returnElement != null) {
       functionType.returnType = returnElement.type;
     }
-    int count = normalParameters == null ? 0 : normalParameters.length;
-    if (count > 0) {
-      List<InterfaceType> normalParameterTypes = new List<InterfaceType>(count);
-      for (int i = 0; i < count; i++) {
+    int normalCount = normalParameters == null ? 0 : normalParameters.length;
+    if (normalCount > 0) {
+      List<InterfaceType> normalParameterTypes = new List<InterfaceType>(normalCount);
+      for (int i = 0; i < normalCount; i++) {
         normalParameterTypes[i] = normalParameters[i].type;
       }
       functionType.normalParameterTypes = normalParameterTypes;
     }
-    count = optionalParameters == null ? 0 : optionalParameters.length;
-    if (count > 0) {
-      List<InterfaceType> optionalParameterTypes = new List<InterfaceType>(count);
-      for (int i = 0; i < count; i++) {
+    int optionalCount = optionalParameters == null ? 0 : optionalParameters.length;
+    if (optionalCount > 0) {
+      List<InterfaceType> optionalParameterTypes = new List<InterfaceType>(optionalCount);
+      for (int i = 0; i < optionalCount; i++) {
         optionalParameterTypes[i] = optionalParameters[i].type;
       }
       functionType.optionalParameterTypes = optionalParameterTypes;
     }
+    int totalCount = normalCount + optionalCount;
+    List<ParameterElement> parameters = new List<ParameterElement>(totalCount);
+    for (int i = 0; i < totalCount; i++) {
+      ParameterElementImpl parameter = new ParameterElementImpl(ASTFactory.identifier3("a${i}"));
+      if (i < normalCount) {
+        parameter.type = normalParameters[i].type;
+        parameter.parameterKind = ParameterKind.REQUIRED;
+      } else {
+        parameter.type = optionalParameters[i - normalCount].type;
+        parameter.parameterKind = ParameterKind.POSITIONAL;
+      }
+      parameters[i] = parameter;
+    }
+    functionElement.parameters = parameters;
     return functionElement;
   }
   static FunctionElementImpl functionElement4(String functionName, ClassElement returnElement, List<ClassElement> normalParameters, List<String> names, List<ClassElement> namedParameters) {
@@ -1555,6 +1698,8 @@
     field.type = type2;
     PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl.con2(field);
     getter.getter = true;
+    getter.static = isStatic;
+    getter.variable = field;
     field.getter = getter;
     FunctionTypeImpl getterType = new FunctionTypeImpl.con1(getter);
     getterType.returnType = type2;
@@ -1619,13 +1764,17 @@
     field.type = type2;
     PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl.con2(field);
     getter.getter = true;
+    getter.static = isStatic;
+    getter.variable = field;
     field.getter = getter;
     FunctionTypeImpl getterType = new FunctionTypeImpl.con1(getter);
     getterType.returnType = type2;
     getter.type = getterType;
     PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl.con2(field);
     setter.setter = true;
+    setter.static = isStatic;
     setter.synthetic = true;
+    setter.variable = field;
     field.setter = setter;
     FunctionTypeImpl setterType = new FunctionTypeImpl.con1(getter);
     setterType.normalParameterTypes = <Type2> [type2];
@@ -1635,10 +1784,31 @@
   }
   static TopLevelVariableElementImpl topLevelVariableElement(Identifier name) => new TopLevelVariableElementImpl.con1(name);
   static TopLevelVariableElementImpl topLevelVariableElement2(String name) => new TopLevelVariableElementImpl.con2(name);
-  /**
-   * Prevent the creation of instances of this class.
-   */
-  ElementFactory() {
+  static TopLevelVariableElementImpl topLevelVariableElement3(String name, bool isFinal, Type2 type2) {
+    TopLevelVariableElementImpl variable = new TopLevelVariableElementImpl.con2(name);
+    variable.final2 = isFinal;
+    PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl.con2(variable);
+    getter.getter = true;
+    getter.static = true;
+    getter.synthetic = true;
+    getter.variable = variable;
+    variable.getter = getter;
+    FunctionTypeImpl getterType = new FunctionTypeImpl.con1(getter);
+    getterType.returnType = type2;
+    getter.type = getterType;
+    if (!isFinal) {
+      PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl.con2(variable);
+      setter.setter = true;
+      setter.static = true;
+      setter.synthetic = true;
+      setter.variable = variable;
+      variable.setter = setter;
+      FunctionTypeImpl setterType = new FunctionTypeImpl.con1(getter);
+      setterType.normalParameterTypes = <Type2> [type2];
+      setterType.returnType = VoidTypeImpl.instance;
+      setter.type = setterType;
+    }
+    return variable;
   }
 }
 class ElementKindTest extends EngineTestCase {
@@ -1696,13 +1866,19 @@
     JUnitTestCase.assertTrue(types.contains(typeObject));
     JUnitTestCase.assertFalse(types.contains(typeC));
   }
+  void test_getAllSupertypes_recursive() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    classA.supertype = classB.type;
+    List<InterfaceType> supers = classB.allSupertypes;
+    EngineTestCase.assertLength(1, supers);
+  }
   void test_getMethod_declared() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String methodName = "m";
     MethodElement method = ElementFactory.methodElement(methodName, null, []);
     classA.methods = <MethodElement> [method];
     JUnitTestCase.assertSame(method, classA.getMethod(methodName));
-    JUnitTestCase.assertSame(method, classA.getExecutable(methodName));
   }
   void test_getMethod_undeclared() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
@@ -1710,7 +1886,33 @@
     MethodElement method = ElementFactory.methodElement(methodName, null, []);
     classA.methods = <MethodElement> [method];
     JUnitTestCase.assertNull(classA.getMethod("${methodName}x"));
-    JUnitTestCase.assertNull(classA.getExecutable("${methodName}x"));
+  }
+  void test_hasNonFinalField_false_const() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.fields = <FieldElement> [ElementFactory.fieldElement("f", false, false, true, classA.type)];
+    JUnitTestCase.assertFalse(classA.hasNonFinalField());
+  }
+  void test_hasNonFinalField_false_final() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.fields = <FieldElement> [ElementFactory.fieldElement("f", false, true, false, classA.type)];
+    JUnitTestCase.assertFalse(classA.hasNonFinalField());
+  }
+  void test_hasNonFinalField_false_recursive() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    classA.supertype = classB.type;
+    JUnitTestCase.assertFalse(classA.hasNonFinalField());
+  }
+  void test_hasNonFinalField_true_immediate() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.fields = <FieldElement> [ElementFactory.fieldElement("f", false, false, false, classA.type)];
+    JUnitTestCase.assertTrue(classA.hasNonFinalField());
+  }
+  void test_hasNonFinalField_true_inherited() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    classA.fields = <FieldElement> [ElementFactory.fieldElement("f", false, false, false, classA.type)];
+    JUnitTestCase.assertTrue(classB.hasNonFinalField());
   }
   void test_lookUpGetter_declared() {
     LibraryElementImpl library2 = ElementFactory.library(createAnalysisContext(), "lib");
@@ -1720,7 +1922,6 @@
     classA.accessors = <PropertyAccessorElement> [getter];
     ((library2.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classA];
     JUnitTestCase.assertSame(getter, classA.lookUpGetter(getterName, library2));
-    JUnitTestCase.assertSame(getter, classA.lookUpExecutable(getterName, library2));
   }
   void test_lookUpGetter_inherited() {
     LibraryElementImpl library2 = ElementFactory.library(createAnalysisContext(), "lib");
@@ -1731,14 +1932,20 @@
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     ((library2.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classA, classB];
     JUnitTestCase.assertSame(getter, classB.lookUpGetter(getterName, library2));
-    JUnitTestCase.assertSame(getter, classB.lookUpExecutable(getterName, library2));
   }
   void test_lookUpGetter_undeclared() {
     LibraryElementImpl library2 = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ((library2.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classA];
     JUnitTestCase.assertNull(classA.lookUpGetter("g", library2));
-    JUnitTestCase.assertNull(classA.lookUpExecutable("g", library2));
+  }
+  void test_lookUpGetter_undeclared_recursive() {
+    LibraryElementImpl library2 = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    classA.supertype = classB.type;
+    ((library2.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classA, classB];
+    JUnitTestCase.assertNull(classA.lookUpGetter("g", library2));
   }
   void test_lookUpMethod_declared() {
     LibraryElementImpl library2 = ElementFactory.library(createAnalysisContext(), "lib");
@@ -1748,7 +1955,6 @@
     classA.methods = <MethodElement> [method];
     ((library2.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classA];
     JUnitTestCase.assertSame(method, classA.lookUpMethod(methodName, library2));
-    JUnitTestCase.assertSame(method, classA.lookUpExecutable(methodName, library2));
   }
   void test_lookUpMethod_inherited() {
     LibraryElementImpl library2 = ElementFactory.library(createAnalysisContext(), "lib");
@@ -1759,14 +1965,20 @@
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     ((library2.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classA, classB];
     JUnitTestCase.assertSame(method, classB.lookUpMethod(methodName, library2));
-    JUnitTestCase.assertSame(method, classB.lookUpExecutable(methodName, library2));
   }
   void test_lookUpMethod_undeclared() {
     LibraryElementImpl library2 = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ((library2.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classA];
     JUnitTestCase.assertNull(classA.lookUpMethod("m", library2));
-    JUnitTestCase.assertNull(classA.lookUpExecutable("m", library2));
+  }
+  void test_lookUpMethod_undeclared_recursive() {
+    LibraryElementImpl library2 = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    classA.supertype = classB.type;
+    ((library2.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classA, classB];
+    JUnitTestCase.assertNull(classA.lookUpMethod("m", library2));
   }
   void test_lookUpSetter_declared() {
     LibraryElementImpl library2 = ElementFactory.library(createAnalysisContext(), "lib");
@@ -1776,7 +1988,6 @@
     classA.accessors = <PropertyAccessorElement> [setter];
     ((library2.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classA];
     JUnitTestCase.assertSame(setter, classA.lookUpSetter(setterName, library2));
-    JUnitTestCase.assertSame(setter, classA.lookUpExecutable(setterName, library2));
   }
   void test_lookUpSetter_inherited() {
     LibraryElementImpl library2 = ElementFactory.library(createAnalysisContext(), "lib");
@@ -1787,14 +1998,20 @@
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     ((library2.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classA, classB];
     JUnitTestCase.assertSame(setter, classB.lookUpSetter(setterName, library2));
-    JUnitTestCase.assertSame(setter, classB.lookUpExecutable(setterName, library2));
   }
   void test_lookUpSetter_undeclared() {
     LibraryElementImpl library2 = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ((library2.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classA];
     JUnitTestCase.assertNull(classA.lookUpSetter("s", library2));
-    JUnitTestCase.assertNull(classA.lookUpExecutable("s", library2));
+  }
+  void test_lookUpSetter_undeclared_recursive() {
+    LibraryElementImpl library2 = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    classA.supertype = classB.type;
+    ((library2.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classA, classB];
+    JUnitTestCase.assertNull(classA.lookUpSetter("s", library2));
   }
   static dartSuite() {
     _ut.group('ClassElementImplTest', () {
@@ -1806,6 +2023,10 @@
         final __test = new ClassElementImplTest();
         runJUnitTest(__test, __test.test_getAllSupertypes_mixins);
       });
+      _ut.test('test_getAllSupertypes_recursive', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_getAllSupertypes_recursive);
+      });
       _ut.test('test_getMethod_declared', () {
         final __test = new ClassElementImplTest();
         runJUnitTest(__test, __test.test_getMethod_declared);
@@ -1814,6 +2035,26 @@
         final __test = new ClassElementImplTest();
         runJUnitTest(__test, __test.test_getMethod_undeclared);
       });
+      _ut.test('test_hasNonFinalField_false_const', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_hasNonFinalField_false_const);
+      });
+      _ut.test('test_hasNonFinalField_false_final', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_hasNonFinalField_false_final);
+      });
+      _ut.test('test_hasNonFinalField_false_recursive', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_hasNonFinalField_false_recursive);
+      });
+      _ut.test('test_hasNonFinalField_true_immediate', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_hasNonFinalField_true_immediate);
+      });
+      _ut.test('test_hasNonFinalField_true_inherited', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_hasNonFinalField_true_inherited);
+      });
       _ut.test('test_lookUpGetter_declared', () {
         final __test = new ClassElementImplTest();
         runJUnitTest(__test, __test.test_lookUpGetter_declared);
@@ -1826,6 +2067,10 @@
         final __test = new ClassElementImplTest();
         runJUnitTest(__test, __test.test_lookUpGetter_undeclared);
       });
+      _ut.test('test_lookUpGetter_undeclared_recursive', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpGetter_undeclared_recursive);
+      });
       _ut.test('test_lookUpMethod_declared', () {
         final __test = new ClassElementImplTest();
         runJUnitTest(__test, __test.test_lookUpMethod_declared);
@@ -1838,6 +2083,10 @@
         final __test = new ClassElementImplTest();
         runJUnitTest(__test, __test.test_lookUpMethod_undeclared);
       });
+      _ut.test('test_lookUpMethod_undeclared_recursive', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpMethod_undeclared_recursive);
+      });
       _ut.test('test_lookUpSetter_declared', () {
         final __test = new ClassElementImplTest();
         runJUnitTest(__test, __test.test_lookUpSetter_declared);
@@ -1850,6 +2099,10 @@
         final __test = new ClassElementImplTest();
         runJUnitTest(__test, __test.test_lookUpSetter_undeclared);
       });
+      _ut.test('test_lookUpSetter_undeclared_recursive', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpSetter_undeclared_recursive);
+      });
     });
   }
 }
@@ -1957,7 +2210,7 @@
   }
   void test_isSubtypeOf_baseCase_classFunction() {
     ClassElementImpl functionElement = ElementFactory.classElement2("Function", []);
-    InterfaceTypeImpl functionType = new InterfaceTypeImpl_18(functionElement);
+    InterfaceTypeImpl functionType = new InterfaceTypeImpl_19(functionElement);
     FunctionType f = ElementFactory.functionElement("f").type;
     JUnitTestCase.assertTrue(f.isSubtypeOf(functionType));
   }
@@ -2057,6 +2310,11 @@
     FunctionType s = ElementFactory.functionElement5("s", <ClassElement> [b]).type;
     JUnitTestCase.assertFalse(t.isSubtypeOf(s));
   }
+  void test_isSubtypeOf_Object() {
+    FunctionType f = ElementFactory.functionElement("f").type;
+    InterfaceType t = ElementFactory.object.type;
+    JUnitTestCase.assertTrue(f.isSubtypeOf(t));
+  }
   void test_isSubtypeOf_optionalParameters_isAssignable() {
     ClassElement a = ElementFactory.classElement2("A", []);
     ClassElement b = ElementFactory.classElement("B", a.type, []);
@@ -2238,6 +2496,10 @@
         final __test = new FunctionTypeImplTest();
         runJUnitTest(__test, __test.test_hashCode_noElement);
       });
+      _ut.test('test_isSubtypeOf_Object', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_Object);
+      });
       _ut.test('test_isSubtypeOf_baseCase_classFunction', () {
         final __test = new FunctionTypeImplTest();
         runJUnitTest(__test, __test.test_isSubtypeOf_baseCase_classFunction);
@@ -2369,8 +2631,8 @@
     });
   }
 }
-class InterfaceTypeImpl_18 extends InterfaceTypeImpl {
-  InterfaceTypeImpl_18(ClassElement arg0) : super.con1(arg0);
+class InterfaceTypeImpl_19 extends InterfaceTypeImpl {
+  InterfaceTypeImpl_19(ClassElement arg0) : super.con1(arg0);
   bool isDartCoreFunction() => true;
 }
 main() {
diff --git a/pkg/analyzer_experimental/test/generated/parser_test.dart b/pkg/analyzer_experimental/test/generated/parser_test.dart
index 31def04..015c179 100644
--- a/pkg/analyzer_experimental/test/generated/parser_test.dart
+++ b/pkg/analyzer_experimental/test/generated/parser_test.dart
@@ -16,6 +16,8 @@
 import 'package:unittest/unittest.dart' as _ut;
 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
@@ -80,6 +82,9 @@
   void test_computeStringValue_raw_withEscape() {
     JUnitTestCase.assertEquals("two\\nlines", computeStringValue("r'two\\nlines'"));
   }
+  void test_constFactory() {
+    ParserTestCase.parse("parseClassMember", <Object> ["C"], "const factory C() = A;");
+  }
   void test_createSyntheticIdentifier() {
     SimpleIdentifier identifier = createSyntheticIdentifier();
     JUnitTestCase.assertTrue(identifier.isSynthetic());
@@ -1403,7 +1408,7 @@
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
   void test_parseConstExpression_mapLiteral_typed() {
-    MapLiteral literal = ParserTestCase.parse5("parseConstExpression", "const <A> {}", []);
+    MapLiteral literal = ParserTestCase.parse5("parseConstExpression", "const <A, B> {}", []);
     JUnitTestCase.assertNotNull(literal.leftBracket);
     EngineTestCase.assertSize(0, literal.entries);
     JUnitTestCase.assertNotNull(literal.rightBracket);
@@ -1679,6 +1684,14 @@
     JUnitTestCase.assertEquals(Keyword.FINAL, ((keyword2 as KeywordToken)).keyword);
     JUnitTestCase.assertNull(result.type);
   }
+  void test_parseFinalConstVarOrType_final_prefixedType() {
+    FinalConstVarOrType result = ParserTestCase.parse("parseFinalConstVarOrType", <Object> [false], "final p.A a");
+    Token keyword2 = result.keyword;
+    JUnitTestCase.assertNotNull(keyword2);
+    JUnitTestCase.assertEquals(TokenType.KEYWORD, keyword2.type);
+    JUnitTestCase.assertEquals(Keyword.FINAL, ((keyword2 as KeywordToken)).keyword);
+    JUnitTestCase.assertNotNull(result.type);
+  }
   void test_parseFinalConstVarOrType_final_type() {
     FinalConstVarOrType result = ParserTestCase.parse("parseFinalConstVarOrType", <Object> [false], "final A a");
     Token keyword2 = result.keyword;
@@ -2069,21 +2082,21 @@
     JUnitTestCase.assertNotNull(statement.body);
   }
   void test_parseFunctionBody_block() {
-    BlockFunctionBody functionBody = ParserTestCase.parse("parseFunctionBody", <Object> [false, false], "{}");
+    BlockFunctionBody functionBody = ParserTestCase.parse("parseFunctionBody", <Object> [false, null, false], "{}");
     JUnitTestCase.assertNotNull(functionBody.block);
   }
   void test_parseFunctionBody_empty() {
-    EmptyFunctionBody functionBody = ParserTestCase.parse("parseFunctionBody", <Object> [true, false], ";");
+    EmptyFunctionBody functionBody = ParserTestCase.parse("parseFunctionBody", <Object> [true, null, false], ";");
     JUnitTestCase.assertNotNull(functionBody.semicolon);
   }
   void test_parseFunctionBody_expression() {
-    ExpressionFunctionBody functionBody = ParserTestCase.parse("parseFunctionBody", <Object> [false, false], "=> y;");
+    ExpressionFunctionBody functionBody = ParserTestCase.parse("parseFunctionBody", <Object> [false, null, false], "=> y;");
     JUnitTestCase.assertNotNull(functionBody.functionDefinition);
     JUnitTestCase.assertNotNull(functionBody.expression);
     JUnitTestCase.assertNotNull(functionBody.semicolon);
   }
   void test_parseFunctionBody_nativeFunctionBody() {
-    NativeFunctionBody functionBody = ParserTestCase.parse("parseFunctionBody", <Object> [false, false], "native 'str';");
+    NativeFunctionBody functionBody = ParserTestCase.parse("parseFunctionBody", <Object> [false, null, false], "native 'str';");
     JUnitTestCase.assertNotNull(functionBody.nativeToken);
     JUnitTestCase.assertNotNull(functionBody.stringLiteral);
     JUnitTestCase.assertNotNull(functionBody.semicolon);
@@ -2160,7 +2173,7 @@
     Comment comment = Comment.createDocumentationComment(new List<Token>(0));
     Token staticKeyword = TokenFactory.token(Keyword.STATIC);
     TypeName returnType = new TypeName.full(new SimpleIdentifier.full(null), null);
-    MethodDeclaration method = ParserTestCase.parse("parseGetter", <Object> [commentAndMetadata(comment, []), null, staticKeyword, returnType], "get a;");
+    MethodDeclaration method = ParserTestCase.parse("parseGetter", <Object> [commentAndMetadata(comment, []), null, staticKeyword, returnType], "get a => 42;");
     JUnitTestCase.assertNotNull(method.body);
     JUnitTestCase.assertEquals(comment, method.documentationComment);
     JUnitTestCase.assertNull(method.externalKeyword);
@@ -2432,7 +2445,7 @@
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
   void test_parseListOrMapLiteral_map_type() {
-    MapLiteral literal = ParserTestCase.parse("parseListOrMapLiteral", <Object> [null], "<int> {'1' : 1}");
+    MapLiteral literal = ParserTestCase.parse("parseListOrMapLiteral", <Object> [null], "<String, int> {'1' : 1}");
     JUnitTestCase.assertNull(literal.modifier);
     JUnitTestCase.assertNotNull(literal.typeArguments);
     JUnitTestCase.assertNotNull(literal.leftBracket);
@@ -2455,7 +2468,7 @@
   }
   void test_parseMapLiteral_empty() {
     Token token2 = TokenFactory.token(Keyword.CONST);
-    TypeArgumentList typeArguments = new TypeArgumentList.full(null, null, null);
+    TypeArgumentList typeArguments = ASTFactory.typeArgumentList([ASTFactory.typeName4("String", []), ASTFactory.typeName4("int", [])]);
     MapLiteral literal = ParserTestCase.parse("parseMapLiteral", <Object> [token2, typeArguments], "{}");
     JUnitTestCase.assertEquals(token2, literal.modifier);
     JUnitTestCase.assertEquals(typeArguments, literal.typeArguments);
@@ -2475,7 +2488,19 @@
     EngineTestCase.assertSize(1, literal.entries);
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
-  void test_parseMapLiteralEntry() {
+  void test_parseMapLiteralEntry_complex() {
+    MapLiteralEntry entry = ParserTestCase.parse5("parseMapLiteralEntry", "2 + 2 : y", []);
+    JUnitTestCase.assertNotNull(entry.key);
+    JUnitTestCase.assertNotNull(entry.separator);
+    JUnitTestCase.assertNotNull(entry.value);
+  }
+  void test_parseMapLiteralEntry_int() {
+    MapLiteralEntry entry = ParserTestCase.parse5("parseMapLiteralEntry", "0 : y", []);
+    JUnitTestCase.assertNotNull(entry.key);
+    JUnitTestCase.assertNotNull(entry.separator);
+    JUnitTestCase.assertNotNull(entry.value);
+  }
+  void test_parseMapLiteralEntry_string() {
     MapLiteralEntry entry = ParserTestCase.parse5("parseMapLiteralEntry", "'x' : y", []);
     JUnitTestCase.assertNotNull(entry.key);
     JUnitTestCase.assertNotNull(entry.separator);
@@ -2772,11 +2797,6 @@
     JUnitTestCase.assertNotNull(identifier.period);
     JUnitTestCase.assertEquals("bar", identifier.identifier.name);
   }
-  void test_parsePrimaryExpression_argumentDefinitionTest() {
-    ArgumentDefinitionTest expression = ParserTestCase.parse5("parseArgumentDefinitionTest", "?a", []);
-    JUnitTestCase.assertNotNull(expression.question);
-    JUnitTestCase.assertNotNull(expression.identifier);
-  }
   void test_parsePrimaryExpression_const() {
     InstanceCreationExpression expression = ParserTestCase.parse5("parsePrimaryExpression", "const A()", []);
     JUnitTestCase.assertNotNull(expression);
@@ -2836,9 +2856,9 @@
     JUnitTestCase.assertNotNull(literal);
   }
   void test_parsePrimaryExpression_mapLiteral_typed() {
-    MapLiteral literal = ParserTestCase.parse5("parsePrimaryExpression", "<A>{}", []);
+    MapLiteral literal = ParserTestCase.parse5("parsePrimaryExpression", "<A, B>{}", []);
     JUnitTestCase.assertNotNull(literal.typeArguments);
-    EngineTestCase.assertSize(1, literal.typeArguments.arguments);
+    EngineTestCase.assertSize(2, literal.typeArguments.arguments);
   }
   void test_parsePrimaryExpression_new() {
     InstanceCreationExpression expression = ParserTestCase.parse5("parsePrimaryExpression", "new A()", []);
@@ -2849,7 +2869,7 @@
     JUnitTestCase.assertNotNull(literal.literal);
   }
   void test_parsePrimaryExpression_parenthesized() {
-    ParenthesizedExpression expression = ParserTestCase.parse5("parsePrimaryExpression", "()", []);
+    ParenthesizedExpression expression = ParserTestCase.parse5("parsePrimaryExpression", "(x)", []);
     JUnitTestCase.assertNotNull(expression);
   }
   void test_parsePrimaryExpression_string() {
@@ -3650,6 +3670,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
@@ -3657,10 +3678,11 @@
    * @throws Exception if the method could not be invoked or throws an exception
    */
   String computeStringValue(String lexeme) {
-    AnalysisErrorListener listener = new AnalysisErrorListener_19();
+    AnalysisErrorListener listener = new AnalysisErrorListener_20();
     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.
@@ -3672,6 +3694,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.
@@ -3683,6 +3706,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.
@@ -3694,6 +3718,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.
@@ -3708,6 +3733,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.
@@ -3719,6 +3745,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.
@@ -3730,6 +3757,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.
@@ -3816,6 +3844,10 @@
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_computeStringValue_raw_withEscape);
       });
+      _ut.test('test_constFactory', () {
+        final __test = new SimpleParserTest();
+        runJUnitTest(__test, __test.test_constFactory);
+      });
       _ut.test('test_createSyntheticIdentifier', () {
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_createSyntheticIdentifier);
@@ -4720,6 +4752,10 @@
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_parseFinalConstVarOrType_final_noType);
       });
+      _ut.test('test_parseFinalConstVarOrType_final_prefixedType', () {
+        final __test = new SimpleParserTest();
+        runJUnitTest(__test, __test.test_parseFinalConstVarOrType_final_prefixedType);
+      });
       _ut.test('test_parseFinalConstVarOrType_final_type', () {
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_parseFinalConstVarOrType_final_type);
@@ -5052,9 +5088,17 @@
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_parseLogicalOrExpression);
       });
-      _ut.test('test_parseMapLiteralEntry', () {
+      _ut.test('test_parseMapLiteralEntry_complex', () {
         final __test = new SimpleParserTest();
-        runJUnitTest(__test, __test.test_parseMapLiteralEntry);
+        runJUnitTest(__test, __test.test_parseMapLiteralEntry_complex);
+      });
+      _ut.test('test_parseMapLiteralEntry_int', () {
+        final __test = new SimpleParserTest();
+        runJUnitTest(__test, __test.test_parseMapLiteralEntry_int);
+      });
+      _ut.test('test_parseMapLiteralEntry_string', () {
+        final __test = new SimpleParserTest();
+        runJUnitTest(__test, __test.test_parseMapLiteralEntry_string);
       });
       _ut.test('test_parseMapLiteral_empty', () {
         final __test = new SimpleParserTest();
@@ -5284,10 +5328,6 @@
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_parsePrefixedIdentifier_prefix);
       });
-      _ut.test('test_parsePrimaryExpression_argumentDefinitionTest', () {
-        final __test = new SimpleParserTest();
-        runJUnitTest(__test, __test.test_parsePrimaryExpression_argumentDefinitionTest);
-      });
       _ut.test('test_parsePrimaryExpression_const', () {
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_parsePrimaryExpression_const);
@@ -5811,11 +5851,12 @@
     });
   }
 }
-class AnalysisErrorListener_19 implements AnalysisErrorListener {
+class AnalysisErrorListener_20 implements AnalysisErrorListener {
   void onError(AnalysisError event) {
     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
@@ -5947,15 +5988,6 @@
       JUnitTestCase.assertSame(target2, index.realTarget);
     }
   }
-  void test_conditionalExpression_precedence_argumentDefinitionTest_not() {
-    ConditionalExpression conditional = ParserTestCase.parseExpression("!?a?!?b:!?c", []);
-    EngineTestCase.assertInstanceOf(PrefixExpression, conditional.condition);
-    EngineTestCase.assertInstanceOf(ArgumentDefinitionTest, ((conditional.condition as PrefixExpression)).operand);
-    EngineTestCase.assertInstanceOf(PrefixExpression, conditional.thenExpression);
-    EngineTestCase.assertInstanceOf(ArgumentDefinitionTest, ((conditional.thenExpression as PrefixExpression)).operand);
-    EngineTestCase.assertInstanceOf(PrefixExpression, conditional.elseExpression);
-    EngineTestCase.assertInstanceOf(ArgumentDefinitionTest, ((conditional.elseExpression as PrefixExpression)).operand);
-  }
   void test_conditionalExpression_precedence_logicalOrExpression() {
     ConditionalExpression expression = ParserTestCase.parseExpression("a | b ? y : z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.condition);
@@ -6144,10 +6176,6 @@
         final __test = new ComplexParserTest();
         runJUnitTest(__test, __test.test_cascade_withAssignment);
       });
-      _ut.test('test_conditionalExpression_precedence_argumentDefinitionTest_not', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_conditionalExpression_precedence_argumentDefinitionTest_not);
-      });
       _ut.test('test_conditionalExpression_precedence_logicalOrExpression', () {
         final __test = new ComplexParserTest();
         runJUnitTest(__test, __test.test_conditionalExpression_precedence_logicalOrExpression);
@@ -6239,15 +6267,18 @@
     });
   }
 }
+
 /**
  * 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.
@@ -6267,6 +6298,7 @@
     validate(node);
     return super.visitNode(node);
   }
+  
   /**
    * Validate that the given AST node is correctly constructed.
    * @param node the AST node being validated
@@ -6307,10 +6339,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.
@@ -6325,6 +6359,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.
@@ -6346,6 +6381,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.
@@ -6367,6 +6403,7 @@
     listener.assertErrors2(errorCodes);
     return result;
   }
+  
   /**
    * Invoke a parse method in {@link Parser}. The method is assumed to have no arguments.
    * <p>
@@ -6381,6 +6418,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
@@ -6400,6 +6438,7 @@
     listener.assertErrors2(errorCodes);
     return unit;
   }
+  
   /**
    * Parse the given source as an expression.
    * @param source the source to be parsed
@@ -6419,6 +6458,7 @@
     listener.assertErrors2(errorCodes);
     return expression as Expression;
   }
+  
   /**
    * Parse the given source as a statement.
    * @param source the source to be parsed
@@ -6438,6 +6478,7 @@
     listener.assertErrors2(errorCodes);
     return statement as Statement;
   }
+  
   /**
    * Parse the given source as a sequence of statements.
    * @param source the source to be parsed
@@ -6459,6 +6500,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.
@@ -6485,6 +6527,7 @@
     }
     return result as Object;
   }
+  
   /**
    * Invoke a method in {@link Parser}. The method is assumed to have no arguments.
    * <p>
@@ -6499,6 +6542,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
@@ -6512,6 +6556,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
@@ -6522,246 +6567,249 @@
     });
   }
 }
+
 /**
  * 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.
  */
 class RecoveryParserTest extends ParserTestCase {
+  void fail_incompleteReturnType() {
+    ParserTestCase.parseCompilationUnit(EngineTestCase.createSource(["Map<Symbol, convertStringToSymbolMap(Map<String, dynamic> map) {", "  if (map == null) return null;", "  Map<Symbol, dynamic> result = new Map<Symbol, dynamic>();", "  map.forEach((name, value) {", "    result[new Symbol(name)] = value;", "  });", "  return result;", "}"]), []);
+  }
   void test_additiveExpression_missing_LHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("+ y", [ParserErrorCode.USE_OF_UNARY_PLUS_OPERATOR]);
+    BinaryExpression expression = ParserTestCase.parseExpression("+ y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
     JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
   }
   void test_additiveExpression_missing_LHS_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("+", [ParserErrorCode.USE_OF_UNARY_PLUS_OPERATOR]);
+    BinaryExpression expression = ParserTestCase.parseExpression("+", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
     JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_additiveExpression_missing_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x +", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("x +", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_additiveExpression_missing_RHS_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super +", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("super +", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_additiveExpression_precedence_multiplicative_left() {
-    BinaryExpression expression = ParserTestCase.parseExpression("* +", [ParserErrorCode.USE_OF_UNARY_PLUS_OPERATOR]);
+    BinaryExpression expression = ParserTestCase.parseExpression("* +", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
   void test_additiveExpression_precedence_multiplicative_right() {
-    BinaryExpression expression = ParserTestCase.parseExpression("+ *", [ParserErrorCode.USE_OF_UNARY_PLUS_OPERATOR]);
+    BinaryExpression expression = ParserTestCase.parseExpression("+ *", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.rightOperand);
   }
   void test_additiveExpression_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super + +", [ParserErrorCode.USE_OF_UNARY_PLUS_OPERATOR]);
+    BinaryExpression expression = ParserTestCase.parseExpression("super + +", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
-  void test_argumentDefinitionTest_missing_identifier() {
-    ArgumentDefinitionTest expression = ParserTestCase.parseExpression("?", [ParserErrorCode.MISSING_IDENTIFIER]);
-    JUnitTestCase.assertTrue(expression.identifier.isSynthetic());
-  }
   void test_assignmentExpression_missing_compound1() {
-    AssignmentExpression expression = ParserTestCase.parseExpression("= y = 0", []);
+    AssignmentExpression expression = ParserTestCase.parseExpression("= y = 0", [ParserErrorCode.MISSING_IDENTIFIER]);
     Expression syntheticExpression = expression.leftHandSide;
     EngineTestCase.assertInstanceOf(SimpleIdentifier, syntheticExpression);
     JUnitTestCase.assertTrue(syntheticExpression.isSynthetic());
   }
   void test_assignmentExpression_missing_compound2() {
-    AssignmentExpression expression = ParserTestCase.parseExpression("x = = 0", []);
+    AssignmentExpression expression = ParserTestCase.parseExpression("x = = 0", [ParserErrorCode.MISSING_IDENTIFIER]);
     Expression syntheticExpression = ((expression.rightHandSide as AssignmentExpression)).leftHandSide;
     EngineTestCase.assertInstanceOf(SimpleIdentifier, syntheticExpression);
     JUnitTestCase.assertTrue(syntheticExpression.isSynthetic());
   }
   void test_assignmentExpression_missing_compound3() {
-    AssignmentExpression expression = ParserTestCase.parseExpression("x = y =", []);
+    AssignmentExpression expression = ParserTestCase.parseExpression("x = y =", [ParserErrorCode.MISSING_IDENTIFIER]);
     Expression syntheticExpression = ((expression.rightHandSide as AssignmentExpression)).rightHandSide;
     EngineTestCase.assertInstanceOf(SimpleIdentifier, syntheticExpression);
     JUnitTestCase.assertTrue(syntheticExpression.isSynthetic());
   }
   void test_assignmentExpression_missing_LHS() {
-    AssignmentExpression expression = ParserTestCase.parseExpression("= 0", []);
+    AssignmentExpression expression = ParserTestCase.parseExpression("= 0", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftHandSide);
     JUnitTestCase.assertTrue(expression.leftHandSide.isSynthetic());
   }
   void test_assignmentExpression_missing_RHS() {
-    AssignmentExpression expression = ParserTestCase.parseExpression("x =", []);
+    AssignmentExpression expression = ParserTestCase.parseExpression("x =", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftHandSide);
     JUnitTestCase.assertTrue(expression.rightHandSide.isSynthetic());
   }
   void test_bitwiseAndExpression_missing_LHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("& y", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("& y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
     JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
   }
   void test_bitwiseAndExpression_missing_LHS_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("&", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("&", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
     JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_bitwiseAndExpression_missing_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x &", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("x &", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_bitwiseAndExpression_missing_RHS_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super &", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("super &", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_bitwiseAndExpression_precedence_equality_left() {
-    BinaryExpression expression = ParserTestCase.parseExpression("== &", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("== &", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
   void test_bitwiseAndExpression_precedence_equality_right() {
-    BinaryExpression expression = ParserTestCase.parseExpression("& ==", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("& ==", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.rightOperand);
   }
   void test_bitwiseAndExpression_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super &  &", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("super &  &", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
   void test_bitwiseOrExpression_missing_LHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("| y", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("| y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
     JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
   }
   void test_bitwiseOrExpression_missing_LHS_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("|", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("|", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
     JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_bitwiseOrExpression_missing_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x |", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("x |", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_bitwiseOrExpression_missing_RHS_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super |", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("super |", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_bitwiseOrExpression_precedence_xor_left() {
-    BinaryExpression expression = ParserTestCase.parseExpression("^ |", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("^ |", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
   void test_bitwiseOrExpression_precedence_xor_right() {
-    BinaryExpression expression = ParserTestCase.parseExpression("| ^", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("| ^", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.rightOperand);
   }
   void test_bitwiseOrExpression_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super |  |", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("super |  |", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
   void test_bitwiseXorExpression_missing_LHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("^ y", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("^ y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
     JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
   }
   void test_bitwiseXorExpression_missing_LHS_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("^", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("^", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
     JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_bitwiseXorExpression_missing_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x ^", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("x ^", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_bitwiseXorExpression_missing_RHS_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super ^", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("super ^", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_bitwiseXorExpression_precedence_and_left() {
-    BinaryExpression expression = ParserTestCase.parseExpression("& ^", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("& ^", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
   void test_bitwiseXorExpression_precedence_and_right() {
-    BinaryExpression expression = ParserTestCase.parseExpression("^ &", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("^ &", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.rightOperand);
   }
   void test_bitwiseXorExpression_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super ^  ^", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("super ^  ^", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+  void test_classTypeAlias_withBody() {
+    ParserTestCase.parseCompilationUnit(EngineTestCase.createSource(["class A {}", "typedef B = Object with A {}"]), [ParserErrorCode.EXPECTED_TOKEN]);
+  }
   void test_conditionalExpression_missingElse() {
-    ConditionalExpression expression = ParserTestCase.parse5("parseConditionalExpression", "x ? y :", []);
+    ConditionalExpression expression = ParserTestCase.parse5("parseConditionalExpression", "x ? y :", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.elseExpression);
     JUnitTestCase.assertTrue(expression.elseExpression.isSynthetic());
   }
   void test_conditionalExpression_missingThen() {
-    ConditionalExpression expression = ParserTestCase.parse5("parseConditionalExpression", "x ? : z", []);
+    ConditionalExpression expression = ParserTestCase.parse5("parseConditionalExpression", "x ? : z", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.thenExpression);
     JUnitTestCase.assertTrue(expression.thenExpression.isSynthetic());
   }
   void test_equalityExpression_missing_LHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("== y", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("== y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
     JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
   }
   void test_equalityExpression_missing_LHS_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("==", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("==", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
     JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_equalityExpression_missing_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x ==", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("x ==", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_equalityExpression_missing_RHS_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super ==", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("super ==", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_equalityExpression_precedence_relational_left() {
-    BinaryExpression expression = ParserTestCase.parseExpression("is ==", [ParserErrorCode.MISSING_IDENTIFIER]);
+    BinaryExpression expression = ParserTestCase.parseExpression("is ==", [ParserErrorCode.EXPECTED_TYPE_NAME, ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(IsExpression, expression.leftOperand);
   }
   void test_equalityExpression_precedence_relational_right() {
-    BinaryExpression expression = ParserTestCase.parseExpression("== is", [ParserErrorCode.MISSING_IDENTIFIER]);
+    BinaryExpression expression = ParserTestCase.parseExpression("== is", [ParserErrorCode.EXPECTED_TYPE_NAME, ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(IsExpression, expression.rightOperand);
   }
   void test_equalityExpression_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super ==  ==", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("super ==  ==", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
   void test_expressionList_multiple_end() {
-    List<Expression> result = ParserTestCase.parse5("parseExpressionList", ", 2, 3, 4", []);
+    List<Expression> result = ParserTestCase.parse5("parseExpressionList", ", 2, 3, 4", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertSize(4, result);
     Expression syntheticExpression = result[0];
     EngineTestCase.assertInstanceOf(SimpleIdentifier, syntheticExpression);
     JUnitTestCase.assertTrue(syntheticExpression.isSynthetic());
   }
   void test_expressionList_multiple_middle() {
-    List<Expression> result = ParserTestCase.parse5("parseExpressionList", "1, 2, , 4", []);
+    List<Expression> result = ParserTestCase.parse5("parseExpressionList", "1, 2, , 4", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertSize(4, result);
     Expression syntheticExpression = result[2];
     EngineTestCase.assertInstanceOf(SimpleIdentifier, syntheticExpression);
     JUnitTestCase.assertTrue(syntheticExpression.isSynthetic());
   }
   void test_expressionList_multiple_start() {
-    List<Expression> result = ParserTestCase.parse5("parseExpressionList", "1, 2, 3,", []);
+    List<Expression> result = ParserTestCase.parse5("parseExpressionList", "1, 2, 3,", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertSize(4, result);
     Expression syntheticExpression = result[3];
     EngineTestCase.assertInstanceOf(SimpleIdentifier, syntheticExpression);
     JUnitTestCase.assertTrue(syntheticExpression.isSynthetic());
   }
   void test_isExpression_noType() {
-    CompilationUnit unit = ParserTestCase.parseCompilationUnit("class Bar<T extends Foo> {m(x){if (x is ) return;if (x is !)}}", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_STATEMENT]);
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("class Bar<T extends Foo> {m(x){if (x is ) return;if (x is !)}}", [ParserErrorCode.EXPECTED_TYPE_NAME, ParserErrorCode.EXPECTED_TYPE_NAME, ParserErrorCode.MISSING_STATEMENT]);
     ClassDeclaration declaration = unit.declarations[0] as ClassDeclaration;
     MethodDeclaration method = declaration.members[0] as MethodDeclaration;
     BlockFunctionBody body2 = method.body as BlockFunctionBody;
@@ -6776,148 +6824,148 @@
     EngineTestCase.assertInstanceOf(EmptyStatement, ifStatement.thenStatement);
   }
   void test_logicalAndExpression_missing_LHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("&& y", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("&& y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
     JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
   }
   void test_logicalAndExpression_missing_LHS_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("&&", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("&&", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
     JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_logicalAndExpression_missing_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x &&", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("x &&", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_logicalAndExpression_precedence_bitwiseOr_left() {
-    BinaryExpression expression = ParserTestCase.parseExpression("| &&", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("| &&", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
   void test_logicalAndExpression_precedence_bitwiseOr_right() {
-    BinaryExpression expression = ParserTestCase.parseExpression("&& |", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("&& |", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.rightOperand);
   }
   void test_logicalOrExpression_missing_LHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("|| y", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("|| y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
     JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
   }
   void test_logicalOrExpression_missing_LHS_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("||", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("||", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
     JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_logicalOrExpression_missing_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x ||", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("x ||", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_logicalOrExpression_precedence_logicalAnd_left() {
-    BinaryExpression expression = ParserTestCase.parseExpression("&& ||", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("&& ||", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
   void test_logicalOrExpression_precedence_logicalAnd_right() {
-    BinaryExpression expression = ParserTestCase.parseExpression("|| &&", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("|| &&", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.rightOperand);
   }
   void test_multiplicativeExpression_missing_LHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("* y", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("* y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
     JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
   }
   void test_multiplicativeExpression_missing_LHS_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("*", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("*", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
     JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_multiplicativeExpression_missing_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x *", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("x *", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_multiplicativeExpression_missing_RHS_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super *", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("super *", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_multiplicativeExpression_precedence_unary_left() {
-    BinaryExpression expression = ParserTestCase.parseExpression("-x *", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("-x *", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(PrefixExpression, expression.leftOperand);
   }
   void test_multiplicativeExpression_precedence_unary_right() {
-    BinaryExpression expression = ParserTestCase.parseExpression("* -y", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("* -y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(PrefixExpression, expression.rightOperand);
   }
   void test_multiplicativeExpression_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super ==  ==", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("super ==  ==", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
   void test_prefixExpression_missing_operand_minus() {
-    PrefixExpression expression = ParserTestCase.parseExpression("-", []);
+    PrefixExpression expression = ParserTestCase.parseExpression("-", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.operand);
     JUnitTestCase.assertTrue(expression.operand.isSynthetic());
     JUnitTestCase.assertEquals(TokenType.MINUS, expression.operator.type);
   }
   void test_relationalExpression_missing_LHS() {
-    IsExpression expression = ParserTestCase.parseExpression("is y", []);
+    IsExpression expression = ParserTestCase.parseExpression("is y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.expression);
     JUnitTestCase.assertTrue(expression.expression.isSynthetic());
   }
   void test_relationalExpression_missing_LHS_RHS() {
-    IsExpression expression = ParserTestCase.parseExpression("is", [ParserErrorCode.MISSING_IDENTIFIER]);
+    IsExpression expression = ParserTestCase.parseExpression("is", [ParserErrorCode.EXPECTED_TYPE_NAME, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.expression);
     JUnitTestCase.assertTrue(expression.expression.isSynthetic());
     EngineTestCase.assertInstanceOf(TypeName, expression.type);
     JUnitTestCase.assertTrue(expression.type.isSynthetic());
   }
   void test_relationalExpression_missing_RHS() {
-    IsExpression expression = ParserTestCase.parseExpression("x is", [ParserErrorCode.MISSING_IDENTIFIER]);
+    IsExpression expression = ParserTestCase.parseExpression("x is", [ParserErrorCode.EXPECTED_TYPE_NAME]);
     EngineTestCase.assertInstanceOf(TypeName, expression.type);
     JUnitTestCase.assertTrue(expression.type.isSynthetic());
   }
   void test_relationalExpression_precedence_shift_right() {
-    IsExpression expression = ParserTestCase.parseExpression("<< is", [ParserErrorCode.MISSING_IDENTIFIER]);
+    IsExpression expression = ParserTestCase.parseExpression("<< is", [ParserErrorCode.EXPECTED_TYPE_NAME, ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.expression);
   }
   void test_shiftExpression_missing_LHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("<< y", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("<< y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
     JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
   }
   void test_shiftExpression_missing_LHS_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("<<", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("<<", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
     JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic());
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_shiftExpression_missing_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x <<", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("x <<", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_shiftExpression_missing_RHS_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super <<", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("super <<", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic());
   }
   void test_shiftExpression_precedence_unary_left() {
-    BinaryExpression expression = ParserTestCase.parseExpression("+ <<", [ParserErrorCode.USE_OF_UNARY_PLUS_OPERATOR]);
+    BinaryExpression expression = ParserTestCase.parseExpression("+ <<", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
   void test_shiftExpression_precedence_unary_right() {
-    BinaryExpression expression = ParserTestCase.parseExpression("<< +", [ParserErrorCode.USE_OF_UNARY_PLUS_OPERATOR]);
+    BinaryExpression expression = ParserTestCase.parseExpression("<< +", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.rightOperand);
   }
   void test_shiftExpression_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super << <<", []);
+    BinaryExpression expression = ParserTestCase.parseExpression("super << <<", [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
   void test_typedef_eof() {
@@ -6957,10 +7005,6 @@
         final __test = new RecoveryParserTest();
         runJUnitTest(__test, __test.test_additiveExpression_super);
       });
-      _ut.test('test_argumentDefinitionTest_missing_identifier', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_argumentDefinitionTest_missing_identifier);
-      });
       _ut.test('test_assignmentExpression_missing_LHS', () {
         final __test = new RecoveryParserTest();
         runJUnitTest(__test, __test.test_assignmentExpression_missing_LHS);
@@ -7065,6 +7109,10 @@
         final __test = new RecoveryParserTest();
         runJUnitTest(__test, __test.test_bitwiseXorExpression_super);
       });
+      _ut.test('test_classTypeAlias_withBody', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_classTypeAlias_withBody);
+      });
       _ut.test('test_conditionalExpression_missingElse', () {
         final __test = new RecoveryParserTest();
         runJUnitTest(__test, __test.test_conditionalExpression_missingElse);
@@ -7240,6 +7288,7 @@
     });
   }
 }
+
 /**
  * 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.
@@ -7250,7 +7299,7 @@
     JUnitTestCase.assertTrue(literal.isSynthetic());
   }
   void fail_illegalAssignmentToNonAssignable_superAssigned() {
-    ParserTestCase.parse5("parseExpression", "super = x;", [ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]);
+    ParserTestCase.parseExpression("super = x;", [ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]);
   }
   void fail_invalidCommentReference__new_nonIdentifier() {
     ParserTestCase.parse4("parseCommentReference", <Object> ["new 42", 0], "", [ParserErrorCode.INVALID_COMMENT_REFERENCE]);
@@ -7267,30 +7316,24 @@
   void fail_missingClosingParenthesis() {
     ParserTestCase.parse5("parseFormalParameterList", "(int a, int b ;", [ParserErrorCode.MISSING_CLOSING_PARENTHESIS]);
   }
-  void fail_missingExpressionInThrow_withCascade() {
-    ParserTestCase.parse5("parseThrowExpression", "throw;", [ParserErrorCode.MISSING_EXPRESSION_IN_THROW]);
-  }
-  void fail_missingExpressionInThrow_withoutCascade() {
-    ParserTestCase.parse5("parseThrowExpressionWithoutCascade", "throw;", [ParserErrorCode.MISSING_EXPRESSION_IN_THROW]);
-  }
   void fail_missingFunctionParameters_local_nonVoid_block() {
-    ParserTestCase.parse5("parseStatement", "int f { return x;}", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
+    ParserTestCase.parseStatement("int f { return x;}", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
   }
   void fail_missingFunctionParameters_local_nonVoid_expression() {
-    ParserTestCase.parse5("parseStatement", "int f => x;", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
+    ParserTestCase.parseStatement("int f => x;", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
   }
   void fail_namedFunctionExpression() {
     Expression expression = ParserTestCase.parse5("parsePrimaryExpression", "f() {}", [ParserErrorCode.NAMED_FUNCTION_EXPRESSION]);
     EngineTestCase.assertInstanceOf(FunctionExpression, expression);
   }
   void fail_unexpectedToken_invalidPostfixExpression() {
-    ParserTestCase.parse5("parseExpression", "f()++", [ParserErrorCode.UNEXPECTED_TOKEN]);
+    ParserTestCase.parseExpression("f()++", [ParserErrorCode.UNEXPECTED_TOKEN]);
   }
   void fail_voidVariable_initializer() {
-    ParserTestCase.parse5("parseStatement", "void x = 0;", [ParserErrorCode.VOID_VARIABLE]);
+    ParserTestCase.parseStatement("void x = 0;", [ParserErrorCode.VOID_VARIABLE]);
   }
   void fail_voidVariable_noInitializer() {
-    ParserTestCase.parse5("parseStatement", "void x;", [ParserErrorCode.VOID_VARIABLE]);
+    ParserTestCase.parseStatement("void x;", [ParserErrorCode.VOID_VARIABLE]);
   }
   void test_abstractClassMember_constructor() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "abstract C.c();", [ParserErrorCode.ABSTRACT_CLASS_MEMBER]);
@@ -7308,19 +7351,19 @@
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "abstract set m(v);", [ParserErrorCode.ABSTRACT_CLASS_MEMBER]);
   }
   void test_abstractTopLevelFunction_function() {
-    ParserTestCase.parse5("parseCompilationUnit", "abstract f(v) {}", [ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION]);
+    ParserTestCase.parseCompilationUnit("abstract f(v) {}", [ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION]);
   }
   void test_abstractTopLevelFunction_getter() {
-    ParserTestCase.parse5("parseCompilationUnit", "abstract get m {}", [ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION]);
+    ParserTestCase.parseCompilationUnit("abstract get m {}", [ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION]);
   }
   void test_abstractTopLevelFunction_setter() {
-    ParserTestCase.parse5("parseCompilationUnit", "abstract set m(v) {}", [ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION]);
+    ParserTestCase.parseCompilationUnit("abstract set m(v) {}", [ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION]);
   }
   void test_abstractTopLevelVariable() {
-    ParserTestCase.parse5("parseCompilationUnit", "abstract C f;", [ParserErrorCode.ABSTRACT_TOP_LEVEL_VARIABLE]);
+    ParserTestCase.parseCompilationUnit("abstract C f;", [ParserErrorCode.ABSTRACT_TOP_LEVEL_VARIABLE]);
   }
   void test_abstractTypeDef() {
-    ParserTestCase.parse5("parseCompilationUnit", "abstract typedef F();", [ParserErrorCode.ABSTRACT_TYPEDEF]);
+    ParserTestCase.parseCompilationUnit("abstract typedef F();", [ParserErrorCode.ABSTRACT_TYPEDEF]);
   }
   void test_breakOutsideOfLoop_breakInDoStatement() {
     ParserTestCase.parse5("parseDoStatement", "do {break;} while (x);", []);
@@ -7338,10 +7381,10 @@
     ParserTestCase.parse5("parseWhileStatement", "while (x) {break;}", []);
   }
   void test_breakOutsideOfLoop_functionExpression_inALoop() {
-    ParserTestCase.parse5("parseStatement", "for(; x;) {() {break;};}", [ParserErrorCode.BREAK_OUTSIDE_OF_LOOP]);
+    ParserTestCase.parseStatement("for(; x;) {() {break;};}", [ParserErrorCode.BREAK_OUTSIDE_OF_LOOP]);
   }
   void test_breakOutsideOfLoop_functionExpression_withALoop() {
-    ParserTestCase.parse5("parseStatement", "() {for (; x;) {break;}};", []);
+    ParserTestCase.parseStatement("() {for (; x;) {break;}};", []);
   }
   void test_constAndFinal() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "const final int x;", [ParserErrorCode.CONST_AND_FINAL]);
@@ -7350,13 +7393,25 @@
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "const var x;", [ParserErrorCode.CONST_AND_VAR]);
   }
   void test_constClass() {
-    ParserTestCase.parse5("parseCompilationUnit", "const class C {}", [ParserErrorCode.CONST_CLASS]);
+    ParserTestCase.parseCompilationUnit("const class C {}", [ParserErrorCode.CONST_CLASS]);
+  }
+  void test_constConstructorWithBody() {
+    ParserTestCase.parse4("parseClassMember", <Object> ["C"], "const C() {}", [ParserErrorCode.CONST_CONSTRUCTOR_WITH_BODY]);
+  }
+  void test_constFactory() {
+    ParserTestCase.parse4("parseClassMember", <Object> ["C"], "const factory C() {}", [ParserErrorCode.CONST_FACTORY]);
   }
   void test_constMethod() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "const int m() {}", [ParserErrorCode.CONST_METHOD]);
   }
+  void test_constructorWithReturnType() {
+    ParserTestCase.parse4("parseClassMember", <Object> ["C"], "C C() {}", [ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE]);
+  }
+  void test_constructorWithReturnType_var() {
+    ParserTestCase.parse4("parseClassMember", <Object> ["C"], "var C() {}", [ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE]);
+  }
   void test_constTypedef() {
-    ParserTestCase.parse5("parseCompilationUnit", "const typedef F();", [ParserErrorCode.CONST_TYPEDEF]);
+    ParserTestCase.parseCompilationUnit("const typedef F();", [ParserErrorCode.CONST_TYPEDEF]);
   }
   void test_continueOutsideOfLoop_continueInDoStatement() {
     ParserTestCase.parse5("parseDoStatement", "do {continue;} while (x);", []);
@@ -7374,10 +7429,10 @@
     ParserTestCase.parse5("parseWhileStatement", "while (x) {continue;}", []);
   }
   void test_continueOutsideOfLoop_functionExpression_inALoop() {
-    ParserTestCase.parse5("parseStatement", "for(; x;) {() {continue;};}", [ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]);
+    ParserTestCase.parseStatement("for(; x;) {() {continue;};}", [ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]);
   }
   void test_continueOutsideOfLoop_functionExpression_withALoop() {
-    ParserTestCase.parse5("parseStatement", "() {for (; x;) {continue;}};", []);
+    ParserTestCase.parseStatement("() {for (; x;) {continue;}};", []);
   }
   void test_continueWithoutLabelInCase_error() {
     ParserTestCase.parse5("parseSwitchStatement", "switch (x) {case 1: continue;}", [ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE]);
@@ -7389,11 +7444,11 @@
     ParserTestCase.parse5("parseWhileStatement", "while (a) { switch (b) {default: continue;}}", []);
   }
   void test_directiveAfterDeclaration_classBeforeDirective() {
-    CompilationUnit unit = ParserTestCase.parse5("parseCompilationUnit", "class Foo{} library l;", [ParserErrorCode.DIRECTIVE_AFTER_DECLARATION]);
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("class Foo{} library l;", [ParserErrorCode.DIRECTIVE_AFTER_DECLARATION]);
     JUnitTestCase.assertNotNull(unit);
   }
   void test_directiveAfterDeclaration_classBetweenDirectives() {
-    CompilationUnit unit = ParserTestCase.parse5("parseCompilationUnit", "library l;\nclass Foo{}\npart 'a.dart';", [ParserErrorCode.DIRECTIVE_AFTER_DECLARATION]);
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("library l;\nclass Foo{}\npart 'a.dart';", [ParserErrorCode.DIRECTIVE_AFTER_DECLARATION]);
     JUnitTestCase.assertNotNull(unit);
   }
   void test_duplicatedModifier_const() {
@@ -7409,7 +7464,7 @@
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "final final m;", [ParserErrorCode.DUPLICATED_MODIFIER]);
   }
   void test_duplicatedModifier_static() {
-    ParserTestCase.parse4("parseClassMember", <Object> ["C"], "static static m;", [ParserErrorCode.DUPLICATED_MODIFIER]);
+    ParserTestCase.parse4("parseClassMember", <Object> ["C"], "static static var m;", [ParserErrorCode.DUPLICATED_MODIFIER]);
   }
   void test_duplicatedModifier_var() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "var var m;", [ParserErrorCode.DUPLICATED_MODIFIER]);
@@ -7438,6 +7493,9 @@
   void test_expectedExecutable_topLevel_beforeType() {
     ParserTestCase.parse4("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "4 score", [ParserErrorCode.EXPECTED_EXECUTABLE]);
   }
+  void test_expectedInterpolationIdentifier() {
+    ParserTestCase.parse5("parseStringLiteral", "'\$x\$'", [ParserErrorCode.MISSING_IDENTIFIER]);
+  }
   void test_expectedStringLiteral() {
     StringLiteral expression = ParserTestCase.parse5("parseStringLiteral", "1", [ParserErrorCode.EXPECTED_STRING_LITERAL]);
     JUnitTestCase.assertTrue(expression.isSynthetic());
@@ -7446,13 +7504,24 @@
     ParserTestCase.parse5("parseArgumentList", "(x, y z)", [ParserErrorCode.EXPECTED_TOKEN]);
   }
   void test_expectedToken_semicolonMissingAfterExpression() {
-    ParserTestCase.parse5("parseStatement", "x", [ParserErrorCode.EXPECTED_TOKEN]);
+    ParserTestCase.parseStatement("x", [ParserErrorCode.EXPECTED_TOKEN]);
   }
   void test_expectedToken_whileMissingInDoStatement() {
-    ParserTestCase.parse5("parseStatement", "do {} (x);", [ParserErrorCode.EXPECTED_TOKEN]);
+    ParserTestCase.parseStatement("do {} (x);", [ParserErrorCode.EXPECTED_TOKEN]);
+  }
+  void test_expectedTwoMapTypeArguments_one() {
+    Expression expression = ParserTestCase.parse5("parsePrimaryExpression", "<int>{}", [ParserErrorCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS]);
+    EngineTestCase.assertInstanceOf(MapLiteral, expression);
+  }
+  void test_expectedTwoMapTypeArguments_three() {
+    Expression expression = ParserTestCase.parse5("parsePrimaryExpression", "<int, int, int>{}", [ParserErrorCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS]);
+    EngineTestCase.assertInstanceOf(MapLiteral, expression);
+  }
+  void test_expectedTypeName_is() {
+    ParserTestCase.parseExpression("x is", [ParserErrorCode.EXPECTED_TYPE_NAME]);
   }
   void test_exportDirectiveAfterPartDirective() {
-    ParserTestCase.parse5("parseCompilationUnit", "part 'a.dart'; export 'b.dart';", [ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE]);
+    ParserTestCase.parseCompilationUnit("part 'a.dart'; export 'b.dart';", [ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE]);
   }
   void test_externalAfterConst() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "const external C();", [ParserErrorCode.EXTERNAL_AFTER_CONST]);
@@ -7464,7 +7533,7 @@
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "static external int m();", [ParserErrorCode.EXTERNAL_AFTER_STATIC]);
   }
   void test_externalClass() {
-    ParserTestCase.parse5("parseCompilationUnit", "external class C {}", [ParserErrorCode.EXTERNAL_CLASS]);
+    ParserTestCase.parseCompilationUnit("external class C {}", [ParserErrorCode.EXTERNAL_CLASS]);
   }
   void test_externalConstructorWithBody_factory() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "external factory C() {}", [ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY]);
@@ -7500,13 +7569,16 @@
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "external set x(int value) {}", [ParserErrorCode.EXTERNAL_SETTER_WITH_BODY]);
   }
   void test_externalTypedef() {
-    ParserTestCase.parse5("parseCompilationUnit", "external typedef F();", [ParserErrorCode.EXTERNAL_TYPEDEF]);
+    ParserTestCase.parseCompilationUnit("external typedef F();", [ParserErrorCode.EXTERNAL_TYPEDEF]);
   }
   void test_factoryTopLevelDeclaration_class() {
-    ParserTestCase.parse5("parseCompilationUnit", "factory class C {}", [ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION]);
+    ParserTestCase.parseCompilationUnit("factory class C {}", [ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION]);
   }
   void test_factoryTopLevelDeclaration_typedef() {
-    ParserTestCase.parse5("parseCompilationUnit", "factory typedef F();", [ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION]);
+    ParserTestCase.parseCompilationUnit("factory typedef F();", [ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION]);
+  }
+  void test_factoryWithoutBody() {
+    ParserTestCase.parse4("parseClassMember", <Object> ["C"], "factory C();", [ParserErrorCode.FACTORY_WITHOUT_BODY]);
   }
   void test_fieldInitializerOutsideConstructor() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "void m(this.x);", [ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR]);
@@ -7515,7 +7587,7 @@
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "final var x;", [ParserErrorCode.FINAL_AND_VAR]);
   }
   void test_finalClass() {
-    ParserTestCase.parse5("parseCompilationUnit", "final class C {}", [ParserErrorCode.FINAL_CLASS]);
+    ParserTestCase.parseCompilationUnit("final class C {}", [ParserErrorCode.FINAL_CLASS]);
   }
   void test_finalConstructor() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "final C() {}", [ParserErrorCode.FINAL_CONSTRUCTOR]);
@@ -7524,22 +7596,22 @@
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "final int m() {}", [ParserErrorCode.FINAL_METHOD]);
   }
   void test_finalTypedef() {
-    ParserTestCase.parse5("parseCompilationUnit", "final typedef F();", [ParserErrorCode.FINAL_TYPEDEF]);
+    ParserTestCase.parseCompilationUnit("final typedef F();", [ParserErrorCode.FINAL_TYPEDEF]);
   }
   void test_getterWithParameters() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "int get x() {}", [ParserErrorCode.GETTER_WITH_PARAMETERS]);
   }
   void test_illegalAssignmentToNonAssignable_superAssigned() {
-    ParserTestCase.parse5("parseExpression", "super = x;", [ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR, ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]);
+    ParserTestCase.parseExpression("super = x;", [ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR, ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]);
   }
   void test_implementsBeforeExtends() {
-    ParserTestCase.parse5("parseCompilationUnit", "class A implements B extends C {}", [ParserErrorCode.IMPLEMENTS_BEFORE_EXTENDS]);
+    ParserTestCase.parseCompilationUnit("class A implements B extends C {}", [ParserErrorCode.IMPLEMENTS_BEFORE_EXTENDS]);
   }
   void test_implementsBeforeWith() {
-    ParserTestCase.parse5("parseCompilationUnit", "class A extends B implements C with D {}", [ParserErrorCode.IMPLEMENTS_BEFORE_WITH]);
+    ParserTestCase.parseCompilationUnit("class A extends B implements C with D {}", [ParserErrorCode.IMPLEMENTS_BEFORE_WITH]);
   }
   void test_importDirectiveAfterPartDirective() {
-    ParserTestCase.parse5("parseCompilationUnit", "part 'a.dart'; import 'b.dart';", [ParserErrorCode.IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE]);
+    ParserTestCase.parseCompilationUnit("part 'a.dart'; import 'b.dart';", [ParserErrorCode.IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE]);
   }
   void test_initializedVariableInForEach() {
     ParserTestCase.parse5("parseForStatement", "for (int a = 0 in foo) {}", [ParserErrorCode.INITIALIZED_VARIABLE_IN_FOR_EACH]);
@@ -7553,6 +7625,9 @@
   void test_invalidHexEscape_tooFewDigits() {
     ParserTestCase.parse5("parseStringLiteral", "'\\x0'", [ParserErrorCode.INVALID_HEX_ESCAPE]);
   }
+  void test_invalidInterpolationIdentifier_startWithDigit() {
+    ParserTestCase.parse5("parseStringLiteral", "'\$1'", [ParserErrorCode.MISSING_IDENTIFIER]);
+  }
   void test_invalidOperator() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "void operator ===(x) {}", [ParserErrorCode.INVALID_OPERATOR]);
   }
@@ -7578,61 +7653,73 @@
     ParserTestCase.parse5("parseStringLiteral", "'\\u{12345678}'", [ParserErrorCode.INVALID_UNICODE_ESCAPE, ParserErrorCode.INVALID_CODE_POINT]);
   }
   void test_libraryDirectiveNotFirst() {
-    ParserTestCase.parse5("parseCompilationUnit", "import 'x.dart'; library l;", [ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST]);
+    ParserTestCase.parseCompilationUnit("import 'x.dart'; library l;", [ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST]);
   }
   void test_libraryDirectiveNotFirst_afterPart() {
-    CompilationUnit unit = ParserTestCase.parse5("parseCompilationUnit", "part 'a.dart';\nlibrary l;", [ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST]);
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("part 'a.dart';\nlibrary l;", [ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST]);
     JUnitTestCase.assertNotNull(unit);
   }
   void test_missingAssignableSelector_identifiersAssigned() {
-    ParserTestCase.parse5("parseExpression", "x.y = y;", []);
+    ParserTestCase.parseExpression("x.y = y;", []);
   }
   void test_missingAssignableSelector_primarySelectorPostfix() {
-    ParserTestCase.parse5("parseExpression", "x(y)(z)++", [ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR]);
+    ParserTestCase.parseExpression("x(y)(z)++", [ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR]);
   }
   void test_missingAssignableSelector_selector() {
-    ParserTestCase.parse5("parseExpression", "x(y)(z).a++", []);
+    ParserTestCase.parseExpression("x(y)(z).a++", []);
   }
   void test_missingAssignableSelector_superPrimaryExpression() {
     SuperExpression expression = ParserTestCase.parse5("parsePrimaryExpression", "super", [ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR]);
     JUnitTestCase.assertNotNull(expression.keyword);
   }
   void test_missingAssignableSelector_superPropertyAccessAssigned() {
-    ParserTestCase.parse5("parseExpression", "super.x = x;", []);
+    ParserTestCase.parseExpression("super.x = x;", []);
   }
   void test_missingCatchOrFinally() {
     TryStatement statement = ParserTestCase.parse5("parseTryStatement", "try {}", [ParserErrorCode.MISSING_CATCH_OR_FINALLY]);
     JUnitTestCase.assertNotNull(statement);
   }
   void test_missingClassBody() {
-    ParserTestCase.parse5("parseCompilationUnit", "class A class B {}", [ParserErrorCode.MISSING_CLASS_BODY]);
+    ParserTestCase.parseCompilationUnit("class A class B {}", [ParserErrorCode.MISSING_CLASS_BODY]);
   }
-  void test_missingConstFinalVarOrType() {
+  void test_missingConstFinalVarOrType_static() {
+    ParserTestCase.parseCompilationUnit("class A { static f; }", [ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE]);
+  }
+  void test_missingConstFinalVarOrType_topLevel() {
     ParserTestCase.parse4("parseFinalConstVarOrType", <Object> [false], "a;", [ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE]);
   }
+  void test_missingExpressionInThrow_withCascade() {
+    ParserTestCase.parse5("parseThrowExpression", "throw;", [ParserErrorCode.MISSING_EXPRESSION_IN_THROW]);
+  }
+  void test_missingExpressionInThrow_withoutCascade() {
+    ParserTestCase.parse5("parseThrowExpressionWithoutCascade", "throw;", [ParserErrorCode.MISSING_EXPRESSION_IN_THROW]);
+  }
   void test_missingFunctionBody_emptyNotAllowed() {
-    ParserTestCase.parse4("parseFunctionBody", <Object> [false, false], ";", [ParserErrorCode.MISSING_FUNCTION_BODY]);
+    ParserTestCase.parse4("parseFunctionBody", <Object> [false, ParserErrorCode.MISSING_FUNCTION_BODY, false], ";", [ParserErrorCode.MISSING_FUNCTION_BODY]);
   }
   void test_missingFunctionBody_invalid() {
-    ParserTestCase.parse4("parseFunctionBody", <Object> [false, false], "return 0;", [ParserErrorCode.MISSING_FUNCTION_BODY]);
+    ParserTestCase.parse4("parseFunctionBody", <Object> [false, ParserErrorCode.MISSING_FUNCTION_BODY, false], "return 0;", [ParserErrorCode.MISSING_FUNCTION_BODY]);
   }
   void test_missingFunctionParameters_local_void_block() {
-    ParserTestCase.parse5("parseStatement", "void f { return x;}", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
+    ParserTestCase.parseStatement("void f { return x;}", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
   }
   void test_missingFunctionParameters_local_void_expression() {
-    ParserTestCase.parse5("parseStatement", "void f => x;", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
+    ParserTestCase.parseStatement("void f => x;", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
   }
   void test_missingFunctionParameters_topLevel_nonVoid_block() {
-    ParserTestCase.parse5("parseCompilationUnit", "int f { return x;}", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
+    ParserTestCase.parseCompilationUnit("int f { return x;}", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
   }
   void test_missingFunctionParameters_topLevel_nonVoid_expression() {
-    ParserTestCase.parse5("parseCompilationUnit", "int f => x;", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
+    ParserTestCase.parseCompilationUnit("int f => x;", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
   }
   void test_missingFunctionParameters_topLevel_void_block() {
-    ParserTestCase.parse5("parseCompilationUnit", "void f { return x;}", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
+    ParserTestCase.parseCompilationUnit("void f { return x;}", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
   }
   void test_missingFunctionParameters_topLevel_void_expression() {
-    ParserTestCase.parse5("parseCompilationUnit", "void f => x;", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
+    ParserTestCase.parseCompilationUnit("void f => x;", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
+  }
+  void test_missingIdentifier_afterOperator() {
+    ParserTestCase.parse5("parseMultiplicativeExpression", "1 *", [ParserErrorCode.MISSING_IDENTIFIER]);
   }
   void test_missingIdentifier_functionDeclaration_returnTypeWithoutName() {
     ParserTestCase.parse5("parseFunctionDeclarationStatement", "A<T> () {}", [ParserErrorCode.MISSING_IDENTIFIER]);
@@ -7645,11 +7732,11 @@
     ParserTestCase.parse4("parseOperator", <Object> [emptyCommentAndMetadata(), null, null], "+(x) {}", [ParserErrorCode.MISSING_KEYWORD_OPERATOR]);
   }
   void test_missingNameInLibraryDirective() {
-    CompilationUnit unit = ParserTestCase.parse5("parseCompilationUnit", "library;", [ParserErrorCode.MISSING_NAME_IN_LIBRARY_DIRECTIVE]);
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("library;", [ParserErrorCode.MISSING_NAME_IN_LIBRARY_DIRECTIVE]);
     JUnitTestCase.assertNotNull(unit);
   }
   void test_missingNameInPartOfDirective() {
-    CompilationUnit unit = ParserTestCase.parse5("parseCompilationUnit", "part of;", [ParserErrorCode.MISSING_NAME_IN_PART_OF_DIRECTIVE]);
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("part of;", [ParserErrorCode.MISSING_NAME_IN_PART_OF_DIRECTIVE]);
     JUnitTestCase.assertNotNull(unit);
   }
   void test_missingTerminatorForParameterGroup_named() {
@@ -7659,13 +7746,13 @@
     ParserTestCase.parse5("parseFormalParameterList", "(a, [b = 0)", [ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP]);
   }
   void test_missingTypedefParameters_nonVoid() {
-    ParserTestCase.parse5("parseCompilationUnit", "typedef int F;", [ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]);
+    ParserTestCase.parseCompilationUnit("typedef int F;", [ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]);
   }
   void test_missingTypedefParameters_typeParameters() {
-    ParserTestCase.parse5("parseCompilationUnit", "typedef F<E>;", [ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]);
+    ParserTestCase.parseCompilationUnit("typedef F<E>;", [ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]);
   }
   void test_missingTypedefParameters_void() {
-    ParserTestCase.parse5("parseCompilationUnit", "typedef void F;", [ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]);
+    ParserTestCase.parseCompilationUnit("typedef void F;", [ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]);
   }
   void test_missingVariableInForEach() {
     ParserTestCase.parse5("parseForStatement", "for (a < b in foo) {}", [ParserErrorCode.MISSING_VARIABLE_IN_FOR_EACH]);
@@ -7677,13 +7764,13 @@
     ParserTestCase.parse5("parseFormalParameterList", "(a, [b], {c})", [ParserErrorCode.MIXED_PARAMETER_GROUPS]);
   }
   void test_multipleLibraryDirectives() {
-    ParserTestCase.parse5("parseCompilationUnit", "library l; library m;", [ParserErrorCode.MULTIPLE_LIBRARY_DIRECTIVES]);
+    ParserTestCase.parseCompilationUnit("library l; library m;", [ParserErrorCode.MULTIPLE_LIBRARY_DIRECTIVES]);
   }
   void test_multipleNamedParameterGroups() {
     ParserTestCase.parse5("parseFormalParameterList", "(a, {b}, {c})", [ParserErrorCode.MULTIPLE_NAMED_PARAMETER_GROUPS]);
   }
   void test_multiplePartOfDirectives() {
-    ParserTestCase.parse5("parseCompilationUnit", "part of l; part of m;", [ParserErrorCode.MULTIPLE_PART_OF_DIRECTIVES]);
+    ParserTestCase.parseCompilationUnit("part of l; part of m;", [ParserErrorCode.MULTIPLE_PART_OF_DIRECTIVES]);
   }
   void test_multiplePositionalParameterGroups() {
     ParserTestCase.parse5("parseFormalParameterList", "(a, [b], [c])", [ParserErrorCode.MULTIPLE_POSITIONAL_PARAMETER_GROUPS]);
@@ -7701,18 +7788,18 @@
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "factory int m() {}", [ParserErrorCode.NON_CONSTRUCTOR_FACTORY]);
   }
   void test_nonIdentifierLibraryName_library() {
-    CompilationUnit unit = ParserTestCase.parse5("parseCompilationUnit", "library 'lib';", [ParserErrorCode.NON_IDENTIFIER_LIBRARY_NAME]);
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("library 'lib';", [ParserErrorCode.NON_IDENTIFIER_LIBRARY_NAME]);
     JUnitTestCase.assertNotNull(unit);
   }
   void test_nonIdentifierLibraryName_partOf() {
-    CompilationUnit unit = ParserTestCase.parse5("parseCompilationUnit", "part of 'lib';", [ParserErrorCode.NON_IDENTIFIER_LIBRARY_NAME]);
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("part of 'lib';", [ParserErrorCode.NON_IDENTIFIER_LIBRARY_NAME]);
     JUnitTestCase.assertNotNull(unit);
   }
   void test_nonPartOfDirectiveInPart_after() {
-    ParserTestCase.parse5("parseCompilationUnit", "part of l; part 'f.dart';", [ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART]);
+    ParserTestCase.parseCompilationUnit("part of l; part 'f.dart';", [ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART]);
   }
   void test_nonPartOfDirectiveInPart_before() {
-    ParserTestCase.parse5("parseCompilationUnit", "part 'f.dart'; part of m;", [ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART]);
+    ParserTestCase.parseCompilationUnit("part 'f.dart'; part of m;", [ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART]);
   }
   void test_nonUserDefinableOperator() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "operator +=(int x) => x + 1;", [ParserErrorCode.NON_USER_DEFINABLE_OPERATOR]);
@@ -7735,20 +7822,26 @@
   void test_staticConstructor() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "static C.m() {}", [ParserErrorCode.STATIC_CONSTRUCTOR]);
   }
+  void test_staticGetterWithoutBody() {
+    ParserTestCase.parse4("parseClassMember", <Object> ["C"], "static get m;", [ParserErrorCode.STATIC_GETTER_WITHOUT_BODY]);
+  }
   void test_staticOperator_noReturnType() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "static operator +(int x) => x + 1;", [ParserErrorCode.STATIC_OPERATOR]);
   }
   void test_staticOperator_returnType() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "static int operator +(int x) => x + 1;", [ParserErrorCode.STATIC_OPERATOR]);
   }
+  void test_staticSetterWithoutBody() {
+    ParserTestCase.parse4("parseClassMember", <Object> ["C"], "static set m(x);", [ParserErrorCode.STATIC_SETTER_WITHOUT_BODY]);
+  }
   void test_staticTopLevelDeclaration_class() {
-    ParserTestCase.parse5("parseCompilationUnit", "static class C {}", [ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION]);
+    ParserTestCase.parseCompilationUnit("static class C {}", [ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION]);
   }
   void test_staticTopLevelDeclaration_typedef() {
-    ParserTestCase.parse5("parseCompilationUnit", "static typedef F();", [ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION]);
+    ParserTestCase.parseCompilationUnit("static typedef F();", [ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION]);
   }
   void test_staticTopLevelDeclaration_variable() {
-    ParserTestCase.parse5("parseCompilationUnit", "static var x;", [ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION]);
+    ParserTestCase.parseCompilationUnit("static var x;", [ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION]);
   }
   void test_switchHasCaseAfterDefaultCase() {
     ParserTestCase.parse5("parseSwitchStatement", "switch (a) {default: return 0; case 1: return 1;}", [ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE]);
@@ -7781,22 +7874,24 @@
     ParserTestCase.parse4("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class C { int x; ; int y;}", [ParserErrorCode.UNEXPECTED_TOKEN]);
   }
   void test_unexpectedToken_semicolonBetweenCompilationUnitMembers() {
-    ParserTestCase.parse5("parseCompilationUnit", "int x; ; int y;", [ParserErrorCode.UNEXPECTED_TOKEN]);
+    ParserTestCase.parseCompilationUnit("int x; ; int y;", [ParserErrorCode.UNEXPECTED_TOKEN]);
   }
   void test_useOfUnaryPlusOperator() {
-    ParserTestCase.parse5("parseUnaryExpression", "+x", [ParserErrorCode.USE_OF_UNARY_PLUS_OPERATOR]);
+    SimpleIdentifier expression = ParserTestCase.parse5("parseUnaryExpression", "+x", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf(SimpleIdentifier, expression);
+    JUnitTestCase.assertTrue(expression.isSynthetic());
+  }
+  void test_varAsTypeName_as() {
+    ParserTestCase.parseExpression("x as var", [ParserErrorCode.VAR_AS_TYPE_NAME]);
   }
   void test_varClass() {
-    ParserTestCase.parse5("parseCompilationUnit", "var class C {}", [ParserErrorCode.VAR_CLASS]);
-  }
-  void test_varConstructor() {
-    ParserTestCase.parse4("parseClassMember", <Object> ["C"], "var C() {}", [ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE]);
+    ParserTestCase.parseCompilationUnit("var class C {}", [ParserErrorCode.VAR_CLASS]);
   }
   void test_varReturnType() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "var m() {}", [ParserErrorCode.VAR_RETURN_TYPE]);
   }
   void test_varTypedef() {
-    ParserTestCase.parse5("parseCompilationUnit", "var typedef F();", [ParserErrorCode.VAR_TYPEDEF]);
+    ParserTestCase.parseCompilationUnit("var typedef F();", [ParserErrorCode.VAR_TYPEDEF]);
   }
   void test_voidField_initializer() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "void x = 0;", [ParserErrorCode.VOID_VARIABLE]);
@@ -7808,7 +7903,7 @@
     ParserTestCase.parse5("parseNormalFormalParameter", "void a)", [ParserErrorCode.VOID_PARAMETER]);
   }
   void test_withBeforeExtends() {
-    ParserTestCase.parse5("parseCompilationUnit", "class A with B extends C {}", [ParserErrorCode.WITH_BEFORE_EXTENDS]);
+    ParserTestCase.parseCompilationUnit("class A with B extends C {}", [ParserErrorCode.WITH_BEFORE_EXTENDS]);
   }
   void test_withWithoutExtends() {
     ParserTestCase.parse4("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class A with B, C {}", [ParserErrorCode.WITH_WITHOUT_EXTENDS]);
@@ -7907,6 +8002,14 @@
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_constClass);
       });
+      _ut.test('test_constConstructorWithBody', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_constConstructorWithBody);
+      });
+      _ut.test('test_constFactory', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_constFactory);
+      });
       _ut.test('test_constMethod', () {
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_constMethod);
@@ -7915,6 +8018,14 @@
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_constTypedef);
       });
+      _ut.test('test_constructorWithReturnType', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_constructorWithReturnType);
+      });
+      _ut.test('test_constructorWithReturnType_var', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_constructorWithReturnType_var);
+      });
       _ut.test('test_continueOutsideOfLoop_continueInDoStatement', () {
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_continueOutsideOfLoop_continueInDoStatement);
@@ -8019,6 +8130,10 @@
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_expectedExecutable_topLevel_beforeType);
       });
+      _ut.test('test_expectedInterpolationIdentifier', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_expectedInterpolationIdentifier);
+      });
       _ut.test('test_expectedStringLiteral', () {
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_expectedStringLiteral);
@@ -8035,6 +8150,18 @@
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_expectedToken_whileMissingInDoStatement);
       });
+      _ut.test('test_expectedTwoMapTypeArguments_one', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_expectedTwoMapTypeArguments_one);
+      });
+      _ut.test('test_expectedTwoMapTypeArguments_three', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_expectedTwoMapTypeArguments_three);
+      });
+      _ut.test('test_expectedTypeName_is', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_expectedTypeName_is);
+      });
       _ut.test('test_exportDirectiveAfterPartDirective', () {
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_exportDirectiveAfterPartDirective);
@@ -8111,6 +8238,10 @@
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_factoryTopLevelDeclaration_typedef);
       });
+      _ut.test('test_factoryWithoutBody', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_factoryWithoutBody);
+      });
       _ut.test('test_fieldInitializerOutsideConstructor', () {
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_fieldInitializerOutsideConstructor);
@@ -8171,6 +8302,10 @@
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_invalidHexEscape_tooFewDigits);
       });
+      _ut.test('test_invalidInterpolationIdentifier_startWithDigit', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_invalidInterpolationIdentifier_startWithDigit);
+      });
       _ut.test('test_invalidOperator', () {
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_invalidOperator);
@@ -8239,9 +8374,21 @@
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_missingClassBody);
       });
-      _ut.test('test_missingConstFinalVarOrType', () {
+      _ut.test('test_missingConstFinalVarOrType_static', () {
         final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingConstFinalVarOrType);
+        runJUnitTest(__test, __test.test_missingConstFinalVarOrType_static);
+      });
+      _ut.test('test_missingConstFinalVarOrType_topLevel', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingConstFinalVarOrType_topLevel);
+      });
+      _ut.test('test_missingExpressionInThrow_withCascade', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingExpressionInThrow_withCascade);
+      });
+      _ut.test('test_missingExpressionInThrow_withoutCascade', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingExpressionInThrow_withoutCascade);
       });
       _ut.test('test_missingFunctionBody_emptyNotAllowed', () {
         final __test = new ErrorParserTest();
@@ -8275,6 +8422,10 @@
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_missingFunctionParameters_topLevel_void_expression);
       });
+      _ut.test('test_missingIdentifier_afterOperator', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingIdentifier_afterOperator);
+      });
       _ut.test('test_missingIdentifier_functionDeclaration_returnTypeWithoutName', () {
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_missingIdentifier_functionDeclaration_returnTypeWithoutName);
@@ -8403,6 +8554,10 @@
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_staticConstructor);
       });
+      _ut.test('test_staticGetterWithoutBody', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_staticGetterWithoutBody);
+      });
       _ut.test('test_staticOperator_noReturnType', () {
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_staticOperator_noReturnType);
@@ -8411,6 +8566,10 @@
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_staticOperator_returnType);
       });
+      _ut.test('test_staticSetterWithoutBody', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_staticSetterWithoutBody);
+      });
       _ut.test('test_staticTopLevelDeclaration_class', () {
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_staticTopLevelDeclaration_class);
@@ -8471,14 +8630,14 @@
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_useOfUnaryPlusOperator);
       });
+      _ut.test('test_varAsTypeName_as', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_varAsTypeName_as);
+      });
       _ut.test('test_varClass', () {
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_varClass);
       });
-      _ut.test('test_varConstructor', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_varConstructor);
-      });
       _ut.test('test_varReturnType', () {
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_varReturnType);
@@ -8540,6 +8699,8 @@
   'advance_0': new MethodTrampoline(0, (Parser target) => target.advance()),
   'appendScalarValue_5': new MethodTrampoline(5, (Parser target, arg0, arg1, arg2, arg3, arg4) => target.appendScalarValue(arg0, arg1, arg2, arg3, arg4)),
   'computeStringValue_1': new MethodTrampoline(1, (Parser target, arg0) => target.computeStringValue(arg0)),
+  'convertToFunctionDeclaration_1': new MethodTrampoline(1, (Parser target, arg0) => target.convertToFunctionDeclaration(arg0)),
+  'couldBeStartOfCompilationUnitMember_0': new MethodTrampoline(0, (Parser target) => target.couldBeStartOfCompilationUnitMember()),
   'createSyntheticIdentifier_0': new MethodTrampoline(0, (Parser target) => target.createSyntheticIdentifier()),
   'createSyntheticStringLiteral_0': new MethodTrampoline(0, (Parser target) => target.createSyntheticStringLiteral()),
   'createSyntheticToken_1': new MethodTrampoline(1, (Parser target, arg0) => target.createSyntheticToken(arg0)),
@@ -8547,6 +8708,7 @@
   'expect_1': new MethodTrampoline(1, (Parser target, arg0) => target.expect(arg0)),
   'findRange_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.findRange(arg0, arg1)),
   'getCodeBlockRanges_1': new MethodTrampoline(1, (Parser target, arg0) => target.getCodeBlockRanges(arg0)),
+  'getEndToken_1': new MethodTrampoline(1, (Parser target, arg0) => target.getEndToken(arg0)),
   'hasReturnTypeInTypeAlias_0': new MethodTrampoline(0, (Parser target) => target.hasReturnTypeInTypeAlias()),
   'isFunctionDeclaration_0': new MethodTrampoline(0, (Parser target) => target.isFunctionDeclaration()),
   'isFunctionExpression_1': new MethodTrampoline(1, (Parser target, arg0) => target.isFunctionExpression(arg0)),
@@ -8606,7 +8768,7 @@
   'parseFormalParameter_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseFormalParameter(arg0)),
   'parseFormalParameterList_0': new MethodTrampoline(0, (Parser target) => target.parseFormalParameterList()),
   'parseForStatement_0': new MethodTrampoline(0, (Parser target) => target.parseForStatement()),
-  'parseFunctionBody_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseFunctionBody(arg0, arg1)),
+  'parseFunctionBody_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.parseFunctionBody(arg0, arg1, arg2)),
   'parseFunctionDeclaration_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.parseFunctionDeclaration(arg0, arg1, arg2)),
   'parseFunctionDeclarationStatement_0': new MethodTrampoline(0, (Parser target) => target.parseFunctionDeclarationStatement()),
   'parseFunctionDeclarationStatement_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseFunctionDeclarationStatement2(arg0, arg1)),
@@ -8674,7 +8836,7 @@
   'peek_0': new MethodTrampoline(0, (Parser target) => target.peek()),
   'peek_1': new MethodTrampoline(1, (Parser target, arg0) => target.peek2(arg0)),
   'reportError_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.reportError(arg0, arg1, arg2)),
-  'reportError_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.reportError4(arg0, arg1)),
+  'reportError_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.reportError7(arg0, arg1)),
   'skipFinalConstVarOrType_1': new MethodTrampoline(1, (Parser target, arg0) => target.skipFinalConstVarOrType(arg0)),
   'skipFormalParameterList_1': new MethodTrampoline(1, (Parser target, arg0) => target.skipFormalParameterList(arg0)),
   'skipPastMatchingToken_1': new MethodTrampoline(1, (Parser target, arg0) => target.skipPastMatchingToken(arg0)),
diff --git a/pkg/analyzer_experimental/test/generated/resolver_test.dart b/pkg/analyzer_experimental/test/generated/resolver_test.dart
index fd28a66..c42002c 100644
--- a/pkg/analyzer_experimental/test/generated/resolver_test.dart
+++ b/pkg/analyzer_experimental/test/generated/resolver_test.dart
@@ -26,7 +26,7 @@
 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;", "  }", "}"]));
-    LibraryElement library = resolve(source, []);
+    LibraryElement library = resolve(source);
     assertNoErrors();
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
@@ -37,11 +37,11 @@
     IfStatement ifStatement = body2.block.statements[0] as IfStatement;
     ReturnStatement statement = ((ifStatement.thenStatement as Block)).statements[0] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.staticType);
+    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
   }
   void test_assert() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "A f(var p) {", "  assert (p is A);", "  return p;", "}"]));
-    LibraryElement library = resolve(source, []);
+    LibraryElement library = resolve(source);
     assertNoErrors();
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
@@ -51,11 +51,11 @@
     BlockFunctionBody body2 = function.functionExpression.body as BlockFunctionBody;
     ReturnStatement statement = body2.block.statements[1] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.staticType);
+    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
   }
   void test_assignment() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  var v;", "  v = 0;", "  return v;", "}"]));
-    LibraryElement library = resolve(source, []);
+    LibraryElement library = resolve(source);
     assertNoErrors();
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
@@ -63,11 +63,11 @@
     BlockFunctionBody body2 = function.functionExpression.body as BlockFunctionBody;
     ReturnStatement statement = body2.block.statements[2] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeProvider.intType, variableName.staticType);
+    JUnitTestCase.assertSame(typeProvider.intType, variableName.propagatedType);
   }
   void test_assignment_afterInitializer() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  var v = 0;", "  v = 1.0;", "  return v;", "}"]));
-    LibraryElement library = resolve(source, []);
+    LibraryElement library = resolve(source);
     assertNoErrors();
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
@@ -75,11 +75,11 @@
     BlockFunctionBody body2 = function.functionExpression.body as BlockFunctionBody;
     ReturnStatement statement = body2.block.statements[2] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeProvider.doubleType, variableName.staticType);
+    JUnitTestCase.assertSame(typeProvider.doubleType, variableName.propagatedType);
   }
   void test_forEach() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "A f(List<A> p) {", "  for (var e in p) {", "    return e;", "  }", "}"]));
-    LibraryElement library = resolve(source, []);
+    LibraryElement library = resolve(source);
     assertNoErrors();
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
@@ -90,11 +90,11 @@
     ForEachStatement forStatement = body2.block.statements[0] as ForEachStatement;
     ReturnStatement statement = ((forStatement.body as Block)).statements[0] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.staticType);
+    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
   }
   void test_initializer() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  var v = 0;", "  return v;", "}"]));
-    LibraryElement library = resolve(source, []);
+    LibraryElement library = resolve(source);
     assertNoErrors();
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
@@ -102,22 +102,22 @@
     BlockFunctionBody body2 = function.functionExpression.body as BlockFunctionBody;
     ReturnStatement statement = body2.block.statements[1] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeProvider.intType, variableName.staticType);
+    JUnitTestCase.assertSame(typeProvider.intType, variableName.propagatedType);
   }
   void test_initializer_dereference() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  var v = 'String';", "  v.", "}"]));
-    LibraryElement library = resolve(source, []);
+    LibraryElement library = resolve(source);
     CompilationUnit unit = resolveCompilationUnit(source, library);
     FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
     BlockFunctionBody body2 = function.functionExpression.body as BlockFunctionBody;
     ExpressionStatement statement = body2.block.statements[1] as ExpressionStatement;
     PrefixedIdentifier invocation = statement.expression as PrefixedIdentifier;
     SimpleIdentifier variableName = invocation.prefix;
-    JUnitTestCase.assertSame(typeProvider.stringType, variableName.staticType);
+    JUnitTestCase.assertSame(typeProvider.stringType, variableName.propagatedType);
   }
   void test_is_conditional() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "A f(var p) {", "  return (p is A) ? p : null;", "}"]));
-    LibraryElement library = resolve(source, []);
+    LibraryElement library = resolve(source);
     assertNoErrors();
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
@@ -128,11 +128,11 @@
     ReturnStatement statement = body2.block.statements[0] as ReturnStatement;
     ConditionalExpression conditional = statement.expression as ConditionalExpression;
     SimpleIdentifier variableName = conditional.thenExpression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.staticType);
+    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
   }
   void test_is_if() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "A f(var p) {", "  if (p is A) {", "    return p;", "  } else {", "    return null;", "  }", "}"]));
-    LibraryElement library = resolve(source, []);
+    LibraryElement library = resolve(source);
     assertNoErrors();
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
@@ -143,26 +143,24 @@
     IfStatement ifStatement = body2.block.statements[0] as IfStatement;
     ReturnStatement statement = ((ifStatement.thenStatement as Block)).statements[0] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.staticType);
+    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
   }
   void test_is_if_lessSpecific() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "A f(A p) {", "  if (p is Object) {", "    return p;", "  } else {", "    return null;", "  }", "}"]));
-    LibraryElement library = resolve(source, []);
+    LibraryElement library = resolve(source);
     assertNoErrors();
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
-    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
-    InterfaceType typeA = classA.element.type;
     FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
     BlockFunctionBody body2 = function.functionExpression.body as BlockFunctionBody;
     IfStatement ifStatement = body2.block.statements[0] as IfStatement;
     ReturnStatement statement = ((ifStatement.thenStatement as Block)).statements[0] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.staticType);
+    JUnitTestCase.assertSame(null, variableName.propagatedType);
   }
   void test_is_if_logicalAnd() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "A f(var p) {", "  if (p is A && p != null) {", "    return p;", "  } else {", "    return null;", "  }", "}"]));
-    LibraryElement library = resolve(source, []);
+    LibraryElement library = resolve(source);
     assertNoErrors();
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
@@ -173,11 +171,11 @@
     IfStatement ifStatement = body2.block.statements[0] as IfStatement;
     ReturnStatement statement = ((ifStatement.thenStatement as Block)).statements[0] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.staticType);
+    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
   }
   void test_is_postConditional() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "A f(var p) {", "  A a = (p is A) ? p : throw null;", "  return p;", "}"]));
-    LibraryElement library = resolve(source, []);
+    LibraryElement library = resolve(source);
     assertNoErrors();
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
@@ -187,11 +185,11 @@
     BlockFunctionBody body2 = function.functionExpression.body as BlockFunctionBody;
     ReturnStatement statement = body2.block.statements[1] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.staticType);
+    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
   }
   void test_is_postIf() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "A f(var p) {", "  if (p is A) {", "    A a = p;", "  } else {", "    return null;", "  }", "  return p;", "}"]));
-    LibraryElement library = resolve(source, []);
+    LibraryElement library = resolve(source);
     assertNoErrors();
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
@@ -201,11 +199,11 @@
     BlockFunctionBody body2 = function.functionExpression.body as BlockFunctionBody;
     ReturnStatement statement = body2.block.statements[1] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.staticType);
+    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
   }
   void test_is_subclass() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "class B extends A {", "  B m() => this;", "}", "A f(A p) {", "  if (p is B) {", "    return p.m();", "  }", "}"]));
-    LibraryElement library = resolve(source, []);
+    LibraryElement library = resolve(source);
     assertNoErrors();
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
@@ -218,7 +216,7 @@
   }
   void test_is_while() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "A f(var p) {", "  while (p is A) {", "    return p;", "  }", "}"]));
-    LibraryElement library = resolve(source, []);
+    LibraryElement library = resolve(source);
     assertNoErrors();
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
@@ -229,11 +227,11 @@
     WhileStatement whileStatement = body2.block.statements[0] as WhileStatement;
     ReturnStatement statement = ((whileStatement.body as Block)).statements[0] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.staticType);
+    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
   }
   void test_isNot_conditional() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "A f(var p) {", "  return (p is! A) ? null : p;", "}"]));
-    LibraryElement library = resolve(source, []);
+    LibraryElement library = resolve(source);
     assertNoErrors();
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
@@ -244,11 +242,11 @@
     ReturnStatement statement = body2.block.statements[0] as ReturnStatement;
     ConditionalExpression conditional = statement.expression as ConditionalExpression;
     SimpleIdentifier variableName = conditional.elseExpression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.staticType);
+    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
   }
   void test_isNot_if() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "A f(var p) {", "  if (p is! A) {", "    return null;", "  } else {", "    return p;", "  }", "}"]));
-    LibraryElement library = resolve(source, []);
+    LibraryElement library = resolve(source);
     assertNoErrors();
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
@@ -259,11 +257,11 @@
     IfStatement ifStatement = body2.block.statements[0] as IfStatement;
     ReturnStatement statement = ((ifStatement.elseStatement as Block)).statements[0] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.staticType);
+    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
   }
   void test_isNot_if_logicalOr() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "A f(var p) {", "  if (p is! A || null == p) {", "    return null;", "  } else {", "    return p;", "  }", "}"]));
-    LibraryElement library = resolve(source, []);
+    LibraryElement library = resolve(source);
     assertNoErrors();
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
@@ -274,11 +272,11 @@
     IfStatement ifStatement = body2.block.statements[0] as IfStatement;
     ReturnStatement statement = ((ifStatement.elseStatement as Block)).statements[0] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.staticType);
+    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
   }
   void test_isNot_postConditional() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "A f(var p) {", "  A a = (p is! A) ? throw null : p;", "  return p;", "}"]));
-    LibraryElement library = resolve(source, []);
+    LibraryElement library = resolve(source);
     assertNoErrors();
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
@@ -288,11 +286,11 @@
     BlockFunctionBody body2 = function.functionExpression.body as BlockFunctionBody;
     ReturnStatement statement = body2.block.statements[1] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.staticType);
+    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
   }
   void test_isNot_postIf() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "A f(var p) {", "  if (p is! A) {", "    return null;", "  }", "  return p;", "}"]));
-    LibraryElement library = resolve(source, []);
+    LibraryElement library = resolve(source);
     assertNoErrors();
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
@@ -302,11 +300,69 @@
     BlockFunctionBody body2 = function.functionExpression.body as BlockFunctionBody;
     ReturnStatement statement = body2.block.statements[1] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.staticType);
+    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
+  }
+  void test_listLiteral_different() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  var v = [0, '1', 2];", "  return v[2];", "}"]));
+    LibraryElement library = resolve(source);
+    assertNoErrors();
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
+    BlockFunctionBody body2 = function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body2.block.statements[1] as ReturnStatement;
+    IndexExpression indexExpression = statement.expression as IndexExpression;
+    JUnitTestCase.assertNull(indexExpression.propagatedType);
+  }
+  void test_listLiteral_same() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  var v = [0, 1, 2];", "  return v[2];", "}"]));
+    LibraryElement library = resolve(source);
+    assertNoErrors();
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
+    BlockFunctionBody body2 = function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body2.block.statements[1] as ReturnStatement;
+    IndexExpression indexExpression = statement.expression as IndexExpression;
+    JUnitTestCase.assertSame(typeProvider.intType, indexExpression.propagatedType);
+  }
+  void test_mapLiteral_different() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  var v = {'0' : 0, 1 : '1', '2' : 2};", "  return v;", "}"]));
+    LibraryElement library = resolve(source);
+    assertNoErrors();
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
+    BlockFunctionBody body2 = function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body2.block.statements[1] as ReturnStatement;
+    SimpleIdentifier identifier = statement.expression as SimpleIdentifier;
+    InterfaceType propagatedType2 = identifier.propagatedType as InterfaceType;
+    JUnitTestCase.assertSame(typeProvider.mapType.element, propagatedType2.element);
+    List<Type2> typeArguments2 = propagatedType2.typeArguments;
+    EngineTestCase.assertLength(2, typeArguments2);
+    JUnitTestCase.assertSame(typeProvider.dynamicType, typeArguments2[0]);
+    JUnitTestCase.assertSame(typeProvider.dynamicType, typeArguments2[1]);
+  }
+  void test_mapLiteral_same() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  var v = {'a' : 0, 'b' : 1, 'c' : 2};", "  return v;", "}"]));
+    LibraryElement library = resolve(source);
+    assertNoErrors();
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
+    BlockFunctionBody body2 = function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body2.block.statements[1] as ReturnStatement;
+    SimpleIdentifier identifier = statement.expression as SimpleIdentifier;
+    InterfaceType propagatedType2 = identifier.propagatedType as InterfaceType;
+    JUnitTestCase.assertSame(typeProvider.mapType.element, propagatedType2.element);
+    List<Type2> typeArguments2 = propagatedType2.typeArguments;
+    EngineTestCase.assertLength(2, typeArguments2);
+    JUnitTestCase.assertSame(typeProvider.stringType, typeArguments2[0]);
+    JUnitTestCase.assertSame(typeProvider.intType, typeArguments2[1]);
   }
   void test_query() {
     Source source = addSource(EngineTestCase.createSource(["import 'dart:html';", "", "main() {", "  var v1 = query('a');", "  var v2 = query('A');", "  var v3 = query('body:active');", "  var v4 = query('button[foo=\"bar\"]');", "  var v5 = query('div.class');", "  var v6 = query('input#id');", "  var v7 = query('select#id');", "  // invocation of method", "  var m1 = document.query('div');", " // unsupported currently", "  var b1 = query('noSuchTag');", "  var b2 = query('DART_EDITOR_NO_SUCH_TYPE');", "  var b3 = query('body div');", "  return [v1, v2, v3, v4, v5, v6, v7, m1, b1, b2, b3];", "}"]));
-    LibraryElement library = resolve(source, []);
+    LibraryElement library = resolve(source);
     assertNoErrors();
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
@@ -314,17 +370,17 @@
     BlockFunctionBody body2 = main.functionExpression.body as BlockFunctionBody;
     ReturnStatement statement = body2.block.statements[11] as ReturnStatement;
     NodeList<Expression> elements2 = ((statement.expression as ListLiteral)).elements;
-    JUnitTestCase.assertEquals("AnchorElement", elements2[0].staticType.name);
-    JUnitTestCase.assertEquals("AnchorElement", elements2[1].staticType.name);
-    JUnitTestCase.assertEquals("BodyElement", elements2[2].staticType.name);
-    JUnitTestCase.assertEquals("ButtonElement", elements2[3].staticType.name);
-    JUnitTestCase.assertEquals("DivElement", elements2[4].staticType.name);
-    JUnitTestCase.assertEquals("InputElement", elements2[5].staticType.name);
-    JUnitTestCase.assertEquals("SelectElement", elements2[6].staticType.name);
-    JUnitTestCase.assertEquals("DivElement", elements2[7].staticType.name);
-    JUnitTestCase.assertEquals("Element", elements2[8].staticType.name);
-    JUnitTestCase.assertEquals("Element", elements2[9].staticType.name);
-    JUnitTestCase.assertEquals("Element", elements2[10].staticType.name);
+    JUnitTestCase.assertEquals("AnchorElement", elements2[0].propagatedType.name);
+    JUnitTestCase.assertEquals("AnchorElement", elements2[1].propagatedType.name);
+    JUnitTestCase.assertEquals("BodyElement", elements2[2].propagatedType.name);
+    JUnitTestCase.assertEquals("ButtonElement", elements2[3].propagatedType.name);
+    JUnitTestCase.assertEquals("DivElement", elements2[4].propagatedType.name);
+    JUnitTestCase.assertEquals("InputElement", elements2[5].propagatedType.name);
+    JUnitTestCase.assertEquals("SelectElement", elements2[6].propagatedType.name);
+    JUnitTestCase.assertEquals("DivElement", elements2[7].propagatedType.name);
+    JUnitTestCase.assertEquals("Element", elements2[8].propagatedType.name);
+    JUnitTestCase.assertEquals("Element", elements2[9].propagatedType.name);
+    JUnitTestCase.assertEquals("Element", elements2[10].propagatedType.name);
   }
   static dartSuite() {
     _ut.group('TypePropagationTest', () {
@@ -408,6 +464,22 @@
         final __test = new TypePropagationTest();
         runJUnitTest(__test, __test.test_is_while);
       });
+      _ut.test('test_listLiteral_different', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_listLiteral_different);
+      });
+      _ut.test('test_listLiteral_same', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_listLiteral_same);
+      });
+      _ut.test('test_mapLiteral_different', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_mapLiteral_different);
+      });
+      _ut.test('test_mapLiteral_same', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_mapLiteral_same);
+      });
       _ut.test('test_query', () {
         final __test = new TypePropagationTest();
         runJUnitTest(__test, __test.test_query);
@@ -416,361 +488,1092 @@
   }
 }
 class NonErrorResolverTest extends ResolverTestCase {
+  void test_ambiguousExport() {
+    Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart';", "export 'lib2.dart';"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class M {}"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_ambiguousExport_combinators_hide() {
+    Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart';", "export 'lib2.dart' hide B;"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library L1;", "class A {}", "class B {}"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library L2;", "class B {}", "class C {}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_ambiguousExport_combinators_show() {
+    Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart';", "export 'lib2.dart' show C;"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library L1;", "class A {}", "class B {}"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library L2;", "class B {}", "class C {}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
   void test_argumentDefinitionTestNonParameter_formalParameter() {
     Source source = addSource(EngineTestCase.createSource(["f(var v) {", "  return ?v;", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_argumentDefinitionTestNonParameter_namedParameter() {
     Source source = addSource(EngineTestCase.createSource(["f({var v : 0}) {", "  return ?v;", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_argumentDefinitionTestNonParameter_optionalParameter() {
     Source source = addSource(EngineTestCase.createSource(["f([var v]) {", "  return ?v;", "}"]));
-    resolve(source, []);
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_argumentTypeNotAssignable_invocation_functionParameter_generic() {
+    Source source = addSource(EngineTestCase.createSource(["class A<K> {", "  m(f(K k), K v) {", "    f(v);", "  }", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_argumentTypeNotAssignable_invocation_typedef_generic() {
+    Source source = addSource(EngineTestCase.createSource(["typedef A<T>(T p);", "f(A<int> a) {", "  a(1);", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_argumentTypeNotAssignable_Object_Function() {
+    Source source = addSource(EngineTestCase.createSource(["main() {", "  process(() {});", "}", "process(Object x) {}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_argumentTypeNotAssignable_typedef_local() {
+    Source source = addSource(EngineTestCase.createSource(["typedef A(int p1, String p2);", "A getA() => null;", "f() {", "  A a = getA();", "  a(1, '2');", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_argumentTypeNotAssignable_typedef_parameter() {
+    Source source = addSource(EngineTestCase.createSource(["typedef A(int p1, String p2);", "f(A a) {", "  a(1, '2');", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_assignmentToFinal_prefixNegate() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  final x = 0;", "  -x;", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_assignmentToFinals_importWithPrefix() {
+    Source source = addSource(EngineTestCase.createSource(["library lib;", "import 'lib1.dart' as foo;", "main() {", "  foo.x = true;", "}"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "bool x = false;"]));
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_breakWithoutLabelInSwitch() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  void m(int i) {", "    switch (i) {", "      case 0:", "        break;", "    }", "  }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_builtInIdentifierAsType_dynamic() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  dynamic x;", "}"]));
-    resolve(source, []);
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_caseBlockNotTerminated() {
+    Source source = addSource(EngineTestCase.createSource(["f(int p) {", "  for (int i = 0; i < 10; i++) {", "    switch (p) {", "      case 0:", "        break;", "      case 1:", "        continue;", "      case 2:", "        return;", "      case 3:", "        throw new Object();", "      case 4:", "      case 5:", "        return;", "      case 6:", "      default:", "        return;", "    }", "  }", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_caseBlockNotTerminated_lastCase() {
+    Source source = addSource(EngineTestCase.createSource(["f(int p) {", "  switch (p) {", "    case 0:", "      p = p + 1;", "  }", "}"]));
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_caseExpressionTypeImplementsEquals_int() {
     Source source = addSource(EngineTestCase.createSource(["f(int i) {", "  switch(i) {", "    case(1) : return 1;", "    default: return 0;", "  }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_caseExpressionTypeImplementsEquals_Object() {
     Source source = addSource(EngineTestCase.createSource(["class IntWrapper {", "  final int value;", "  const IntWrapper(this.value);", "}", "", "f(IntWrapper intWrapper) {", "  switch(intWrapper) {", "    case(const IntWrapper(1)) : return 1;", "    default: return 0;", "  }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_caseExpressionTypeImplementsEquals_String() {
     Source source = addSource(EngineTestCase.createSource(["f(String s) {", "  switch(s) {", "    case('1') : return 1;", "    default: return 0;", "  }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_concreteClassWithAbstractMember() {
     Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  m();", "}"]));
-    resolve(source, []);
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_conflictingInstanceGetterAndSuperclassMember_instance() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  get v => 0;", "}", "class B extends A {", "  get v => 1;", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_conflictingStaticGetterAndInstanceSetter_thisClass() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static get x => 0;", "  static set x(int p) {}", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_conflictingStaticSetterAndInstanceMember_thisClass_method() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static x() {}", "  static set x(int p) {}", "}"]));
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_constConstructorWithNonFinalField_constInstanceVar() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  const int x = 0;", "  const A() {}", "}"]));
-    resolve(source, []);
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  const int x = 0;", "  const A();", "}"]));
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_constConstructorWithNonFinalField_finalInstanceVar() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  final int x = 0;", "  const A() {}", "}"]));
-    resolve(source, []);
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  final int x = 0;", "  const A();", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_constConstructorWithNonFinalField_mixin() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  a() {}", "}", "class B extends Object with A {", "  const B();", "}"]));
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_constConstructorWithNonFinalField_static() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  static int x;", "  const A() {}", "}"]));
-    resolve(source, []);
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static int x;", "  const A();", "}"]));
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_constConstructorWithNonFinalField_syntheticField() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  const A();", "  set x(value) {}", "  get x {return 0;}", "}"]));
-    resolve(source, []);
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_constEvalTypeBoolNumString_equal() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A();", "}", "class B {", "  final v;", "  const B.a1(bool p) : v = p == true;", "  const B.a2(bool p) : v = p == false;", "  const B.a3(bool p) : v = p == 0;", "  const B.a4(bool p) : v = p == 0.0;", "  const B.a5(bool p) : v = p == '';", "  const B.b1(int p) : v = p == true;", "  const B.b2(int p) : v = p == false;", "  const B.b3(int p) : v = p == 0;", "  const B.b4(int p) : v = p == 0.0;", "  const B.b5(int p) : v = p == '';", "  const B.c1(String p) : v = p == true;", "  const B.c2(String p) : v = p == false;", "  const B.c3(String p) : v = p == 0;", "  const B.c4(String p) : v = p == 0.0;", "  const B.c5(String p) : v = p == '';", "  const B.n1(num p) : v = p == null;", "  const B.n2(num p) : v = null == p;", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_constEvalTypeBoolNumString_notEqual() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A();", "}", "class B {", "  final v;", "  const B.a1(bool p) : v = p != true;", "  const B.a2(bool p) : v = p != false;", "  const B.a3(bool p) : v = p != 0;", "  const B.a4(bool p) : v = p != 0.0;", "  const B.a5(bool p) : v = p != '';", "  const B.b1(int p) : v = p != true;", "  const B.b2(int p) : v = p != false;", "  const B.b3(int p) : v = p != 0;", "  const B.b4(int p) : v = p != 0.0;", "  const B.b5(int p) : v = p != '';", "  const B.c1(String p) : v = p != true;", "  const B.c2(String p) : v = p != false;", "  const B.c3(String p) : v = p != 0;", "  const B.c4(String p) : v = p != 0.0;", "  const B.c5(String p) : v = p != '';", "  const B.n1(num p) : v = p != null;", "  const B.n2(num p) : v = null != p;", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_constWithNonConstantArgument_literals() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A(a, b, c, d);", "}", "f() { return const A(true, 0, 1.0, '2'); }"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_constWithTypeParameters_direct() {
+    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  const V = const A<int>();", "  const A();", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_constWithUndefinedConstructor() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A.name();", "}", "f() {", "  return const A.name();", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_constWithUndefinedConstructorDefault() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A();", "}", "f() {", "  return const A();", "}"]));
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_defaultValueInFunctionTypeAlias() {
     Source source = addSource(EngineTestCase.createSource(["typedef F([x]);"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([]);
     verify([source]);
   }
   void test_duplicateDefinition_emptyName() {
-    Source source = addSource(EngineTestCase.createSource(["Map _globalMap = {", "  'a' : () {},", "  'b' : () {}", "}"]));
-    resolve(source, []);
+    Source source = addSource(EngineTestCase.createSource(["Map _globalMap = {", "  'a' : () {},", "  'b' : () {}", "};"]));
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_duplicateDefinition_getter() {
     Source source = addSource(EngineTestCase.createSource(["bool get a => true;"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_exportOfNonLibrary_libraryDeclared() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart';"]));
     addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_exportOfNonLibrary_libraryNotDeclared() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart';"]));
     addSource2("/lib1.dart", EngineTestCase.createSource([""]));
-    resolve(source, []);
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_extraPositionalArguments_function() {
+    Source source = addSource(EngineTestCase.createSource(["f(p1, p2) {}", "main() {", "  f(1, 2);", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_extraPositionalArguments_Function() {
+    Source source = addSource(EngineTestCase.createSource(["f(Function a) {", "  a(1, 2);", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_extraPositionalArguments_typedef_local() {
+    Source source = addSource(EngineTestCase.createSource(["typedef A(p1, p2);", "A getA() => null;", "f() {", "  A a = getA();", "  a(1, 2);", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_extraPositionalArguments_typedef_parameter() {
+    Source source = addSource(EngineTestCase.createSource(["typedef A(p1, p2);", "f(A a) {", "  a(1, 2);", "}"]));
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_fieldInitializedByMultipleInitializers() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  int y;", "  A() : x = 0, y = 0 {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_fieldInitializedInInitializerAndDeclaration_fieldNotFinal() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x = 0;", "  A() : x = 1 {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_fieldInitializedInInitializerAndDeclaration_finalFieldNotSet() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final int x;", "  A() : x = 1 {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_fieldInitializerOutsideConstructor() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A(this.x) {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_fieldInitializerOutsideConstructor_defaultParameters() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A([this.x]) {}", "}"]));
-    resolve(source, []);
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_fieldInitializerRedirectingConstructor_super() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "}", "class B extends A {", "  int x;", "  A(this.x) : super();", "}"]));
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_finalInitializedInDeclarationAndConstructor_initializer() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final x;", "  A() : x = 1 {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_finalInitializedInDeclarationAndConstructor_initializingFormal() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final x;", "  A(this.x) {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_finalNotInitialized_atDeclaration() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final int x = 0;", "  A() {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_finalNotInitialized_fieldFormal() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final int x = 0;", "  A() {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_finalNotInitialized_initializer() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final int x;", "  A() : x = 0 {}", "}"]));
-    resolve(source, []);
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_implicitThisReferenceInInitializer_constructorName() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A.named() {}", "}", "class B {", "  var v;", "  B() : v = new A.named();", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_implicitThisReferenceInInitializer_prefixedIdentifier() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  var f;", "}", "class B {", "  var v;", "  B(A a) : v = a.f;", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_implicitThisReferenceInInitializer_qualifiedMethodInvocation() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  f() {}", "}", "class B {", "  var v;", "  B() : v = new A().f();", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_implicitThisReferenceInInitializer_qualifiedPropertyAccess() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  var f;", "}", "class B {", "  var v;", "  B() : v = new A().f;", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_implicitThisReferenceInInitializer_staticField_superClass() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static var f;", "}", "class B extends A {", "  var v;", "  B() : v = f;", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_implicitThisReferenceInInitializer_staticField_thisClass() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  var v;", "  A() : v = f;", "  static var f;", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_implicitThisReferenceInInitializer_staticGetter() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  var v;", "  A() : v = f;", "  static get f => 42;", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_implicitThisReferenceInInitializer_staticMethod() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  var v;", "  A() : v = f();", "  static f() => 42;", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_implicitThisReferenceInInitializer_topLevelField() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  var v;", "  A() : v = f;", "}", "var f = 42;"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_implicitThisReferenceInInitializer_topLevelFunction() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  var v;", "  A() : v = f();", "}", "f() => 42;"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_implicitThisReferenceInInitializer_topLevelGetter() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  var v;", "  A() : v = f;", "}", "get f => 42;"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_implicitThisReferenceInInitializer_typeVariable() {
+    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  var v;", "  A(p) : v = (p is T);", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_importDuplicatedLibraryName() {
+    Source source = addSource(EngineTestCase.createSource(["library test;", "import 'lib.dart';", "import 'lib.dart';"]));
+    addSource2("/lib.dart", "library lib;");
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_importOfNonLibrary_libraryDeclared() {
     Source source = addSource(EngineTestCase.createSource(["library lib;", "import 'part.dart';"]));
     addSource2("/part.dart", EngineTestCase.createSource(["library lib1;"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_importOfNonLibrary_libraryNotDeclared() {
     Source source = addSource(EngineTestCase.createSource(["library lib;", "import 'part.dart';"]));
     addSource2("/part.dart", EngineTestCase.createSource([""]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_inconsistentCaseExpressionTypes() {
     Source source = addSource(EngineTestCase.createSource(["f(var p) {", "  switch (p) {", "    case 1:", "      break;", "    case 2:", "      break;", "  }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_initializingFormalForNonExistantField() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A(this.x) {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_invalidAssignment() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  var x;", "  var y;", "  x = y;", "}"]));
-    resolve(source, []);
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_invalidAssignment_compoundAssignment() {
+    Source source = addSource(EngineTestCase.createSource(["class byte {", "  int _value;", "  byte(this._value);", "  byte operator +(int val) {}", "}", "", "void main() {", "  byte b = new byte(52);", "  b += 3;", "}"]));
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_invalidAssignment_toDynamic() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  var g;", "  g = () => 0;", "}"]));
-    resolve(source, []);
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_invalidFactoryNameNotAClass() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  factory A() {}", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_invalidOverrideNamed_unorderedNamedParameter() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  m({a, b}) {}", "}", "class B extends A {", "  m({b, a}) {}", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_invalidOverrideReturnType_returnType_interface() {
+    Source source = addSource2("/test.dart", EngineTestCase.createSource(["abstract class A {", "  num m();", "}", "class B implements A {", "  int m() { return 1; }", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_invalidOverrideReturnType_returnType_interface2() {
+    Source source = addSource2("/test.dart", EngineTestCase.createSource(["abstract class A {", "  num m();", "}", "abstract class B implements A {", "}", "class C implements B {", "  int m() { return 1; }", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_invalidOverrideReturnType_returnType_mixin() {
+    Source source = addSource2("/test.dart", EngineTestCase.createSource(["class A {", "  num m() { return 0; }", "}", "class B extends Object with A {", "  int m() { return 1; }", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_invalidOverrideReturnType_returnType_parameterizedTypes() {
+    Source source = addSource(EngineTestCase.createSource(["abstract class A<E> {", "  List<E> m();", "}", "class B extends A<dynamic> {", "  List<dynamic> m() { return new List<dynamic>(); }", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_invalidOverrideReturnType_returnType_sameType() {
+    Source source = addSource2("/test.dart", EngineTestCase.createSource(["class A {", "  int m() { return 0; }", "}", "class B extends A {", "  int m() { return 1; }", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_invalidOverrideReturnType_returnType_superclass() {
+    Source source = addSource2("/test.dart", EngineTestCase.createSource(["class A {", "  num m() { return 0; }", "}", "class B extends A {", "  int m() { return 1; }", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_invalidOverrideReturnType_returnType_superclass2() {
+    Source source = addSource2("/test.dart", EngineTestCase.createSource(["class A {", "  num m() { return 0; }", "}", "class B extends A {", "}", "class C extends B {", "  int m() { return 1; }", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_invalidOverrideReturnType_returnType_void() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  void m() {}", "}", "class B extends A {", "  int m() {}", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_invalidReferenceToThis_constructor() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {", "    var v = this;", "  }", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_invalidReferenceToThis_instanceMethod() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  m() {", "    var v = this;", "  }", "}"]));
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_invalidTypeArgumentInConstList() {
-    Source source = addSource(EngineTestCase.createSource(["class A<E> {", "  m() {", "    return <E>[]", "  }", "}"]));
-    resolve(source, []);
+    Source source = addSource(EngineTestCase.createSource(["class A<E> {", "  m() {", "    return <E>[];", "  }", "}"]));
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_invalidTypeArgumentInConstMap() {
-    Source source = addSource(EngineTestCase.createSource(["class A<E> {", "  m() {", "    return <String, E>{}", "  }", "}"]));
-    resolve(source, []);
+    Source source = addSource(EngineTestCase.createSource(["class A<E> {", "  m() {", "    return <String, E>{};", "  }", "}"]));
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_invocationOfNonFunction_dynamic() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  var f;", "}", "class B extends A {", "  g() {", "    f();", "  }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_invocationOfNonFunction_getter() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  var g;", "}", "f() {", "  A a;", "  a.g();", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_invocationOfNonFunction_localVariable() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  var g;", "  g();", "}"]));
-    resolve(source, []);
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_memberWithClassName_setter() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  set A(v) {}", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_misMatchedGetterAndSetterTypes_instance_sameTypes() {
+    Source source = addSource(EngineTestCase.createSource(["class C {", "  int get x => 0;", "  set x(int v) {}", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_misMatchedGetterAndSetterTypes_instance_unspecifiedGetter() {
+    Source source = addSource(EngineTestCase.createSource(["class C {", "  get x => 0;", "  set x(String v) {}", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_misMatchedGetterAndSetterTypes_instance_unspecifiedSetter() {
+    Source source = addSource(EngineTestCase.createSource(["class C {", "  int get x => 0;", "  set x(v) {}", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_misMatchedGetterAndSetterTypes_topLevel_sameTypes() {
+    Source source = addSource(EngineTestCase.createSource(["int get x => 0;", "set x(int v) {}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_misMatchedGetterAndSetterTypes_topLevel_unspecifiedGetter() {
+    Source source = addSource(EngineTestCase.createSource(["get x => 0;", "set x(String v) {}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_misMatchedGetterAndSetterTypes_topLevel_unspecifiedSetter() {
+    Source source = addSource(EngineTestCase.createSource(["int get x => 0;", "set x(v) {}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_mixinDeclaresConstructor() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  m() {}", "}", "class B extends Object with A {}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_mixinDeclaresConstructor_factory() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  factory A() {}", "}", "class B extends Object with A {}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_mixinInheritsFromNotObject_classDeclaration_mixTypedef() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "typedef B = Object with A;", "class C extends Object with B {}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_mixinInheritsFromNotObject_typedef_mixTypedef() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "typedef B = Object with A;", "typedef C = Object with B;"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_multipleSuperInitializers_no() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B extends A {", "  B() {}", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_multipleSuperInitializers_single() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B extends A {", "  B() : super() {}", "}"]));
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_newWithAbstractClass_factory() {
     Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  factory A() { return new B(); }", "}", "class B implements A {", "  B() {}", "}", "A f() {", "  return new A();", "}"]));
-    resolve(source, []);
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_newWithUndefinedConstructor() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A.name() {}", "}", "f() {", "  new A.name();", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_newWithUndefinedConstructorDefault() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "}", "f() {", "  new A();", "}"]));
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_nonBoolExpression_assert_bool() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  assert(true);", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_nonBoolExpression_assert_functionType() {
     Source source = addSource(EngineTestCase.createSource(["bool makeAssertion() => true;", "f() {", "  assert(makeAssertion);", "}"]));
-    resolve(source, []);
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_nonConstCaseExpression() {
+    Source source = addSource(EngineTestCase.createSource(["f(Type t) {", "  switch (t) {", "    case bool:", "    case int:", "      return true;", "    default:", "      return false;", "  }", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_nonConstMapAsExpressionStatement_const() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  const {'a' : 0, 'b' : 1};", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_nonConstMapAsExpressionStatement_notExpressionStatement() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  var m = {'a' : 0, 'b' : 1};", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_nonConstMapAsExpressionStatement_typeArguments() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  <String, int> {'a' : 0, 'b' : 1};", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_nonConstValueInInitializer_binary_bool() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  final v;", "  const A.a1(bool p) : v = p && true;", "  const A.a2(bool p) : v = true && p;", "  const A.b1(bool p) : v = p || true;", "  const A.b2(bool p) : v = true || p;", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_nonConstValueInInitializer_binary_dynamic() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  final v;", "  const A.a1(p) : v = p + 5;", "  const A.a2(p) : v = 5 + p;", "  const A.b1(p) : v = p - 5;", "  const A.b2(p) : v = 5 - p;", "  const A.c1(p) : v = p * 5;", "  const A.c2(p) : v = 5 * p;", "  const A.d1(p) : v = p / 5;", "  const A.d2(p) : v = 5 / p;", "  const A.e1(p) : v = p ~/ 5;", "  const A.e2(p) : v = 5 ~/ p;", "  const A.f1(p) : v = p > 5;", "  const A.f2(p) : v = 5 > p;", "  const A.g1(p) : v = p < 5;", "  const A.g2(p) : v = 5 < p;", "  const A.h1(p) : v = p >= 5;", "  const A.h2(p) : v = 5 >= p;", "  const A.i1(p) : v = p <= 5;", "  const A.i2(p) : v = 5 <= p;", "  const A.j1(p) : v = p % 5;", "  const A.j2(p) : v = 5 % p;", "}"]));
+    resolve(source);
+    assertNoErrors();
+  }
+  void test_nonConstValueInInitializer_binary_int() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  final v;", "  const A.a1(int p) : v = p ^ 5;", "  const A.a2(int p) : v = 5 ^ p;", "  const A.b1(int p) : v = p & 5;", "  const A.b2(int p) : v = 5 & p;", "  const A.c1(int p) : v = p | 5;", "  const A.c2(int p) : v = 5 | p;", "  const A.d1(int p) : v = p >> 5;", "  const A.d2(int p) : v = 5 >> p;", "  const A.e1(int p) : v = p << 5;", "  const A.e2(int p) : v = 5 << p;", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_nonConstValueInInitializer_binary_num() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  final v;", "  const A.a1(num p) : v = p + 5;", "  const A.a2(num p) : v = 5 + p;", "  const A.b1(num p) : v = p - 5;", "  const A.b2(num p) : v = 5 - p;", "  const A.c1(num p) : v = p * 5;", "  const A.c2(num p) : v = 5 * p;", "  const A.d1(num p) : v = p / 5;", "  const A.d2(num p) : v = 5 / p;", "  const A.e1(num p) : v = p ~/ 5;", "  const A.e2(num p) : v = 5 ~/ p;", "  const A.f1(num p) : v = p > 5;", "  const A.f2(num p) : v = 5 > p;", "  const A.g1(num p) : v = p < 5;", "  const A.g2(num p) : v = 5 < p;", "  const A.h1(num p) : v = p >= 5;", "  const A.h2(num p) : v = 5 >= p;", "  const A.i1(num p) : v = p <= 5;", "  const A.i2(num p) : v = 5 <= p;", "  const A.j1(num p) : v = p % 5;", "  const A.j2(num p) : v = 5 % p;", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_nonConstValueInInitializer_field() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  final int a;", "  const A() : a = 5;", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_nonConstValueInInitializer_redirecting() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A.named(p);", "  const A() : this.named(42);", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_nonConstValueInInitializer_super() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A(p);", "}", "class B extends A {", "  const B() : super(42);", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_nonConstValueInInitializer_unary() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  final v;", "  const A.a(bool p) : v = !p;", "  const A.b(int p) : v = ~p;", "  const A.c(num p) : v = -p;", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_nonGenerativeConstructor() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A.named() {}", "  factory A() {}", "}", "class B extends A {", "  B() : super.named();", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_nonTypeInCatchClause_isClass() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  try {", "  } on String catch (e) {", "  }", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_nonTypeInCatchClause_isFunctionTypeAlias() {
+    Source source = addSource(EngineTestCase.createSource(["typedef F();", "f() {", "  try {", "  } on F catch (e) {", "  }", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_nonTypeInCatchClause_isTypeVariable() {
+    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  f() {", "    try {", "    } on T catch (e) {", "    }", "  }", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_nonTypeInCatchClause_noType() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  try {", "  } catch (e) {", "  }", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_nonVoidReturnForOperator_no() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  operator []=(a, b) {}", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_nonVoidReturnForOperator_void() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  void operator []=(a, b) {}", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_nonVoidReturnForSetter_function_no() {
+    Source source = addSource("set x(v) {}");
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_nonVoidReturnForSetter_function_void() {
+    Source source = addSource("void set x(v) {}");
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_nonVoidReturnForSetter_method_no() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  set x(v) {}", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_nonVoidReturnForSetter_method_void() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  void set x(v) {}", "}"]));
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_optionalParameterInOperator_required() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  operator +(p) {}", "}"]));
-    resolve(source, []);
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_prefixCollidesWithTopLevelMembers() {
+    addSource2("/lib.dart", "library lib;");
+    Source source = addSource(EngineTestCase.createSource(["import '/lib.dart' as p;", "typedef P();", "p2() {}", "var p3;", "class p4 {}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_recursiveConstructorRedirect() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A.a() : this.b();", "  A.b() : this.c();", "  A.c() {}", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_recursiveFactoryRedirect() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  factory A() = B;", "}", "class B implements A {", "  factory B() = C;", "}", "class C implements B {", "  factory C() {}", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_redirectToInvalidFunctionType() {
+    Source source = addSource(EngineTestCase.createSource(["class A implements B {", "  A(int p) {}", "}", "class B {", "  B(int p) = A;", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_redirectToNonConstConstructor() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A.a();", "  const factory A.b() = A.a;", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_referenceToDeclaredVariableInInitializer_constructorName() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A.x() {}", "}", "f() {", "  var x = new A.x();", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_referenceToDeclaredVariableInInitializer_methodName() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  x() {}", "}", "f(A a) {", "  var x = a.x();", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_referenceToDeclaredVariableInInitializer_propertyName() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  var x;", "}", "f(A a) {", "  var x = a.x;", "}"]));
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_rethrowOutsideCatch() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  void m() {", "    try {} catch (e) {rethrow;}", "  }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_returnInGenerativeConstructor() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  A() { return; }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_returnOfInvalidType_dynamic() {
     Source source = addSource(EngineTestCase.createSource(["class TypeError {}", "class A {", "  static void testLogicalOp() {", "    testOr(a, b, onTypeError) {", "      try {", "        return a || b;", "      } on TypeError catch (t) {", "        return onTypeError;", "      }", "    }", "  }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_returnOfInvalidType_subtype() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "class B extends A {}", "A f(B b) { return b; }"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_returnOfInvalidType_supertype() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "class B extends A {}", "B f(A a) { return a; }"]));
-    resolve(source, []);
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_returnOfInvalidType_void() {
+    Source source = addSource(EngineTestCase.createSource(["void f1() {}", "void f2() { return; }", "void f3() { return null; }", "void f4() { return g1(); }", "void f5() { return g2(); }", "g1() {}", "void g2() {}", ""]));
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_returnWithoutValue_noReturnType() {
     Source source = addSource(EngineTestCase.createSource(["f() { return; }"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_returnWithoutValue_void() {
     Source source = addSource(EngineTestCase.createSource(["void f() { return; }"]));
-    resolve(source, []);
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_staticAccessToInstanceMember_method() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static m() {}", "}", "main() {", "  A.m;", "  A.m();", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_staticAccessToInstanceMember_propertyAccess_field() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static var f;", "}", "main() {", "  A.f;", "  A.f = 1;", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_staticAccessToInstanceMember_propertyAccess_propertyAccessor() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static get f => 42;", "  static set f(x) {}", "}", "main() {", "  A.f;", "  A.f = 1;", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_superInInvalidContext() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  m() {}", "}", "class B extends A {", "  B() {", "    var v = super.m();", "  }", "  n() {", "    var v = super.m();", "  }", "}"]));
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_typeArgumentNotMatchingBounds_const() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B extends A {}", "class G<E extends A> {", "  const G() {}", "}", "f() { return const G<B>(); }"]));
-    resolve(source, []);
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B extends A {}", "class G<E extends A> {", "  const G();", "}", "f() { return const G<B>(); }"]));
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_typeArgumentNotMatchingBounds_new() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "class B extends A {}", "class G<E extends A> {}", "f() { return new G<B>(); }"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
+  void test_undefinedConstructorInInitializer_explicit_named() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A.named() {}", "}", "class B extends A {", "  B() : super.named();", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_undefinedConstructorInInitializer_explicit_unnamed() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "}", "class B extends A {", "  B() : super();", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_undefinedConstructorInInitializer_implicit() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "}", "class B extends A {", "  B();", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_undefinedConstructorInInitializer_implicit_typedef() {
+    Source source = addSource(EngineTestCase.createSource(["class M {}", "typedef A = Object with M;", "class B extends A {", "  B();", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_undefinedGetter_noSuchMethod_getter() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  noSuchMethod(invocation) {}", "}", "f() {", "  (new A()).g;", "}"]));
+    resolve(source);
+    assertNoErrors();
+  }
+  void test_undefinedGetter_noSuchMethod_getter2() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  noSuchMethod(invocation) {}", "}", "class B {", "  A a = new A();", "  m() {", "    a.g;", "  }", "}"]));
+    resolve(source);
+    assertNoErrors();
+  }
   void test_undefinedGetter_typeSubstitution() {
     Source source = addSource(EngineTestCase.createSource(["class A<E> {", "  E element;", "}", "class B extends A<List> {", "  m() {", "    element.last;", "  }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_undefinedIdentifier_hide() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart' hide a;"]));
     addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
+  void test_undefinedIdentifier_noSuchMethod() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  noSuchMethod(invocation) {}", "  f() {", "    var v = a;", "  }", "}"]));
+    resolve(source);
+    assertNoErrors();
+  }
   void test_undefinedIdentifier_show() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart' show a;"]));
     addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_undefinedMethod_noSuchMethod() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  noSuchMethod() {}", "}", "f() {", "  (new A()).someMethod();", "}"]));
-    resolve(source, []);
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  noSuchMethod(invocation) {}", "}", "f() {", "  (new A()).m();", "}"]));
+    resolve(source);
     assertNoErrors();
   }
+  void test_undefinedOperator_index() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  operator [](a) {}", "  operator []=(a, b) {}", "}", "f(A a) {", "  a[0];", "  a[0] = 1;", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
   void test_undefinedOperator_tilde() {
     Source source = addSource(EngineTestCase.createSource(["const A = 3;", "const B = ~((1 << A) - 1);"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
+  void test_undefinedSetter_noSuchMethod() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  noSuchMethod(invocation) {}", "}", "f() {", "  (new A()).s = 1;", "}"]));
+    resolve(source);
+    assertNoErrors();
+  }
+  void test_wrongNumberOfParametersForOperator_index() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  operator []=(a, b) {}", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_wrongNumberOfParametersForOperator_minus() {
+    check_wrongNumberOfParametersForOperator("-", "");
+    check_wrongNumberOfParametersForOperator("-", "a");
+  }
+  void test_wrongNumberOfParametersForOperator1() {
+    check_wrongNumberOfParametersForOperator1("<");
+    check_wrongNumberOfParametersForOperator1(">");
+    check_wrongNumberOfParametersForOperator1("<=");
+    check_wrongNumberOfParametersForOperator1(">=");
+    check_wrongNumberOfParametersForOperator1("+");
+    check_wrongNumberOfParametersForOperator1("/");
+    check_wrongNumberOfParametersForOperator1("~/");
+    check_wrongNumberOfParametersForOperator1("*");
+    check_wrongNumberOfParametersForOperator1("%");
+    check_wrongNumberOfParametersForOperator1("|");
+    check_wrongNumberOfParametersForOperator1("^");
+    check_wrongNumberOfParametersForOperator1("&");
+    check_wrongNumberOfParametersForOperator1("<<");
+    check_wrongNumberOfParametersForOperator1(">>");
+    check_wrongNumberOfParametersForOperator1("[]");
+  }
   void test_wrongNumberOfParametersForSetter() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  set x(a) {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
+  void check_wrongNumberOfParametersForOperator(String name, String parameters) {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  operator ${name}(${parameters}) {}", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+    reset();
+  }
+  void check_wrongNumberOfParametersForOperator1(String name) {
+    check_wrongNumberOfParametersForOperator(name, "a");
+  }
   static dartSuite() {
     _ut.group('NonErrorResolverTest', () {
+      _ut.test('test_ambiguousExport', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_ambiguousExport);
+      });
+      _ut.test('test_ambiguousExport_combinators_hide', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_ambiguousExport_combinators_hide);
+      });
+      _ut.test('test_ambiguousExport_combinators_show', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_ambiguousExport_combinators_show);
+      });
       _ut.test('test_argumentDefinitionTestNonParameter_formalParameter', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_argumentDefinitionTestNonParameter_formalParameter);
@@ -783,6 +1586,34 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_argumentDefinitionTestNonParameter_optionalParameter);
       });
+      _ut.test('test_argumentTypeNotAssignable_Object_Function', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_Object_Function);
+      });
+      _ut.test('test_argumentTypeNotAssignable_invocation_functionParameter_generic', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_invocation_functionParameter_generic);
+      });
+      _ut.test('test_argumentTypeNotAssignable_invocation_typedef_generic', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_invocation_typedef_generic);
+      });
+      _ut.test('test_argumentTypeNotAssignable_typedef_local', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_typedef_local);
+      });
+      _ut.test('test_argumentTypeNotAssignable_typedef_parameter', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_typedef_parameter);
+      });
+      _ut.test('test_assignmentToFinal_prefixNegate', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_assignmentToFinal_prefixNegate);
+      });
+      _ut.test('test_assignmentToFinals_importWithPrefix', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_assignmentToFinals_importWithPrefix);
+      });
       _ut.test('test_breakWithoutLabelInSwitch', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_breakWithoutLabelInSwitch);
@@ -791,6 +1622,14 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_builtInIdentifierAsType_dynamic);
       });
+      _ut.test('test_caseBlockNotTerminated', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_caseBlockNotTerminated);
+      });
+      _ut.test('test_caseBlockNotTerminated_lastCase', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_caseBlockNotTerminated_lastCase);
+      });
       _ut.test('test_caseExpressionTypeImplementsEquals_Object', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_caseExpressionTypeImplementsEquals_Object);
@@ -807,6 +1646,18 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_concreteClassWithAbstractMember);
       });
+      _ut.test('test_conflictingInstanceGetterAndSuperclassMember_instance', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_conflictingInstanceGetterAndSuperclassMember_instance);
+      });
+      _ut.test('test_conflictingStaticGetterAndInstanceSetter_thisClass', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_conflictingStaticGetterAndInstanceSetter_thisClass);
+      });
+      _ut.test('test_conflictingStaticSetterAndInstanceMember_thisClass_method', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_conflictingStaticSetterAndInstanceMember_thisClass_method);
+      });
       _ut.test('test_constConstructorWithNonFinalField_constInstanceVar', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_constConstructorWithNonFinalField_constInstanceVar);
@@ -815,6 +1666,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_constConstructorWithNonFinalField_finalInstanceVar);
       });
+      _ut.test('test_constConstructorWithNonFinalField_mixin', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_constConstructorWithNonFinalField_mixin);
+      });
       _ut.test('test_constConstructorWithNonFinalField_static', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_constConstructorWithNonFinalField_static);
@@ -823,6 +1678,30 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_constConstructorWithNonFinalField_syntheticField);
       });
+      _ut.test('test_constEvalTypeBoolNumString_equal', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_constEvalTypeBoolNumString_equal);
+      });
+      _ut.test('test_constEvalTypeBoolNumString_notEqual', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_constEvalTypeBoolNumString_notEqual);
+      });
+      _ut.test('test_constWithNonConstantArgument_literals', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_constWithNonConstantArgument_literals);
+      });
+      _ut.test('test_constWithTypeParameters_direct', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_constWithTypeParameters_direct);
+      });
+      _ut.test('test_constWithUndefinedConstructor', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_constWithUndefinedConstructor);
+      });
+      _ut.test('test_constWithUndefinedConstructorDefault', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_constWithUndefinedConstructorDefault);
+      });
       _ut.test('test_defaultValueInFunctionTypeAlias', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_defaultValueInFunctionTypeAlias);
@@ -843,6 +1722,22 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_exportOfNonLibrary_libraryNotDeclared);
       });
+      _ut.test('test_extraPositionalArguments_Function', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_extraPositionalArguments_Function);
+      });
+      _ut.test('test_extraPositionalArguments_function', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_extraPositionalArguments_function);
+      });
+      _ut.test('test_extraPositionalArguments_typedef_local', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_extraPositionalArguments_typedef_local);
+      });
+      _ut.test('test_extraPositionalArguments_typedef_parameter', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_extraPositionalArguments_typedef_parameter);
+      });
       _ut.test('test_fieldInitializedByMultipleInitializers', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_fieldInitializedByMultipleInitializers);
@@ -863,6 +1758,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_fieldInitializerOutsideConstructor_defaultParameters);
       });
+      _ut.test('test_fieldInitializerRedirectingConstructor_super', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_fieldInitializerRedirectingConstructor_super);
+      });
       _ut.test('test_finalInitializedInDeclarationAndConstructor_initializer', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_finalInitializedInDeclarationAndConstructor_initializer);
@@ -883,6 +1782,58 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_finalNotInitialized_initializer);
       });
+      _ut.test('test_implicitThisReferenceInInitializer_constructorName', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_constructorName);
+      });
+      _ut.test('test_implicitThisReferenceInInitializer_prefixedIdentifier', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_prefixedIdentifier);
+      });
+      _ut.test('test_implicitThisReferenceInInitializer_qualifiedMethodInvocation', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_qualifiedMethodInvocation);
+      });
+      _ut.test('test_implicitThisReferenceInInitializer_qualifiedPropertyAccess', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_qualifiedPropertyAccess);
+      });
+      _ut.test('test_implicitThisReferenceInInitializer_staticField_superClass', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_staticField_superClass);
+      });
+      _ut.test('test_implicitThisReferenceInInitializer_staticField_thisClass', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_staticField_thisClass);
+      });
+      _ut.test('test_implicitThisReferenceInInitializer_staticGetter', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_staticGetter);
+      });
+      _ut.test('test_implicitThisReferenceInInitializer_staticMethod', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_staticMethod);
+      });
+      _ut.test('test_implicitThisReferenceInInitializer_topLevelField', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_topLevelField);
+      });
+      _ut.test('test_implicitThisReferenceInInitializer_topLevelFunction', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_topLevelFunction);
+      });
+      _ut.test('test_implicitThisReferenceInInitializer_topLevelGetter', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_topLevelGetter);
+      });
+      _ut.test('test_implicitThisReferenceInInitializer_typeVariable', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_typeVariable);
+      });
+      _ut.test('test_importDuplicatedLibraryName', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_importDuplicatedLibraryName);
+      });
       _ut.test('test_importOfNonLibrary_libraryDeclared', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_importOfNonLibrary_libraryDeclared);
@@ -903,10 +1854,62 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_invalidAssignment);
       });
+      _ut.test('test_invalidAssignment_compoundAssignment', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_invalidAssignment_compoundAssignment);
+      });
       _ut.test('test_invalidAssignment_toDynamic', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_invalidAssignment_toDynamic);
       });
+      _ut.test('test_invalidFactoryNameNotAClass', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_invalidFactoryNameNotAClass);
+      });
+      _ut.test('test_invalidOverrideNamed_unorderedNamedParameter', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_invalidOverrideNamed_unorderedNamedParameter);
+      });
+      _ut.test('test_invalidOverrideReturnType_returnType_interface', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_invalidOverrideReturnType_returnType_interface);
+      });
+      _ut.test('test_invalidOverrideReturnType_returnType_interface2', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_invalidOverrideReturnType_returnType_interface2);
+      });
+      _ut.test('test_invalidOverrideReturnType_returnType_mixin', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_invalidOverrideReturnType_returnType_mixin);
+      });
+      _ut.test('test_invalidOverrideReturnType_returnType_parameterizedTypes', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_invalidOverrideReturnType_returnType_parameterizedTypes);
+      });
+      _ut.test('test_invalidOverrideReturnType_returnType_sameType', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_invalidOverrideReturnType_returnType_sameType);
+      });
+      _ut.test('test_invalidOverrideReturnType_returnType_superclass', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_invalidOverrideReturnType_returnType_superclass);
+      });
+      _ut.test('test_invalidOverrideReturnType_returnType_superclass2', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_invalidOverrideReturnType_returnType_superclass2);
+      });
+      _ut.test('test_invalidOverrideReturnType_returnType_void', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_invalidOverrideReturnType_returnType_void);
+      });
+      _ut.test('test_invalidReferenceToThis_constructor', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_invalidReferenceToThis_constructor);
+      });
+      _ut.test('test_invalidReferenceToThis_instanceMethod', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_invalidReferenceToThis_instanceMethod);
+      });
       _ut.test('test_invalidTypeArgumentInConstList', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_invalidTypeArgumentInConstList);
@@ -927,10 +1930,70 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_invocationOfNonFunction_localVariable);
       });
+      _ut.test('test_memberWithClassName_setter', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_memberWithClassName_setter);
+      });
+      _ut.test('test_misMatchedGetterAndSetterTypes_instance_sameTypes', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_misMatchedGetterAndSetterTypes_instance_sameTypes);
+      });
+      _ut.test('test_misMatchedGetterAndSetterTypes_instance_unspecifiedGetter', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_misMatchedGetterAndSetterTypes_instance_unspecifiedGetter);
+      });
+      _ut.test('test_misMatchedGetterAndSetterTypes_instance_unspecifiedSetter', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_misMatchedGetterAndSetterTypes_instance_unspecifiedSetter);
+      });
+      _ut.test('test_misMatchedGetterAndSetterTypes_topLevel_sameTypes', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_misMatchedGetterAndSetterTypes_topLevel_sameTypes);
+      });
+      _ut.test('test_misMatchedGetterAndSetterTypes_topLevel_unspecifiedGetter', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_misMatchedGetterAndSetterTypes_topLevel_unspecifiedGetter);
+      });
+      _ut.test('test_misMatchedGetterAndSetterTypes_topLevel_unspecifiedSetter', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_misMatchedGetterAndSetterTypes_topLevel_unspecifiedSetter);
+      });
+      _ut.test('test_mixinDeclaresConstructor', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_mixinDeclaresConstructor);
+      });
+      _ut.test('test_mixinDeclaresConstructor_factory', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_mixinDeclaresConstructor_factory);
+      });
+      _ut.test('test_mixinInheritsFromNotObject_classDeclaration_mixTypedef', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_mixinInheritsFromNotObject_classDeclaration_mixTypedef);
+      });
+      _ut.test('test_mixinInheritsFromNotObject_typedef_mixTypedef', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_mixinInheritsFromNotObject_typedef_mixTypedef);
+      });
+      _ut.test('test_multipleSuperInitializers_no', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_multipleSuperInitializers_no);
+      });
+      _ut.test('test_multipleSuperInitializers_single', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_multipleSuperInitializers_single);
+      });
       _ut.test('test_newWithAbstractClass_factory', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_newWithAbstractClass_factory);
       });
+      _ut.test('test_newWithUndefinedConstructor', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_newWithUndefinedConstructor);
+      });
+      _ut.test('test_newWithUndefinedConstructorDefault', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_newWithUndefinedConstructorDefault);
+      });
       _ut.test('test_nonBoolExpression_assert_bool', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_nonBoolExpression_assert_bool);
@@ -939,10 +2002,134 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_nonBoolExpression_assert_functionType);
       });
+      _ut.test('test_nonConstCaseExpression', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonConstCaseExpression);
+      });
+      _ut.test('test_nonConstMapAsExpressionStatement_const', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonConstMapAsExpressionStatement_const);
+      });
+      _ut.test('test_nonConstMapAsExpressionStatement_notExpressionStatement', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonConstMapAsExpressionStatement_notExpressionStatement);
+      });
+      _ut.test('test_nonConstMapAsExpressionStatement_typeArguments', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonConstMapAsExpressionStatement_typeArguments);
+      });
+      _ut.test('test_nonConstValueInInitializer_binary_bool', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializer_binary_bool);
+      });
+      _ut.test('test_nonConstValueInInitializer_binary_dynamic', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializer_binary_dynamic);
+      });
+      _ut.test('test_nonConstValueInInitializer_binary_int', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializer_binary_int);
+      });
+      _ut.test('test_nonConstValueInInitializer_binary_num', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializer_binary_num);
+      });
+      _ut.test('test_nonConstValueInInitializer_field', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializer_field);
+      });
+      _ut.test('test_nonConstValueInInitializer_redirecting', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializer_redirecting);
+      });
+      _ut.test('test_nonConstValueInInitializer_super', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializer_super);
+      });
+      _ut.test('test_nonConstValueInInitializer_unary', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializer_unary);
+      });
+      _ut.test('test_nonGenerativeConstructor', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonGenerativeConstructor);
+      });
+      _ut.test('test_nonTypeInCatchClause_isClass', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonTypeInCatchClause_isClass);
+      });
+      _ut.test('test_nonTypeInCatchClause_isFunctionTypeAlias', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonTypeInCatchClause_isFunctionTypeAlias);
+      });
+      _ut.test('test_nonTypeInCatchClause_isTypeVariable', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonTypeInCatchClause_isTypeVariable);
+      });
+      _ut.test('test_nonTypeInCatchClause_noType', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonTypeInCatchClause_noType);
+      });
+      _ut.test('test_nonVoidReturnForOperator_no', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonVoidReturnForOperator_no);
+      });
+      _ut.test('test_nonVoidReturnForOperator_void', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonVoidReturnForOperator_void);
+      });
+      _ut.test('test_nonVoidReturnForSetter_function_no', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonVoidReturnForSetter_function_no);
+      });
+      _ut.test('test_nonVoidReturnForSetter_function_void', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonVoidReturnForSetter_function_void);
+      });
+      _ut.test('test_nonVoidReturnForSetter_method_no', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonVoidReturnForSetter_method_no);
+      });
+      _ut.test('test_nonVoidReturnForSetter_method_void', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonVoidReturnForSetter_method_void);
+      });
       _ut.test('test_optionalParameterInOperator_required', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_optionalParameterInOperator_required);
       });
+      _ut.test('test_prefixCollidesWithTopLevelMembers', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_prefixCollidesWithTopLevelMembers);
+      });
+      _ut.test('test_recursiveConstructorRedirect', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_recursiveConstructorRedirect);
+      });
+      _ut.test('test_recursiveFactoryRedirect', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_recursiveFactoryRedirect);
+      });
+      _ut.test('test_redirectToInvalidFunctionType', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_redirectToInvalidFunctionType);
+      });
+      _ut.test('test_redirectToNonConstConstructor', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_redirectToNonConstConstructor);
+      });
+      _ut.test('test_referenceToDeclaredVariableInInitializer_constructorName', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_referenceToDeclaredVariableInInitializer_constructorName);
+      });
+      _ut.test('test_referenceToDeclaredVariableInInitializer_methodName', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_referenceToDeclaredVariableInInitializer_methodName);
+      });
+      _ut.test('test_referenceToDeclaredVariableInInitializer_propertyName', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_referenceToDeclaredVariableInInitializer_propertyName);
+      });
       _ut.test('test_rethrowOutsideCatch', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_rethrowOutsideCatch);
@@ -963,6 +2150,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_returnOfInvalidType_supertype);
       });
+      _ut.test('test_returnOfInvalidType_void', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_returnOfInvalidType_void);
+      });
       _ut.test('test_returnWithoutValue_noReturnType', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_returnWithoutValue_noReturnType);
@@ -971,6 +2162,22 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_returnWithoutValue_void);
       });
+      _ut.test('test_staticAccessToInstanceMember_method', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_staticAccessToInstanceMember_method);
+      });
+      _ut.test('test_staticAccessToInstanceMember_propertyAccess_field', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_staticAccessToInstanceMember_propertyAccess_field);
+      });
+      _ut.test('test_staticAccessToInstanceMember_propertyAccess_propertyAccessor', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_staticAccessToInstanceMember_propertyAccess_propertyAccessor);
+      });
+      _ut.test('test_superInInvalidContext', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_superInInvalidContext);
+      });
       _ut.test('test_typeArgumentNotMatchingBounds_const', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_typeArgumentNotMatchingBounds_const);
@@ -979,6 +2186,30 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_typeArgumentNotMatchingBounds_new);
       });
+      _ut.test('test_undefinedConstructorInInitializer_explicit_named', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_undefinedConstructorInInitializer_explicit_named);
+      });
+      _ut.test('test_undefinedConstructorInInitializer_explicit_unnamed', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_undefinedConstructorInInitializer_explicit_unnamed);
+      });
+      _ut.test('test_undefinedConstructorInInitializer_implicit', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_undefinedConstructorInInitializer_implicit);
+      });
+      _ut.test('test_undefinedConstructorInInitializer_implicit_typedef', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_undefinedConstructorInInitializer_implicit_typedef);
+      });
+      _ut.test('test_undefinedGetter_noSuchMethod_getter', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_undefinedGetter_noSuchMethod_getter);
+      });
+      _ut.test('test_undefinedGetter_noSuchMethod_getter2', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_undefinedGetter_noSuchMethod_getter2);
+      });
       _ut.test('test_undefinedGetter_typeSubstitution', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_undefinedGetter_typeSubstitution);
@@ -987,6 +2218,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_undefinedIdentifier_hide);
       });
+      _ut.test('test_undefinedIdentifier_noSuchMethod', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_undefinedIdentifier_noSuchMethod);
+      });
       _ut.test('test_undefinedIdentifier_show', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_undefinedIdentifier_show);
@@ -995,10 +2230,30 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_undefinedMethod_noSuchMethod);
       });
+      _ut.test('test_undefinedOperator_index', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_undefinedOperator_index);
+      });
       _ut.test('test_undefinedOperator_tilde', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_undefinedOperator_tilde);
       });
+      _ut.test('test_undefinedSetter_noSuchMethod', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_undefinedSetter_noSuchMethod);
+      });
+      _ut.test('test_wrongNumberOfParametersForOperator1', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_wrongNumberOfParametersForOperator1);
+      });
+      _ut.test('test_wrongNumberOfParametersForOperator_index', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_wrongNumberOfParametersForOperator_index);
+      });
+      _ut.test('test_wrongNumberOfParametersForOperator_minus', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_wrongNumberOfParametersForOperator_minus);
+      });
       _ut.test('test_wrongNumberOfParametersForSetter', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_wrongNumberOfParametersForSetter);
@@ -1007,18 +2262,22 @@
   }
 }
 class LibraryTest extends EngineTestCase {
+
   /**
    * The error listener to which all errors will be reported.
    */
   GatheringErrorListener _errorListener;
+
   /**
    * The source factory used to create libraries.
    */
   SourceFactory _sourceFactory;
+
   /**
    * The analysis context to pass in to all libraries created by the tests.
    */
   AnalysisContextImpl _analysisContext;
+
   /**
    * The library used by the tests.
    */
@@ -1155,182 +2414,234 @@
 class StaticTypeWarningCodeTest extends ResolverTestCase {
   void fail_inaccessibleSetter() {
     Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticTypeWarningCode.INACCESSIBLE_SETTER]);
     verify([source]);
   }
-  void fail_inconsistentMethodInheritance() {
-    Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
-    assertErrors([StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
-    verify([source]);
-  }
   void fail_nonTypeAsTypeArgument() {
     Source source = addSource(EngineTestCase.createSource(["int A;", "class B<E> {}", "f(B<A> b) {}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT]);
     verify([source]);
   }
   void fail_redirectWithInvalidTypeParameters() {
     Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticTypeWarningCode.REDIRECT_WITH_INVALID_TYPE_PARAMETERS]);
     verify([source]);
   }
   void fail_typeArgumentViolatesBounds() {
     Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticTypeWarningCode.TYPE_ARGUMENT_VIOLATES_BOUNDS]);
     verify([source]);
   }
+  void test_inconsistentMethodInheritanceGetterAndMethod() {
+    Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  int x();", "}", "abstract class B {", "  int get x;", "}", "class C implements A, B {", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD]);
+    verify([source]);
+  }
+  void test_invalidAssignment_compoundAssignment() {
+    Source source = addSource(EngineTestCase.createSource(["class byte {", "  int _value;", "  byte(this._value);", "  int operator +(int val) {}", "}", "", "void main() {", "  byte b = new byte(52);", "  b += 3;", "}"]));
+    resolve(source);
+    assertErrors([StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
   void test_invalidAssignment_instanceVariable() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "}", "f() {", "  A a;", "  a.x = '0';", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticTypeWarningCode.INVALID_ASSIGNMENT]);
     verify([source]);
   }
   void test_invalidAssignment_localVariable() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  int x;", "  x = '0';", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticTypeWarningCode.INVALID_ASSIGNMENT]);
     verify([source]);
   }
   void test_invalidAssignment_staticVariable() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  static int x;", "}", "f() {", "  A.x = '0';", "}"]));
-    resolve(source, []);
+    resolve(source);
+    assertErrors([StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+  void test_invalidAssignment_topLevelVariableDeclaration() {
+    Source source = addSource(EngineTestCase.createSource(["int x = 'string';"]));
+    resolve(source);
+    assertErrors([StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+  void test_invalidAssignment_variableDeclaration() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x = 'string';", "}"]));
+    resolve(source);
     assertErrors([StaticTypeWarningCode.INVALID_ASSIGNMENT]);
     verify([source]);
   }
   void test_invocationOfNonFunction_class() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  void m() {", "    A();", "  }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
   }
   void test_invocationOfNonFunction_localVariable() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  int x;", "  return x();", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
     verify([source]);
   }
   void test_invocationOfNonFunction_ordinaryInvocation() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "}", "class B {", "  m() {", "    A.x();", "  }", "}"]));
-    resolve(source, []);
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static int x;", "}", "class B {", "  m() {", "    A.x();", "  }", "}"]));
+    resolve(source);
     assertErrors([StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
   }
   void test_invocationOfNonFunction_staticInvocation() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  static int get g => 0;", "  f() {", "    A.g();", "  }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
   }
   void test_nonBoolCondition_conditional() {
     Source source = addSource(EngineTestCase.createSource(["f() { return 3 ? 2 : 1; }"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticTypeWarningCode.NON_BOOL_CONDITION]);
     verify([source]);
   }
   void test_nonBoolCondition_do() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  do {} while (3);", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticTypeWarningCode.NON_BOOL_CONDITION]);
     verify([source]);
   }
   void test_nonBoolCondition_if() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  if (3) return 2; else return 1;", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticTypeWarningCode.NON_BOOL_CONDITION]);
     verify([source]);
   }
   void test_nonBoolCondition_while() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  while (3) {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticTypeWarningCode.NON_BOOL_CONDITION]);
     verify([source]);
   }
   void test_nonBoolExpression() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  assert(0);", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticTypeWarningCode.NON_BOOL_EXPRESSION]);
     verify([source]);
   }
   void test_returnOfInvalidType_function() {
     Source source = addSource(EngineTestCase.createSource(["int f() { return '0'; }"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
     verify([source]);
   }
   void test_returnOfInvalidType_localFunction() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  String m() {", "    int f() { return '0'; }", "  }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
     verify([source]);
   }
   void test_returnOfInvalidType_method() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int f() { return '0'; }", "}"]));
-    resolve(source, []);
+    resolve(source);
+    assertErrors([StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
+    verify([source]);
+  }
+  void test_returnOfInvalidType_void() {
+    Source source = addSource(EngineTestCase.createSource(["void f() { return 42; }"]));
+    resolve(source);
     assertErrors([StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
     verify([source]);
   }
   void test_typeArgumentNotMatchingBounds_const() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B {}", "class G<E extends A> {", "  const G() {}", "}", "f() { return const G<B>(); }"]));
-    resolve(source, []);
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B {}", "class G<E extends A> {", "  const G();", "}", "f() { return const G<B>(); }"]));
+    resolve(source);
     assertErrors([StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
   void test_typeArgumentNotMatchingBounds_new() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "class B {}", "class G<E extends A> {}", "f() { return new G<B>(); }"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
   void test_undefinedFunction() {
     Source source = addSource(EngineTestCase.createSource(["void f() {", "  g();", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticTypeWarningCode.UNDEFINED_FUNCTION]);
   }
   void test_undefinedGetter() {
     Source source = addSource(EngineTestCase.createSource(["class T {}", "f(T e) { return e.m; }"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
   void test_undefinedGetter_static() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "var a = A.B;"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
   void test_undefinedMethod() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  void m() {", "    n();", "  }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
+  void test_undefinedOperator_indexBoth() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "f(A a) {", "  a[0]++;", "}"]));
+    resolve(source);
+    assertErrors([StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+  void test_undefinedOperator_indexGetter() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "f(A a) {", "  a[0];", "}"]));
+    resolve(source);
+    assertErrors([StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+  void test_undefinedOperator_indexSetter() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "f(A a) {", "  a[0] = 1;", "}"]));
+    resolve(source);
+    assertErrors([StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+  void test_undefinedOperator_plus() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "f(A a) {", "  a + 1;", "}"]));
+    resolve(source);
+    assertErrors([StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
   void test_undefinedSetter() {
     Source source = addSource(EngineTestCase.createSource(["class T {}", "f(T e1) { e1.m = 0; }"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticTypeWarningCode.UNDEFINED_SETTER]);
   }
   void test_undefinedSetter_static() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "f() { A.B = 0;}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticTypeWarningCode.UNDEFINED_SETTER]);
   }
   void test_undefinedSuperMethod() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "class B extends A {", "  m() { return super.m(); }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticTypeWarningCode.UNDEFINED_SUPER_METHOD]);
   }
   void test_wrongNumberOfTypeArguments_tooFew() {
     Source source = addSource(EngineTestCase.createSource(["class A<E, F> {}", "A<A> a = null;"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
     verify([source]);
   }
   void test_wrongNumberOfTypeArguments_tooMany() {
     Source source = addSource(EngineTestCase.createSource(["class A<E> {}", "A<A, A> a = null;"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
     verify([source]);
   }
   static dartSuite() {
     _ut.group('StaticTypeWarningCodeTest', () {
+      _ut.test('test_inconsistentMethodInheritanceGetterAndMethod', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_inconsistentMethodInheritanceGetterAndMethod);
+      });
+      _ut.test('test_invalidAssignment_compoundAssignment', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_invalidAssignment_compoundAssignment);
+      });
       _ut.test('test_invalidAssignment_instanceVariable', () {
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_invalidAssignment_instanceVariable);
@@ -1343,6 +2654,14 @@
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_invalidAssignment_staticVariable);
       });
+      _ut.test('test_invalidAssignment_topLevelVariableDeclaration', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_invalidAssignment_topLevelVariableDeclaration);
+      });
+      _ut.test('test_invalidAssignment_variableDeclaration', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_invalidAssignment_variableDeclaration);
+      });
       _ut.test('test_invocationOfNonFunction_class', () {
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_invocationOfNonFunction_class);
@@ -1391,6 +2710,10 @@
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_returnOfInvalidType_method);
       });
+      _ut.test('test_returnOfInvalidType_void', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_returnOfInvalidType_void);
+      });
       _ut.test('test_typeArgumentNotMatchingBounds_const', () {
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_typeArgumentNotMatchingBounds_const);
@@ -1415,6 +2738,22 @@
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_undefinedMethod);
       });
+      _ut.test('test_undefinedOperator_indexBoth', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_undefinedOperator_indexBoth);
+      });
+      _ut.test('test_undefinedOperator_indexGetter', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_undefinedOperator_indexGetter);
+      });
+      _ut.test('test_undefinedOperator_indexSetter', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_undefinedOperator_indexSetter);
+      });
+      _ut.test('test_undefinedOperator_plus', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_undefinedOperator_plus);
+      });
       _ut.test('test_undefinedSetter', () {
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_undefinedSetter);
@@ -1439,19 +2778,23 @@
   }
 }
 class TypeResolverVisitorTest extends EngineTestCase {
+
   /**
    * The error listener to which errors will be reported.
    */
   GatheringErrorListener _listener;
+
   /**
    * The object representing the information about the library in which the types are being
    * resolved.
    */
   Library _library;
+
   /**
    * The type provider used to access the types.
    */
   TestTypeProvider _typeProvider;
+
   /**
    * The visitor used to resolve types needed to form the type hierarchy.
    */
@@ -1639,6 +2982,7 @@
     JUnitTestCase.assertSame(VoidTypeImpl.instance, typeName.type);
     _listener.assertNoErrors();
   }
+
   /**
    * Analyze the given catch clause and assert that the types of the parameters have been set to the
    * given types. The types can be null if the catch clause does not have the corresponding
@@ -1660,6 +3004,7 @@
       JUnitTestCase.assertSame(stackTraceType, stackTraceParameter2.staticType);
     }
   }
+
   /**
    * Return the type associated with the given parameter after the static type analyzer has computed
    * a type for it.
@@ -1672,6 +3017,7 @@
     resolveNode(node, definedElements);
     return ((node.identifier.element as ParameterElement)).type;
   }
+
   /**
    * Return the element associated with the given identifier after the resolver has resolved the
    * identifier.
@@ -1740,40 +3086,27 @@
   }
 }
 class ResolverTestCase extends EngineTestCase {
+
   /**
    * The source factory used to create {@link Source sources}.
    */
   SourceFactory _sourceFactory;
-  /**
-   * The error listener used during resolution.
-   */
-  GatheringErrorListener _errorListener;
+
   /**
    * The analysis context used to parse the compilation units being resolved.
    */
   AnalysisContextImpl _analysisContext;
-  /**
-   * Assert that the number of errors that have been gathered matches the number of errors that are
-   * given and that they have the expected error codes. The order in which the errors were gathered
-   * is ignored.
-   * @param expectedErrorCodes the error codes of the errors that should have been gathered
-   * @throws AssertionFailedError if a different number of errors have been gathered than were
-   * expected
-   */
-  void assertErrors(List<ErrorCode> expectedErrorCodes) {
-    _errorListener.assertErrors2(expectedErrorCodes);
-  }
   void setUp() {
-    _errorListener = new GatheringErrorListener();
-    _analysisContext = AnalysisContextFactory.contextWithCore();
-    _sourceFactory = _analysisContext.sourceFactory;
+    reset();
   }
+
   /**
    * Add a source file to the content provider.
    * @param contents the contents to be returned by the content provider for the specified file
    * @return the source object representing the added file
    */
   Source addSource(String contents) => addSource2("/test.dart", contents);
+
   /**
    * Add a source file to the content provider. The file path should be absolute.
    * @param filePath the path of the file being added
@@ -1788,19 +3121,46 @@
     _analysisContext.applyChanges(changeSet);
     return source;
   }
+
+  /**
+   * Assert that the number of errors that have been gathered matches the number of errors that are
+   * given and that they have the expected error codes. The order in which the errors were gathered
+   * is ignored.
+   * @param expectedErrorCodes the error codes of the errors that should have been gathered
+   * @throws AssertionFailedError if a different number of errors have been gathered than were
+   * expected
+   */
+  void assertErrors(List<ErrorCode> expectedErrorCodes) {
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    for (ChangeNotice notice in _analysisContext.performAnalysisTask()) {
+      for (AnalysisError error in notice.errors) {
+        errorListener.onError(error);
+      }
+    }
+    errorListener.assertErrors2(expectedErrorCodes);
+  }
+
   /**
    * Assert that no errors have been gathered.
    * @throws AssertionFailedError if any errors have been gathered
    */
   void assertNoErrors() {
-    _errorListener.assertNoErrors();
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    for (ChangeNotice notice in _analysisContext.performAnalysisTask()) {
+      for (AnalysisError error in notice.errors) {
+        errorListener.onError(error);
+      }
+    }
+    errorListener.assertNoErrors();
   }
+
   /**
    * Create a library element that represents a library named {@code "test"} containing a single
    * empty compilation unit.
    * @return the library element that was created
    */
   LibraryElementImpl createTestLibrary() => createTestLibrary2(new AnalysisContextImpl(), "test", []);
+
   /**
    * Create a library element that represents a library with the given name containing a single
    * empty compilation unit.
@@ -1828,8 +3188,8 @@
     return library;
   }
   AnalysisContext get analysisContext => _analysisContext;
-  GatheringErrorListener get errorListener => _errorListener;
   SourceFactory get sourceFactory => _sourceFactory;
+
   /**
    * Return a type provider that can be used to test the results of resolution.
    * @return a type provider
@@ -1839,19 +3199,26 @@
     LibraryElement coreElement = _analysisContext.getLibraryElement(coreSource);
     return new TypeProviderImpl(coreElement);
   }
+
+  /**
+   * In the rare cases we want to group several tests into single "test_" method, so need a way to
+   * reset test instance to reuse it.
+   */
+  void reset() {
+    _analysisContext = AnalysisContextFactory.contextWithCore();
+    _sourceFactory = _analysisContext.sourceFactory;
+  }
+
   /**
    * Given a library and all of its parts, resolve the contents of the library and the contents of
    * the parts. This assumes that the sources for the library and its parts have already been added
    * to the content provider using the method {@link #addSource(String,String)}.
    * @param librarySource the source for the compilation unit that defines the library
-   * @param unitSources the sources for the compilation units that are part of the library
    * @return the element representing the resolved library
    * @throws AnalysisException if the analysis could not be performed
    */
-  LibraryElement resolve(Source librarySource, List<Source> unitSources) {
-    LibraryResolver resolver = new LibraryResolver.con2(_analysisContext, _errorListener);
-    return resolver.resolveLibrary(librarySource, true);
-  }
+  LibraryElement resolve(Source librarySource) => _analysisContext.computeLibraryElement(librarySource);
+
   /**
    * Return the resolved compilation unit corresponding to the given source in the given library.
    * @param source the source of the compilation unit to be returned
@@ -1860,6 +3227,7 @@
    * @throws Exception if the compilation unit could not be resolved
    */
   CompilationUnit resolveCompilationUnit(Source source, LibraryElement library) => _analysisContext.resolveCompilationUnit(source, library);
+
   /**
    * Verify that all of the identifiers in the compilation units associated with the given sources
    * have been resolved.
@@ -1875,6 +3243,7 @@
     }
     verifier.assertResolved();
   }
+
   /**
    * Create a source object representing a file with the given name and give it an empty content.
    * @param fileName the name of the file for which a source is to be created
@@ -1950,708 +3319,1142 @@
     });
   }
 }
+class InheritanceManagerTest extends EngineTestCase {
+
+  /**
+   * The type provider used to access the types.
+   */
+  TestTypeProvider _typeProvider;
+
+  /**
+   * The library containing the code being resolved.
+   */
+  LibraryElementImpl _definingLibrary;
+
+  /**
+   * The inheritance manager being tested.
+   */
+  InheritanceManager _inheritanceManager;
+  void setUp() {
+    _typeProvider = new TestTypeProvider();
+    _inheritanceManager = createInheritanceManager();
+  }
+  void test_lookupInheritance_interface_getter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "g";
+    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [getterG];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.interfaces = <InterfaceType> [classA.type];
+    JUnitTestCase.assertSame(getterG, _inheritanceManager.lookupInheritance(classB, getterName));
+    assertNoErrors(classA);
+    assertNoErrors(classB);
+  }
+  void test_lookupInheritance_interface_method() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classA.methods = <MethodElement> [methodM];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.interfaces = <InterfaceType> [classA.type];
+    JUnitTestCase.assertSame(methodM, _inheritanceManager.lookupInheritance(classB, methodName));
+    assertNoErrors(classA);
+    assertNoErrors(classB);
+  }
+  void test_lookupInheritance_interface_setter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String setterName = "s";
+    PropertyAccessorElement setterS = ElementFactory.setterElement(setterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [setterS];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.interfaces = <InterfaceType> [classA.type];
+    JUnitTestCase.assertSame(setterS, _inheritanceManager.lookupInheritance(classB, "${setterName}="));
+    assertNoErrors(classA);
+    assertNoErrors(classB);
+  }
+  void test_lookupInheritance_interface_staticMember() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    ((methodM as MethodElementImpl)).static = true;
+    classA.methods = <MethodElement> [methodM];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.interfaces = <InterfaceType> [classA.type];
+    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classB, methodName));
+    assertNoErrors(classA);
+    assertNoErrors(classB);
+  }
+  void test_lookupInheritance_interfaces_infiniteLoop() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.interfaces = <InterfaceType> [classA.type];
+    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, "name"));
+    assertNoErrors(classA);
+  }
+  void test_lookupInheritance_interfaces_infiniteLoop2() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classA.interfaces = <InterfaceType> [classB.type];
+    classB.interfaces = <InterfaceType> [classA.type];
+    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, "name"));
+    assertNoErrors(classA);
+    assertNoErrors(classB);
+  }
+  void test_lookupInheritance_interfaces_STWC_inconsistentMethodInheritance() {
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
+    String methodName = "m";
+    MethodElement methodM1 = ElementFactory.methodElement(methodName, null, [_typeProvider.intType]);
+    classI1.methods = <MethodElement> [methodM1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
+    MethodElement methodM2 = ElementFactory.methodElement(methodName, null, [_typeProvider.stringType]);
+    classI2.methods = <MethodElement> [methodM2];
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.interfaces = <InterfaceType> [classI1.type, classI2.type];
+    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, methodName));
+    assertNoErrors(classI1);
+    assertNoErrors(classI2);
+    assertErrors(classA, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
+  }
+  void test_lookupInheritance_interfaces_SWC_inconsistentMethodInheritance() {
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classI1.methods = <MethodElement> [methodM];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
+    PropertyAccessorElement getter = ElementFactory.getterElement(methodName, false, _typeProvider.intType);
+    classI2.accessors = <PropertyAccessorElement> [getter];
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.interfaces = <InterfaceType> [classI1.type, classI2.type];
+    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, methodName));
+    assertNoErrors(classI1);
+    assertNoErrors(classI2);
+    assertErrors(classA, [StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD]);
+  }
+  void test_lookupInheritance_interfaces_union1() {
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
+    String methodName1 = "m1";
+    MethodElement methodM1 = ElementFactory.methodElement(methodName1, _typeProvider.intType, []);
+    classI1.methods = <MethodElement> [methodM1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
+    String methodName2 = "m2";
+    MethodElement methodM2 = ElementFactory.methodElement(methodName2, _typeProvider.intType, []);
+    classI2.methods = <MethodElement> [methodM2];
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.interfaces = <InterfaceType> [classI1.type, classI2.type];
+    JUnitTestCase.assertSame(methodM1, _inheritanceManager.lookupInheritance(classA, methodName1));
+    JUnitTestCase.assertSame(methodM2, _inheritanceManager.lookupInheritance(classA, methodName2));
+    assertNoErrors(classI1);
+    assertNoErrors(classI2);
+    assertNoErrors(classA);
+  }
+  void test_lookupInheritance_interfaces_union2() {
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
+    String methodName1 = "m1";
+    MethodElement methodM1 = ElementFactory.methodElement(methodName1, _typeProvider.intType, []);
+    classI1.methods = <MethodElement> [methodM1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
+    String methodName2 = "m2";
+    MethodElement methodM2 = ElementFactory.methodElement(methodName2, _typeProvider.intType, []);
+    classI2.methods = <MethodElement> [methodM2];
+    classI2.interfaces = <InterfaceType> [classI1.type];
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.interfaces = <InterfaceType> [classI2.type];
+    JUnitTestCase.assertSame(methodM1, _inheritanceManager.lookupInheritance(classA, methodName1));
+    JUnitTestCase.assertSame(methodM2, _inheritanceManager.lookupInheritance(classA, methodName2));
+    assertNoErrors(classI1);
+    assertNoErrors(classI2);
+    assertNoErrors(classA);
+  }
+  void test_lookupInheritance_mixin_getter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "g";
+    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [getterG];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.mixins = <InterfaceType> [classA.type];
+    JUnitTestCase.assertSame(getterG, _inheritanceManager.lookupInheritance(classB, getterName));
+    assertNoErrors(classA);
+    assertNoErrors(classB);
+  }
+  void test_lookupInheritance_mixin_method() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classA.methods = <MethodElement> [methodM];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.mixins = <InterfaceType> [classA.type];
+    JUnitTestCase.assertSame(methodM, _inheritanceManager.lookupInheritance(classB, methodName));
+    assertNoErrors(classA);
+    assertNoErrors(classB);
+  }
+  void test_lookupInheritance_mixin_setter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String setterName = "s";
+    PropertyAccessorElement setterS = ElementFactory.setterElement(setterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [setterS];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.mixins = <InterfaceType> [classA.type];
+    JUnitTestCase.assertSame(setterS, _inheritanceManager.lookupInheritance(classB, "${setterName}="));
+    assertNoErrors(classA);
+    assertNoErrors(classB);
+  }
+  void test_lookupInheritance_mixin_staticMember() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    ((methodM as MethodElementImpl)).static = true;
+    classA.methods = <MethodElement> [methodM];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.mixins = <InterfaceType> [classA.type];
+    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classB, methodName));
+    assertNoErrors(classA);
+    assertNoErrors(classB);
+  }
+  void test_lookupInheritance_noMember() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, "a"));
+    assertNoErrors(classA);
+  }
+  void test_lookupInheritance_superclass_getter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "g";
+    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [getterG];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    JUnitTestCase.assertSame(getterG, _inheritanceManager.lookupInheritance(classB, getterName));
+    assertNoErrors(classA);
+    assertNoErrors(classB);
+  }
+  void test_lookupInheritance_superclass_infiniteLoop() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.supertype = classA.type;
+    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, "name"));
+    assertNoErrors(classA);
+  }
+  void test_lookupInheritance_superclass_infiniteLoop2() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classA.supertype = classB.type;
+    classB.supertype = classA.type;
+    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, "name"));
+    assertNoErrors(classA);
+    assertNoErrors(classB);
+  }
+  void test_lookupInheritance_superclass_method() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classA.methods = <MethodElement> [methodM];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    JUnitTestCase.assertSame(methodM, _inheritanceManager.lookupInheritance(classB, methodName));
+    assertNoErrors(classA);
+    assertNoErrors(classB);
+  }
+  void test_lookupInheritance_superclass_setter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String setterName = "s";
+    PropertyAccessorElement setterS = ElementFactory.setterElement(setterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [setterS];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    JUnitTestCase.assertSame(setterS, _inheritanceManager.lookupInheritance(classB, "${setterName}="));
+    assertNoErrors(classA);
+    assertNoErrors(classB);
+  }
+  void test_lookupInheritance_superclass_staticMember() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    ((methodM as MethodElementImpl)).static = true;
+    classA.methods = <MethodElement> [methodM];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classB, methodName));
+    assertNoErrors(classA);
+    assertNoErrors(classB);
+  }
+  void test_lookupMember_getter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "g";
+    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [getterG];
+    JUnitTestCase.assertSame(getterG, _inheritanceManager.lookupMember(classA, getterName));
+    assertNoErrors(classA);
+  }
+  void test_lookupMember_getter_static() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "g";
+    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, true, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [getterG];
+    JUnitTestCase.assertNull(_inheritanceManager.lookupMember(classA, getterName));
+    assertNoErrors(classA);
+  }
+  void test_lookupMember_method() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classA.methods = <MethodElement> [methodM];
+    JUnitTestCase.assertSame(methodM, _inheritanceManager.lookupMember(classA, methodName));
+    assertNoErrors(classA);
+  }
+  void test_lookupMember_method_static() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    ((methodM as MethodElementImpl)).static = true;
+    classA.methods = <MethodElement> [methodM];
+    JUnitTestCase.assertNull(_inheritanceManager.lookupMember(classA, methodName));
+    assertNoErrors(classA);
+  }
+  void test_lookupMember_noMember() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    JUnitTestCase.assertNull(_inheritanceManager.lookupMember(classA, "a"));
+    assertNoErrors(classA);
+  }
+  void test_lookupMember_setter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String setterName = "s";
+    PropertyAccessorElement setterS = ElementFactory.setterElement(setterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [setterS];
+    JUnitTestCase.assertSame(setterS, _inheritanceManager.lookupMember(classA, "${setterName}="));
+    assertNoErrors(classA);
+  }
+  void test_lookupMember_setter_static() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String setterName = "s";
+    PropertyAccessorElement setterS = ElementFactory.setterElement(setterName, true, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [setterS];
+    JUnitTestCase.assertNull(_inheritanceManager.lookupMember(classA, setterName));
+    assertNoErrors(classA);
+  }
+  void assertErrors(ClassElement classElt, List<ErrorCode> expectedErrorCodes) {
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    Set<AnalysisError> actualErrors = _inheritanceManager.getErrors(classElt);
+    if (actualErrors != null) {
+      for (AnalysisError error in actualErrors) {
+        errorListener.onError(error);
+      }
+    }
+    errorListener.assertErrors2(expectedErrorCodes);
+  }
+  void assertNoErrors(ClassElement classElt) {
+    assertErrors(classElt, []);
+  }
+
+  /**
+   * Create the inheritance manager used by the tests.
+   * @return the inheritance manager that was created
+   */
+  InheritanceManager createInheritanceManager() {
+    AnalysisContextImpl context = AnalysisContextFactory.contextWithCore();
+    FileBasedSource source = new FileBasedSource.con1(new ContentCache(), FileUtilities2.createFile("/test.dart"));
+    CompilationUnitElementImpl definingCompilationUnit = new CompilationUnitElementImpl("test.dart");
+    definingCompilationUnit.source = source;
+    _definingLibrary = ElementFactory.library(context, "test");
+    _definingLibrary.definingCompilationUnit = definingCompilationUnit;
+    return new InheritanceManager(_definingLibrary);
+  }
+  static dartSuite() {
+    _ut.group('InheritanceManagerTest', () {
+      _ut.test('test_lookupInheritance_interface_getter', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_interface_getter);
+      });
+      _ut.test('test_lookupInheritance_interface_method', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_interface_method);
+      });
+      _ut.test('test_lookupInheritance_interface_setter', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_interface_setter);
+      });
+      _ut.test('test_lookupInheritance_interface_staticMember', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_interface_staticMember);
+      });
+      _ut.test('test_lookupInheritance_interfaces_STWC_inconsistentMethodInheritance', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_interfaces_STWC_inconsistentMethodInheritance);
+      });
+      _ut.test('test_lookupInheritance_interfaces_SWC_inconsistentMethodInheritance', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_interfaces_SWC_inconsistentMethodInheritance);
+      });
+      _ut.test('test_lookupInheritance_interfaces_infiniteLoop', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_interfaces_infiniteLoop);
+      });
+      _ut.test('test_lookupInheritance_interfaces_infiniteLoop2', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_interfaces_infiniteLoop2);
+      });
+      _ut.test('test_lookupInheritance_interfaces_union1', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_interfaces_union1);
+      });
+      _ut.test('test_lookupInheritance_interfaces_union2', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_interfaces_union2);
+      });
+      _ut.test('test_lookupInheritance_mixin_getter', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_mixin_getter);
+      });
+      _ut.test('test_lookupInheritance_mixin_method', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_mixin_method);
+      });
+      _ut.test('test_lookupInheritance_mixin_setter', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_mixin_setter);
+      });
+      _ut.test('test_lookupInheritance_mixin_staticMember', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_mixin_staticMember);
+      });
+      _ut.test('test_lookupInheritance_noMember', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_noMember);
+      });
+      _ut.test('test_lookupInheritance_superclass_getter', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_superclass_getter);
+      });
+      _ut.test('test_lookupInheritance_superclass_infiniteLoop', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_superclass_infiniteLoop);
+      });
+      _ut.test('test_lookupInheritance_superclass_infiniteLoop2', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_superclass_infiniteLoop2);
+      });
+      _ut.test('test_lookupInheritance_superclass_method', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_superclass_method);
+      });
+      _ut.test('test_lookupInheritance_superclass_setter', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_superclass_setter);
+      });
+      _ut.test('test_lookupInheritance_superclass_staticMember', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_superclass_staticMember);
+      });
+      _ut.test('test_lookupMember_getter', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupMember_getter);
+      });
+      _ut.test('test_lookupMember_getter_static', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupMember_getter_static);
+      });
+      _ut.test('test_lookupMember_method', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupMember_method);
+      });
+      _ut.test('test_lookupMember_method_static', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupMember_method_static);
+      });
+      _ut.test('test_lookupMember_noMember', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupMember_noMember);
+      });
+      _ut.test('test_lookupMember_setter', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupMember_setter);
+      });
+      _ut.test('test_lookupMember_setter_static', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupMember_setter_static);
+      });
+    });
+  }
+}
 class CompileTimeErrorCodeTest extends ResolverTestCase {
-  void fail_ambiguousExport() {
-    Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart';", "export 'lib2.dart';"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["class N {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["class N {}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.AMBIGUOUS_EXPORT]);
-    verify([source]);
-  }
-  void fail_ambiguousImport_function() {
-    Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';", "import 'lib2.dart';", "g() { return f(); }"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["f() {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["f() {}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.AMBIGUOUS_IMPORT]);
-    verify([source]);
-  }
-  void fail_ambiguousImport_typeAnnotation() {
-    Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';", "import 'lib2.dart';", "class A extends N {}"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["class N {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["class N {}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.AMBIGUOUS_IMPORT]);
-    verify([source]);
-  }
   void fail_compileTimeConstantRaisesException() {
     Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.COMPILE_TIME_CONSTANT_RAISES_EXCEPTION]);
     verify([source]);
   }
-  void fail_constWithNonConstantArgument() {
-    Source source = addSource(EngineTestCase.createSource(["class T {", "  T(a) {};", "}", "f(p) { return const T(p); }"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT]);
-    verify([source]);
-  }
-  void fail_constWithNonType() {
-    Source source = addSource(EngineTestCase.createSource(["int A;", "f() {", "  return const A();", "}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.CONST_WITH_NON_TYPE]);
-    verify([source]);
-  }
-  void fail_constWithTypeParameters() {
-    Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS]);
-    verify([source]);
-  }
-  void fail_constWithUndefinedConstructor() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A(x) {}", "}", "f() {", "  return const A(0);", "}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR]);
+  void fail_constEvalThrowsException() {
+    Source source = addSource(EngineTestCase.createSource(["class C {", "  const C();", "}", "f() { return const C(); }"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION]);
     verify([source]);
   }
   void fail_duplicateDefinition() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  int m = 0;", "  m(a) {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
     verify([source]);
   }
   void fail_duplicateMemberError_classMembers_fields() {
     Source librarySource = addSource(EngineTestCase.createSource(["class A {", "  int a;", "  int a;", "}"]));
-    resolve(librarySource, []);
-    assertErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
-    verify([librarySource]);
-  }
-  void fail_duplicateMemberError_classMembers_methods() {
-    Source librarySource = addSource(EngineTestCase.createSource(["class A {", "  m() {}", "  m() {}", "}"]));
-    resolve(librarySource, []);
+    resolve(librarySource);
     assertErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
     verify([librarySource]);
   }
   void fail_duplicateMemberError_localFields() {
     Source librarySource = addSource(EngineTestCase.createSource(["class A {", "  m() {", "    int a;", "    int a;", "  }", "}"]));
-    resolve(librarySource, []);
+    resolve(librarySource);
     assertErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
     verify([librarySource]);
   }
   void fail_duplicateMemberName() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x = 0;", "  int x() {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.DUPLICATE_MEMBER_NAME]);
     verify([source]);
   }
   void fail_duplicateMemberNameInstanceStatic() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  static int x;", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.DUPLICATE_MEMBER_NAME_INSTANCE_STATIC]);
     verify([source]);
   }
-  void fail_duplicateNamedArgument() {
-    Source source = addSource(EngineTestCase.createSource(["f({a, a}) {}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT]);
-    verify([source]);
-  }
   void fail_extendsOrImplementsDisallowedClass_extends_null() {
     Source source = addSource(EngineTestCase.createSource(["class A extends Null {}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
   void fail_extendsOrImplementsDisallowedClass_implements_null() {
     Source source = addSource(EngineTestCase.createSource(["class A implements Null {}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
   void fail_finalNotInitialized_inConstructor() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final int x;", "  A() {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.FINAL_NOT_INITIALIZED]);
     verify([source]);
   }
-  void fail_getterAndMethodWithSameName() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  get x -> 0;", "  x(y) {}", "}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.GETTER_AND_METHOD_WITH_SAME_NAME]);
-    verify([source]);
-  }
-  void fail_importDuplicatedLibraryName() {
-    Source source = addSource(EngineTestCase.createSource(["library test;", "import 'lib1.dart';", "import 'lib2.dart';"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib;"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib;"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.IMPORT_DUPLICATED_LIBRARY_NAME]);
-    verify([source]);
-  }
-  void fail_invalidConstructorName() {
-    Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME]);
-    verify([source]);
-  }
-  void fail_invalidFactoryNameNotAClass() {
-    Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS]);
-    verify([source]);
-  }
   void fail_invalidOverrideDefaultValue() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  m([a = 0]) {}", "}", "class B extends A {", "  m([a = 1]) {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.INVALID_OVERRIDE_DEFAULT_VALUE]);
     verify([source]);
   }
-  void fail_invalidOverrideNamed() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  m({a, b}) {}", "}", "class B extends A {", "  m({a}) {}", "}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.INVALID_OVERRIDE_NAMED]);
-    verify([source]);
-  }
-  void fail_invalidOverridePositional() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  m([a, b]) {}", "}", "class B extends A {", "  m([a]) {}", "}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.INVALID_OVERRIDE_POSITIONAL]);
-    verify([source]);
-  }
-  void fail_invalidOverrideRequired() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  m(a) {}", "}", "class B extends A {", "  m(a, b) {}", "}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.INVALID_OVERRIDE_REQUIRED]);
-    verify([source]);
-  }
-  void fail_invalidReferenceToThis_staticMethod() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  static m() { return this; }", "}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
-    verify([source]);
-  }
-  void fail_invalidReferenceToThis_topLevelFunction() {
-    Source source = addSource(EngineTestCase.createSource(["f() { return this; }"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
-    verify([source]);
-  }
-  void fail_invalidReferenceToThis_variableInitializer() {
-    Source source = addSource(EngineTestCase.createSource(["int x = this;"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
-    verify([source]);
-  }
-  void fail_memberWithClassName() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int A = 0;", "}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
-    verify([source]);
-  }
   void fail_mixinDeclaresConstructor() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "}", "class B extends Object mixin A {}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR]);
     verify([source]);
   }
-  void fail_mixinInheritsFromNotObject() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B extends A {}", "class C extends Object mixin B {}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
-    verify([source]);
-  }
   void fail_mixinOfNonClass() {
     Source source = addSource(EngineTestCase.createSource(["var A;", "class B extends Object mixin A {}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.MIXIN_OF_NON_CLASS]);
     verify([source]);
   }
-  void fail_mixinOfNonMixin() {
-    Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.MIXIN_OF_NON_MIXIN]);
-    verify([source]);
-  }
-  void fail_mixinReferencesSuper() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  toString() -> super.toString();", "}", "class B extends Object mixin A {}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.MIXIN_REFERENCES_SUPER]);
-    verify([source]);
-  }
-  void fail_mixinWithNonClassSuperclass() {
-    Source source = addSource(EngineTestCase.createSource(["int A;", "class B extends Object mixin A {}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS]);
-    verify([source]);
-  }
-  void fail_multipleSuperInitializers() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B extends A {", "  B() : super(), super() {}", "}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS]);
-    verify([source]);
-  }
   void fail_nonConstantDefaultValue_named() {
     Source source = addSource(EngineTestCase.createSource(["f({x : 2 + 3}) {}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
     verify([source]);
   }
   void fail_nonConstantDefaultValue_positional() {
     Source source = addSource(EngineTestCase.createSource(["f([x = 2 + 3]) {}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
     verify([source]);
   }
-  void fail_nonConstMapAsExpressionStatement() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  {'a' : 0, 'b' : 1};", "}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT]);
-    verify([source]);
-  }
-  void fail_nonConstMapKey() {
-    Source source = addSource(EngineTestCase.createSource(["f(a) {", "  return const {a : 0};", "}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.NON_CONSTANT_MAP_KEY]);
-    verify([source]);
-  }
-  void fail_nonConstValueInInitializer() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  static C;", "  int a;", "  A() : a = C {}", "}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER]);
-    verify([source]);
-  }
   void fail_objectCannotExtendAnotherClass() {
     Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.OBJECT_CANNOT_EXTEND_ANOTHER_CLASS]);
     verify([source]);
   }
-  void fail_overrideMissingNamedParameters() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  m(a, {b}) {}", "}", "class B extends A {", "  m(a) {}", "}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.OVERRIDE_MISSING_NAMED_PARAMETERS]);
-    verify([source]);
-  }
-  void fail_overrideMissingRequiredParameters() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  m(a) {}", "}", "class B extends A {", "  m(a, b) {}", "}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.OVERRIDE_MISSING_REQUIRED_PARAMETERS]);
-    verify([source]);
-  }
-  void fail_prefixCollidesWithTopLevelMembers() {
-    Source source = addSource(EngineTestCase.createSource(["import 'dart:uft' as utf;", "var utf = null;"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
-    verify([source]);
-  }
   void fail_recursiveCompileTimeConstant() {
     Source source = addSource(EngineTestCase.createSource(["const x = y + 1;", "const y = x + 1;"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT]);
     verify([source]);
   }
-  void fail_recursiveFactoryRedirect() {
-    Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT]);
-    verify([source]);
-  }
   void fail_recursiveFunctionTypeAlias_direct() {
     Source source = addSource(EngineTestCase.createSource(["typedef F(F f);"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.RECURSIVE_FUNCTION_TYPE_ALIAS]);
     verify([source]);
   }
   void fail_recursiveFunctionTypeAlias_indirect() {
     Source source = addSource(EngineTestCase.createSource(["typedef F(G g);", "typedef G(F f);"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.RECURSIVE_FUNCTION_TYPE_ALIAS]);
     verify([source]);
   }
-  void fail_recursiveInterfaceInheritance_direct() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements A {}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
-    verify([source]);
-  }
-  void fail_recursiveInterfaceInheritance_indirect() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements B {}", "class B implements A {}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
-    verify([source]);
-  }
-  void fail_redirectToNonConstConstructor() {
-    Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.REDIRECT_TO_NON_CONST_CONSTRUCTOR]);
-    verify([source]);
-  }
-  void fail_referenceToDeclaredVariableInInitializer_getter() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  int x = x + 1;", "}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER]);
-    verify([source]);
-  }
-  void fail_referenceToDeclaredVariableInInitializer_setter() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  int x = x++;", "}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER]);
-    verify([source]);
-  }
   void fail_reservedWordAsIdentifier() {
     Source source = addSource(EngineTestCase.createSource(["int class = 2;"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.RESERVED_WORD_AS_IDENTIFIER]);
     verify([source]);
   }
   void fail_staticTopLevelFunction_topLevel() {
     Source source = addSource(EngineTestCase.createSource(["static f() {}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.STATIC_TOP_LEVEL_FUNCTION]);
     verify([source]);
   }
   void fail_staticTopLevelVariable() {
     Source source = addSource(EngineTestCase.createSource(["static int x;"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.STATIC_TOP_LEVEL_VARIABLE]);
     verify([source]);
   }
-  void fail_superInInvalidContext_factoryConstructor() {
-    Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
-    verify([source]);
-  }
-  void fail_superInInvalidContext_instanceVariableInitializer() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  var a;", "}", "class B extends A {", " var b = super.a;", "}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
-    verify([source]);
-  }
-  void fail_superInInvalidContext_staticMethod() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  static m() {}", "}", "class B extends A {", "  static n() { return super.m(); }", "}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
-    verify([source]);
-  }
-  void fail_superInInvalidContext_staticVariableInitializer() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  static a = 0;", "}", "class B extends A {", "  static b = super.a;", "}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
-    verify([source]);
-  }
-  void fail_superInInvalidContext_topLevelFunction() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  super.f();", "}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
-    verify([source]);
-  }
-  void fail_superInInvalidContext_variableInitializer() {
-    Source source = addSource(EngineTestCase.createSource(["var v = super.v;"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
-    verify([source]);
-  }
   void fail_superInitializerInObject() {
     Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.SUPER_INITIALIZER_IN_OBJECT]);
     verify([source]);
   }
   void fail_typeArgumentsForNonGenericClass_creation_const() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "f(p) {", "  return const A<int>();", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.TYPE_ARGUMENTS_FOR_NON_GENERIC_CLASS]);
     verify([source]);
   }
   void fail_typeArgumentsForNonGenericClass_creation_new() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "f(p) {", "  return new A<int>();", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.TYPE_ARGUMENTS_FOR_NON_GENERIC_CLASS]);
     verify([source]);
   }
   void fail_typeArgumentsForNonGenericClass_typeCast() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "f(p) {", "  return p as A<int>;", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.TYPE_ARGUMENTS_FOR_NON_GENERIC_CLASS]);
     verify([source]);
   }
-  void fail_undefinedConstructorInInitializer() {
-    Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER]);
-    verify([source]);
-  }
   void fail_uninitializedFinalField() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final int i;", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.UNINITIALIZED_FINAL_FIELD]);
     verify([source]);
   }
-  void fail_wrongNumberOfParametersForOperator() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  operator []=(i) {}", "}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR]);
-    verify([source]);
-  }
   void fail_wrongNumberOfTypeArguments_creation_const_tooFew() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "class C<K, V> {}", "f(p) {", "  return const C<A>();", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
     verify([source]);
   }
   void fail_wrongNumberOfTypeArguments_creation_const_tooMany() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "class C<E> {}", "f(p) {", "  return const C<A, A>();", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
     verify([source]);
   }
   void fail_wrongNumberOfTypeArguments_creation_new_tooFew() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "class C<K, V> {}", "f(p) {", "  return new C<A>();", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
     verify([source]);
   }
   void fail_wrongNumberOfTypeArguments_creation_new_tooMany() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "class C<E> {}", "f(p) {", "  return new C<A, A>();", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
     verify([source]);
   }
   void fail_wrongNumberOfTypeArguments_typeTest_tooFew() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "class C<K, V> {}", "f(p) {", "  return p is C<A>;", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
     verify([source]);
   }
   void fail_wrongNumberOfTypeArguments_typeTest_tooMany() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "class C<E> {}", "f(p) {", "  return p is C<A, A>;", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
     verify([source]);
   }
+  void test_ambiguousExport() {
+    Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart';", "export 'lib2.dart';"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.AMBIGUOUS_EXPORT]);
+    verify([source]);
+  }
+  void test_ambiguousImport_as() {
+    Source source = addSource(EngineTestCase.createSource(["import 'lib1.dart';", "import 'lib2.dart';", "f(p) {p as N;}"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.AMBIGUOUS_IMPORT]);
+  }
+  void test_ambiguousImport_extends() {
+    Source source = addSource(EngineTestCase.createSource(["import 'lib1.dart';", "import 'lib2.dart';", "class A extends N {}"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.AMBIGUOUS_IMPORT, CompileTimeErrorCode.EXTENDS_NON_CLASS]);
+  }
+  void test_ambiguousImport_function() {
+    Source source = addSource(EngineTestCase.createSource(["import 'lib1.dart';", "import 'lib2.dart';", "g() { return f(); }"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "f() {}"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "f() {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.AMBIGUOUS_IMPORT, StaticTypeWarningCode.UNDEFINED_FUNCTION]);
+  }
+  void test_ambiguousImport_implements() {
+    Source source = addSource(EngineTestCase.createSource(["import 'lib1.dart';", "import 'lib2.dart';", "class A implements N {}"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.AMBIGUOUS_IMPORT, CompileTimeErrorCode.IMPLEMENTS_NON_CLASS]);
+  }
+  void test_ambiguousImport_instanceCreation() {
+    Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';", "import 'lib2.dart';", "f() {new N();}"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.AMBIGUOUS_IMPORT]);
+  }
+  void test_ambiguousImport_is() {
+    Source source = addSource(EngineTestCase.createSource(["import 'lib1.dart';", "import 'lib2.dart';", "f(p) {p is N;}"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.AMBIGUOUS_IMPORT]);
+  }
+  void test_ambiguousImport_qualifier() {
+    Source source = addSource(EngineTestCase.createSource(["import 'lib1.dart';", "import 'lib2.dart';", "g() { N.FOO; }"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.AMBIGUOUS_IMPORT]);
+  }
+  void test_ambiguousImport_typeArgument_instanceCreation() {
+    Source source = addSource(EngineTestCase.createSource(["import 'lib1.dart';", "import 'lib2.dart';", "class A<T> {}", "f() {new A<N>();}"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.AMBIGUOUS_IMPORT]);
+  }
+  void test_ambiguousImport_varRead() {
+    Source source = addSource(EngineTestCase.createSource(["import 'lib1.dart';", "import 'lib2.dart';", "f() { g(v); }", "g(p) {}"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "var v;"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "var v;"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.AMBIGUOUS_IMPORT]);
+  }
+  void test_ambiguousImport_varWrite() {
+    Source source = addSource(EngineTestCase.createSource(["import 'lib1.dart';", "import 'lib2.dart';", "f() { v = 0; }"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "var v;"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "var v;"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.AMBIGUOUS_IMPORT]);
+  }
   void test_argumentDefinitionTestNonParameter() {
     Source source = addSource(EngineTestCase.createSource(["f() {", " var v = 0;", " return ?v;", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.ARGUMENT_DEFINITION_TEST_NON_PARAMETER]);
     verify([source]);
   }
   void test_builtInIdentifierAsType() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  typedef x;", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE, StaticWarningCode.UNDEFINED_CLASS]);
     verify([source]);
   }
   void test_builtInIdentifierAsTypedefName_classTypeAlias() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "class B {}", "typedef as = A with B;"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME]);
     verify([source]);
   }
   void test_builtInIdentifierAsTypedefName_functionTypeAlias() {
     Source source = addSource(EngineTestCase.createSource(["typedef bool as();"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME]);
     verify([source]);
   }
   void test_builtInIdentifierAsTypeName() {
     Source source = addSource(EngineTestCase.createSource(["class as {}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME]);
     verify([source]);
   }
   void test_builtInIdentifierAsTypeVariableName() {
     Source source = addSource(EngineTestCase.createSource(["class A<as> {}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME]);
     verify([source]);
   }
   void test_caseExpressionTypeImplementsEquals() {
     Source source = addSource(EngineTestCase.createSource(["class IntWrapper {", "  final int value;", "  const IntWrapper(this.value);", "  bool operator ==(IntWrapper x) {", "    return value == x.value;", "  }", "}", "", "f(IntWrapper a) {", "  switch(a) {", "    case(const IntWrapper(1)) : return 1;", "    default: return 0;", "  }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS]);
     verify([source]);
   }
   void test_conflictingConstructorNameAndMember_field() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A.x() {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD]);
     verify([source]);
   }
   void test_conflictingConstructorNameAndMember_method() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A.x() {}", "  void x() {}", "}"]));
-    resolve(source, []);
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A.x();", "  void x() {}", "}"]));
+    resolve(source);
     assertErrors([CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD]);
     verify([source]);
   }
-  void test_constConstructorWithNonFinalField() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  const A() {}", "}"]));
-    resolve(source, []);
+  void test_constConstructorWithNonFinalField_mixin() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  var a;", "}", "class B extends Object with A {", "  const B();", "}"]));
+    resolve(source);
     assertErrors([CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD]);
     verify([source]);
   }
-  void test_constEvalThrowsException() {
-    Source source = addSource(EngineTestCase.createSource(["class C {", "  const C() { throw null; }", "}", "f() { return const C(); }"]));
-    resolve(source, []);
+  void test_constConstructorWithNonFinalField_super() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  var a;", "}", "class B extends A {", "  const B();", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD]);
+    verify([source]);
+  }
+  void test_constConstructorWithNonFinalField_this() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  const A();", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD]);
+    verify([source]);
+  }
+  void test_constEvalThrowsException_binaryMinus_null() {
+    check_constEvalThrowsException_binary_null("null - 5", false);
+    check_constEvalThrowsException_binary_null("5 - null", true);
+  }
+  void test_constEvalThrowsException_binaryPlus_null() {
+    check_constEvalThrowsException_binary_null("null + 5", false);
+    check_constEvalThrowsException_binary_null("5 + null", true);
+  }
+  void test_constEvalThrowsException_unaryBitNot_null() {
+    Source source = addSource("const C = ~null;");
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+  void test_constEvalThrowsException_unaryNegated_null() {
+    Source source = addSource("const C = -null;");
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+  void test_constEvalThrowsException_unaryNot_null() {
+    Source source = addSource("const C = !null;");
+    resolve(source);
     assertErrors([CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
     verify([source]);
   }
+  void test_constEvalTypeBool_binary() {
+    check_constEvalTypeBool_withParameter_binary("p && ''");
+    check_constEvalTypeBool_withParameter_binary("p || ''");
+  }
+  void test_constEvalTypeBoolNumString_equal() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A();", "}", "class B {", "  final a;", "  const B(num p) : a = p == const A();", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING]);
+    verify([source]);
+  }
+  void test_constEvalTypeBoolNumString_notEqual() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A();", "}", "class B {", "  final a;", "  const B(String p) : a = p != const A();", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING]);
+    verify([source]);
+  }
+  void test_constEvalTypeInt_binary() {
+    check_constEvalTypeInt_withParameter_binary("p ^ ''");
+    check_constEvalTypeInt_withParameter_binary("p & ''");
+    check_constEvalTypeInt_withParameter_binary("p | ''");
+    check_constEvalTypeInt_withParameter_binary("p >> ''");
+    check_constEvalTypeInt_withParameter_binary("p << ''");
+  }
+  void test_constEvalTypeNum_binary() {
+    check_constEvalTypeNum_withParameter_binary("p + ''");
+    check_constEvalTypeNum_withParameter_binary("p - ''");
+    check_constEvalTypeNum_withParameter_binary("p * ''");
+    check_constEvalTypeNum_withParameter_binary("p / ''");
+    check_constEvalTypeNum_withParameter_binary("p ~/ ''");
+    check_constEvalTypeNum_withParameter_binary("p > ''");
+    check_constEvalTypeNum_withParameter_binary("p < ''");
+    check_constEvalTypeNum_withParameter_binary("p >= ''");
+    check_constEvalTypeNum_withParameter_binary("p <= ''");
+    check_constEvalTypeNum_withParameter_binary("p % ''");
+  }
   void test_constFormalParameter_fieldFormalParameter() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  var x;", "  A(const this.x) {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.CONST_FORMAL_PARAMETER]);
     verify([source]);
   }
   void test_constFormalParameter_simpleFormalParameter() {
     Source source = addSource(EngineTestCase.createSource(["f(const x) {}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.CONST_FORMAL_PARAMETER]);
     verify([source]);
   }
   void test_constInitializedWithNonConstValue() {
     Source source = addSource(EngineTestCase.createSource(["f(p) {", "  const C = p;", "}"]));
-    resolve(source, []);
+    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, []);
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A();", "}", "f() { return const A<A>(); }"]));
+    resolve(source);
     assertErrors([CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS]);
     verify([source]);
   }
   void test_constWithNonConst() {
     Source source = addSource(EngineTestCase.createSource(["class T {", "  T(a, b, {c, d}) {}", "}", "f() { return const T(0, 1, c: 2, d: 3); }"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.CONST_WITH_NON_CONST]);
     verify([source]);
   }
+  void test_constWithNonConstantArgument() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A(a);", "}", "f(p) { return const A(p); }"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT]);
+    verify([source]);
+  }
+  void test_constWithNonType() {
+    Source source = addSource(EngineTestCase.createSource(["int A;", "f() {", "  return const A();", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.CONST_WITH_NON_TYPE]);
+    verify([source]);
+  }
+  void test_constWithTypeParameters_direct() {
+    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  const V = const A<T>();", "  const A();", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS]);
+    verify([source]);
+  }
+  void test_constWithTypeParameters_indirect() {
+    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  const V = const A<List<T>>();", "  const A();", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS]);
+    verify([source]);
+  }
+  void test_constWithUndefinedConstructor() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A();", "}", "f() {", "  return const A.noSuchConstructor();", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR]);
+  }
+  void test_constWithUndefinedConstructorDefault() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A.name();", "}", "f() {", "  return const A();", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT]);
+    verify([source]);
+  }
   void test_defaultValueInFunctionTypeAlias() {
     Source source = addSource(EngineTestCase.createSource(["typedef F([x = 0]);"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS]);
     verify([source]);
   }
+  void test_duplicateConstructorName_named() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A.a() {}", "  A.a() {}", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME, CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME]);
+    verify([source]);
+  }
+  void test_duplicateConstructorName_unnamed() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "  A() {}", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_DEFAULT, CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_DEFAULT]);
+    verify([source]);
+  }
+  void test_duplicateDefinition_parameterWithFunctionName_local() {
+    Source source = addSource(EngineTestCase.createSource(["main() {", "  f(f) {}", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION, CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    verify([source]);
+  }
+  void test_duplicateDefinition_parameterWithFunctionName_topLevel() {
+    Source source = addSource(EngineTestCase.createSource(["main() {", "  f(f) {}", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION, CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    verify([source]);
+  }
   void test_duplicateMemberError() {
     Source librarySource = addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "", "part 'a.dart';", "part 'b.dart';"]));
     Source sourceA = addSource2("/a.dart", EngineTestCase.createSource(["part of lib;", "", "class A {}"]));
     Source sourceB = addSource2("/b.dart", EngineTestCase.createSource(["part of lib;", "", "class A {}"]));
-    resolve(librarySource, [sourceA, sourceB]);
+    resolve(librarySource);
     assertErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
     verify([librarySource, sourceA, sourceB]);
   }
+  void test_duplicateMemberError_classMembers_methods() {
+    Source librarySource = addSource(EngineTestCase.createSource(["class A {", "  m() {}", "  m() {}", "}"]));
+    resolve(librarySource);
+    assertErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION, CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    verify([librarySource]);
+  }
+  void test_duplicateNamedArgument() {
+    Source source = addSource(EngineTestCase.createSource(["f({a, b}) {}", "main() {", "  f(a: 1, a: 2);", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT]);
+    verify([source]);
+  }
+  void test_exportInternalLibrary() {
+    Source source = addSource(EngineTestCase.createSource(["export 'dart:_interceptors';"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY]);
+    verify([source]);
+  }
   void test_exportOfNonLibrary() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart';"]));
     addSource2("/lib1.dart", EngineTestCase.createSource(["part of lib;"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY]);
     verify([source]);
   }
   void test_extendsNonClass_class() {
     Source source = addSource(EngineTestCase.createSource(["int A;", "class B extends A {}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.EXTENDS_NON_CLASS]);
     verify([source]);
   }
   void test_extendsOrImplementsDisallowedClass_extends_bool() {
     Source source = addSource(EngineTestCase.createSource(["class A extends bool {}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
   void test_extendsOrImplementsDisallowedClass_extends_double() {
     Source source = addSource(EngineTestCase.createSource(["class A extends double {}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
   void test_extendsOrImplementsDisallowedClass_extends_int() {
     Source source = addSource(EngineTestCase.createSource(["class A extends int {}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
   void test_extendsOrImplementsDisallowedClass_extends_num() {
     Source source = addSource(EngineTestCase.createSource(["class A extends num {}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
   void test_extendsOrImplementsDisallowedClass_extends_String() {
     Source source = addSource(EngineTestCase.createSource(["class A extends String {}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
   void test_extendsOrImplementsDisallowedClass_implements_bool() {
     Source source = addSource(EngineTestCase.createSource(["class A implements bool {}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
   void test_extendsOrImplementsDisallowedClass_implements_double() {
     Source source = addSource(EngineTestCase.createSource(["class A implements double {}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
   void test_extendsOrImplementsDisallowedClass_implements_int() {
     Source source = addSource(EngineTestCase.createSource(["class A implements int {}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
   void test_extendsOrImplementsDisallowedClass_implements_num() {
     Source source = addSource(EngineTestCase.createSource(["class A implements num {}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
   void test_extendsOrImplementsDisallowedClass_implements_String() {
     Source source = addSource(EngineTestCase.createSource(["class A implements String {}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
+  void test_extraPositionalArguments_const() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A();", "}", "main() {", "  const A(0);", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS]);
+    verify([source]);
+  }
   void test_fieldInitializedByMultipleInitializers() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A() : x = 0, x = 1 {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS]);
     verify([source]);
   }
   void test_fieldInitializedByMultipleInitializers_multipleInits() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A() : x = 0, x = 1, x = 2 {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS, CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS]);
     verify([source]);
   }
   void test_fieldInitializedByMultipleInitializers_multipleNames() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  int y;", "  A() : x = 0, x = 1, y = 0, y = 1 {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS, CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS]);
     verify([source]);
   }
   void test_fieldInitializedInInitializerAndDeclaration_const() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  const int x = 0;", "  A() : x = 1 {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION]);
     verify([source]);
   }
   void test_fieldInitializedInInitializerAndDeclaration_final() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final int x = 0;", "  A() : x = 1 {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION]);
     verify([source]);
   }
   void test_fieldInitializedInParameterAndInitializer() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A(this.x) : x = 1 {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER]);
     verify([source]);
   }
+  void test_fieldInitializerFactoryConstructor() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  factory A(this.x) {}", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.FIELD_INITIALIZER_FACTORY_CONSTRUCTOR]);
+    verify([source]);
+  }
+  void test_fieldInitializerNotAssignable() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  final int x;", "  const A() : x = '';", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
   void test_fieldInitializerOutsideConstructor() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  m(this.x) {}", "}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR]);
+    resolve(source);
+    assertErrors([ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR]);
     verify([source]);
   }
   void test_fieldInitializerOutsideConstructor_defaultParameter() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  m([this.x]) {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR]);
     verify([source]);
   }
+  void test_fieldInitializerRedirectingConstructor_afterRedirection() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A.named() {}", "  A() : this.named(), x = 42;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR]);
+    verify([source]);
+  }
+  void test_fieldInitializerRedirectingConstructor_beforeRedirection() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A.named() {}", "  A() : x = 42, this.named();", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR]);
+    verify([source]);
+  }
+  void test_fieldInitializingFormalRedirectingConstructor() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A.named() {}", "  A(this.x) : this.named();", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR]);
+    verify([source]);
+  }
+
   /**
    * This test doesn't test the FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR code, but tests the
    * FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION code instead. It is provided here to show
@@ -2663,22 +4466,23 @@
    */
   void test_finalInitializedInDeclarationAndConstructor_initializers() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final x = 0;", "  A() : x = 0 {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION]);
     verify([source]);
   }
   void test_finalInitializedInDeclarationAndConstructor_initializingFormal() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final x = 0;", "  A(this.x) {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR]);
     verify([source]);
   }
   void test_finalInitializedMultipleTimes_initializers() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final x;", "  A() : x = 0, x = 0 {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS]);
     verify([source]);
   }
+
   /**
    * This test doesn't test the FINAL_INITIALIZED_MULTIPLE_TIMES code, but tests the
    * FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER code instead. It is provided here to show
@@ -2689,311 +4493,980 @@
    */
   void test_finalInitializedMultipleTimes_initializingFormal_initializer() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final x;", "  A(this.x) : x = 0 {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER]);
     verify([source]);
   }
   void test_finalInitializedMultipleTimes_initializingFormals() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final x;", "  A(this.x, this.x) {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES]);
     verify([source]);
   }
   void test_finalNotInitialized_instanceField_const() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  const F;", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.FINAL_NOT_INITIALIZED]);
     verify([source]);
   }
   void test_finalNotInitialized_instanceField_const_static() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  static const F;", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.FINAL_NOT_INITIALIZED]);
     verify([source]);
   }
   void test_finalNotInitialized_instanceField_final() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final F;", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.FINAL_NOT_INITIALIZED]);
     verify([source]);
   }
   void test_finalNotInitialized_instanceField_final_static() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  static final F;", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.FINAL_NOT_INITIALIZED]);
     verify([source]);
   }
   void test_finalNotInitialized_library_const() {
     Source source = addSource(EngineTestCase.createSource(["const F;"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.FINAL_NOT_INITIALIZED]);
     verify([source]);
   }
   void test_finalNotInitialized_library_final() {
     Source source = addSource(EngineTestCase.createSource(["final F;"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.FINAL_NOT_INITIALIZED]);
     verify([source]);
   }
   void test_finalNotInitialized_local_const() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  const int x;", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.FINAL_NOT_INITIALIZED]);
     verify([source]);
   }
   void test_finalNotInitialized_local_final() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  final int x;", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.FINAL_NOT_INITIALIZED]);
     verify([source]);
   }
+  void test_getterAndMethodWithSameName() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  x(y) {}", "  get x => 0;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.GETTER_AND_METHOD_WITH_SAME_NAME, CompileTimeErrorCode.GETTER_AND_METHOD_WITH_SAME_NAME]);
+    verify([source]);
+  }
   void test_implementsDynamic() {
     Source source = addSource(EngineTestCase.createSource(["class A implements dynamic {}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.IMPLEMENTS_DYNAMIC]);
     verify([source]);
   }
   void test_implementsNonClass_class() {
     Source source = addSource(EngineTestCase.createSource(["int A;", "class B implements A {}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.IMPLEMENTS_NON_CLASS]);
     verify([source]);
   }
   void test_implementsNonClass_typedef() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "int B;", "typedef C = A implements B;"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.IMPLEMENTS_NON_CLASS]);
     verify([source]);
   }
   void test_implementsRepeated() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "class B implements A, A {}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.IMPLEMENTS_REPEATED]);
     verify([source]);
   }
   void test_implementsRepeated_3times() {
     Source source = addSource(EngineTestCase.createSource(["class A {} class C{}", "class B implements A, A, A, A {}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.IMPLEMENTS_REPEATED, CompileTimeErrorCode.IMPLEMENTS_REPEATED, CompileTimeErrorCode.IMPLEMENTS_REPEATED]);
     verify([source]);
   }
-  void test_implementsSelf() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements A {}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.IMPLEMENTS_SELF]);
+  void test_implicitThisReferenceInInitializer_field() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  var v;", "  A() : v = f;", "  var f;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
+    verify([source]);
+  }
+  void test_implicitThisReferenceInInitializer_invocation() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  var v;", "  A() : v = f();", "  f() {}", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
+    verify([source]);
+  }
+  void test_implicitThisReferenceInInitializer_redirectingConstructorInvocation() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A(p) {}", "  A.named() : this(f);", "  var f;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
+    verify([source]);
+  }
+  void test_implicitThisReferenceInInitializer_superConstructorInvocation() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A(p) {}", "}", "class B extends A {", "  B() : super(f);", "  var f;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
+    verify([source]);
+  }
+  void test_importInternalLibrary() {
+    Source source = addSource(EngineTestCase.createSource(["import 'dart:_interceptors';"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY]);
+    verify([source]);
+  }
+  void test_importInternalLibrary_collection() {
+    Source source = addSource(EngineTestCase.createSource(["import 'dart:_collection-dev';"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY]);
     verify([source]);
   }
   void test_importOfNonLibrary() {
     Source source = addSource(EngineTestCase.createSource(["library lib;", "import 'part.dart';"]));
     addSource2("/part.dart", EngineTestCase.createSource(["part of lib;"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY]);
     verify([source]);
   }
   void test_inconsistentCaseExpressionTypes() {
     Source source = addSource(EngineTestCase.createSource(["f(var p) {", "  switch (p) {", "    case 1:", "      break;", "    case 'a':", "      break;", "  }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES]);
     verify([source]);
   }
   void test_inconsistentCaseExpressionTypes_repeated() {
     Source source = addSource(EngineTestCase.createSource(["f(var p) {", "  switch (p) {", "    case 1:", "      break;", "    case 'a':", "      break;", "    case 'b':", "      break;", "  }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES, CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES]);
     verify([source]);
   }
   void test_initializerForNonExistant_initializer() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  A() : x = 0 {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTANT_FIELD]);
   }
   void test_initializerForStaticField() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  static x;", "  A() : x = 0 {}", "}"]));
-    resolve(source, []);
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static int x;", "  A() : x = 0 {}", "}"]));
+    resolve(source);
     assertErrors([CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD]);
     verify([source]);
   }
   void test_initializingFormalForNonExistantField() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  A(this.x) {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD]);
     verify([source]);
   }
   void test_initializingFormalForNonExistantField_notInEnclosingClass() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "int x;", "}", "class B extends A {", "  B(this.x) {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD]);
     verify([source]);
   }
   void test_initializingFormalForNonExistantField_optional() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  A([this.x]) {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD]);
     verify([source]);
   }
   void test_initializingFormalForNonExistantField_static() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  static x;", "  A([this.x]) {}", "}"]));
-    resolve(source, []);
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static int x;", "  A([this.x]) {}", "}"]));
+    resolve(source);
     assertErrors([CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD]);
     verify([source]);
   }
+  void test_invalidConstructorName_notEnclosingClassName() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  B() : super();", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME]);
+  }
+  void test_invalidFactoryNameNotAClass_notClassName() {
+    Source source = addSource(EngineTestCase.createSource(["int B;", "class A {", "  factory B() {}", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS]);
+    verify([source]);
+  }
+  void test_invalidFactoryNameNotAClass_notEnclosingClassName() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  factory B() {}", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS]);
+  }
+  void test_invalidOverrideNamed_fewerNamedParameters() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  m({a, b}) {}", "}", "class B extends A {", "  m({a}) {}", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.INVALID_OVERRIDE_NAMED]);
+    verify([source]);
+  }
+  void test_invalidOverrideNamed_missingNamedParameter() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  m({a, b}) {}", "}", "class B extends A {", "  m({a, c}) {}", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.INVALID_OVERRIDE_NAMED]);
+    verify([source]);
+  }
+  void test_invalidOverridePositional() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  m([a, b]) {}", "}", "class B extends A {", "  m([a]) {}", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.INVALID_OVERRIDE_POSITIONAL]);
+    verify([source]);
+  }
+  void test_invalidOverrideRequired() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  m(a) {}", "}", "class B extends A {", "  m(a, b) {}", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.INVALID_OVERRIDE_REQUIRED]);
+    verify([source]);
+  }
+  void test_invalidReferenceToThis_factoryConstructor() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  factory A() { return this; }", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
+    verify([source]);
+  }
+  void test_invalidReferenceToThis_instanceVariableInitializer_inConstructor() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  var f;", "  A() : f = this;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
+    verify([source]);
+  }
+  void test_invalidReferenceToThis_instanceVariableInitializer_inDeclaration() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  var f = this;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
+    verify([source]);
+  }
+  void test_invalidReferenceToThis_staticMethod() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static m() { return this; }", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
+    verify([source]);
+  }
+  void test_invalidReferenceToThis_staticVariableInitializer() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static A f = this;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
+    verify([source]);
+  }
+  void test_invalidReferenceToThis_topLevelFunction() {
+    Source source = addSource("f() { return this; }");
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
+    verify([source]);
+  }
+  void test_invalidReferenceToThis_variableInitializer() {
+    Source source = addSource("int x = this;");
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
+    verify([source]);
+  }
   void test_invalidTypeArgumentForKey() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  m() {", "    return const <int, int>{}", "  }", "}"]));
-    resolve(source, []);
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  m() {", "    return const <int, int>{};", "  }", "}"]));
+    resolve(source);
     assertErrors([CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_FOR_KEY]);
     verify([source]);
   }
   void test_invalidTypeArgumentInConstList() {
-    Source source = addSource(EngineTestCase.createSource(["class A<E> {", "  m() {", "    return const <E>[]", "  }", "}"]));
-    resolve(source, []);
+    Source source = addSource(EngineTestCase.createSource(["class A<E> {", "  m() {", "    return const <E>[];", "  }", "}"]));
+    resolve(source);
     assertErrors([CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST]);
     verify([source]);
   }
   void test_invalidTypeArgumentInConstMap() {
-    Source source = addSource(EngineTestCase.createSource(["class A<E> {", "  m() {", "    return const <String, E>{}", "  }", "}"]));
-    resolve(source, []);
+    Source source = addSource(EngineTestCase.createSource(["class A<E> {", "  m() {", "    return const <String, E>{};", "  }", "}"]));
+    resolve(source);
     assertErrors([CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP]);
     verify([source]);
   }
   void test_invalidUri_export() {
-    Source source = addSource(EngineTestCase.createSource(["library L;", "export 'unknown.dart';"]));
-    resolve(source, []);
+    Source source = addSource(EngineTestCase.createSource(["export 'ht:';"]));
+    resolve(source);
     assertErrors([CompileTimeErrorCode.INVALID_URI]);
   }
   void test_invalidUri_import() {
-    Source source = addSource(EngineTestCase.createSource(["library L;", "import 'unknown.dart';"]));
-    resolve(source, []);
+    Source source = addSource(EngineTestCase.createSource(["import 'ht:';"]));
+    resolve(source);
     assertErrors([CompileTimeErrorCode.INVALID_URI]);
   }
   void test_invalidUri_part() {
-    Source source = addSource(EngineTestCase.createSource(["library L;", "part 'unknown.dart';"]));
-    resolve(source, []);
+    Source source = addSource(EngineTestCase.createSource(["part 'ht:';"]));
+    resolve(source);
     assertErrors([CompileTimeErrorCode.INVALID_URI]);
   }
   void test_labelInOuterScope() {
-    Source source = addSource(EngineTestCase.createSource(["class int {}", "", "class A {", "  void m(int i) {", "    l: while (i > 0) {", "      void f() {", "        break l;", "      };", "    }", "  }", "}"]));
-    resolve(source, []);
-    assertErrors([CompileTimeErrorCode.LABEL_IN_OUTER_SCOPE, StaticWarningCode.UNDEFINED_OPERATOR]);
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  void m(int i) {", "    l: while (i > 0) {", "      void f() {", "        break l;", "      };", "    }", "  }", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.LABEL_IN_OUTER_SCOPE]);
   }
   void test_labelUndefined_break() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  x: while (true) {", "    break y;", "  }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.LABEL_UNDEFINED]);
   }
   void test_labelUndefined_continue() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  x: while (true) {", "    continue y;", "  }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.LABEL_UNDEFINED]);
   }
+  void test_memberWithClassName_field() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int A = 0;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
+    verify([source]);
+  }
+  void test_memberWithClassName_field2() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int z, A, b = 0;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
+    verify([source]);
+  }
+  void test_memberWithClassName_getter() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  get A => 0;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
+    verify([source]);
+  }
+  void test_memberWithClassName_method() {
+  }
+  void test_methodAndGetterWithSameName() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  get x => 0;", "  x(y) {}", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.METHOD_AND_GETTER_WITH_SAME_NAME, CompileTimeErrorCode.METHOD_AND_GETTER_WITH_SAME_NAME]);
+    verify([source]);
+  }
+  void test_mixinDeclaresConstructor_classDeclaration() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "}", "class B extends Object with A {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR]);
+    verify([source]);
+  }
+  void test_mixinDeclaresConstructor_typedef() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "}", "typedef B = Object with A;"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR]);
+    verify([source]);
+  }
+  void test_mixinInheritsFromNotObject_classDeclaration_extends() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B extends A {}", "class C extends Object with B {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
+    verify([source]);
+  }
+  void test_mixinInheritsFromNotObject_classDeclaration_with() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B extends Object with A {}", "class C extends Object with B {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
+    verify([source]);
+  }
+  void test_mixinInheritsFromNotObject_typedef_extends() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B extends A {}", "typedef C = Object with B;"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
+    verify([source]);
+  }
+  void test_mixinInheritsFromNotObject_typedef_with() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B extends Object with A {}", "typedef C = Object with B;"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
+    verify([source]);
+  }
   void test_mixinOfNonClass_class() {
-    Source source = addSource(EngineTestCase.createSource(["int A;", "class B with A {}"]));
-    resolve(source, []);
+    Source source = addSource(EngineTestCase.createSource(["int A;", "class B extends Object with A {}"]));
+    resolve(source);
     assertErrors([CompileTimeErrorCode.MIXIN_OF_NON_CLASS]);
     verify([source]);
   }
   void test_mixinOfNonClass_typedef() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "int B;", "typedef C = A with B;"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.MIXIN_OF_NON_CLASS]);
     verify([source]);
   }
+  void test_mixinReferencesSuper() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  toString() => super.toString();", "}", "class B extends Object with A {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.MIXIN_REFERENCES_SUPER]);
+    verify([source]);
+  }
+  void test_mixinWithNonClassSuperclass_class() {
+    Source source = addSource(EngineTestCase.createSource(["int A;", "class B {}", "class C extends A with B {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS]);
+    verify([source]);
+  }
+  void test_mixinWithNonClassSuperclass_typedef() {
+    Source source = addSource(EngineTestCase.createSource(["int A;", "class B {}", "typedef C = A with B;"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS]);
+    verify([source]);
+  }
+  void test_multipleRedirectingConstructorInvocations() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() : this.a(), this.b();", "  A.a() {}", "  A.b() {}", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS]);
+    verify([source]);
+  }
+  void test_multipleSuperInitializers() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B extends A {", "  B() : super(), super() {}", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS]);
+    verify([source]);
+  }
   void test_nativeFunctionBodyInNonSDKCode_function() {
     Source source = addSource(EngineTestCase.createSource(["int m(a) native 'string';"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE]);
     verify([source]);
   }
   void test_nativeFunctionBodyInNonSDKCode_method() {
     Source source = addSource(EngineTestCase.createSource(["class A{", "  static int m(a) native 'string';", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE]);
     verify([source]);
   }
   void test_newWithInvalidTypeParameters() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "f() { return new A<A>(); }"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.NEW_WITH_INVALID_TYPE_PARAMETERS]);
     verify([source]);
   }
   void test_nonConstCaseExpression() {
     Source source = addSource(EngineTestCase.createSource(["f(int p, int q) {", "  switch (p) {", "    case 3 + q:", "      break;", "  }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION]);
     verify([source]);
   }
   void test_nonConstListElement() {
     Source source = addSource(EngineTestCase.createSource(["f(a) {", "  return const [a];", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
     verify([source]);
   }
+  void test_nonConstMapAsExpressionStatement_begin() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  {'a' : 0, 'b' : 1}.length;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT]);
+    verify([source]);
+  }
+  void test_nonConstMapAsExpressionStatement_only() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  {'a' : 0, 'b' : 1};", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT]);
+    verify([source]);
+  }
+  void test_nonConstMapKey() {
+    Source source = addSource(EngineTestCase.createSource(["f(a) {", "  return const {a : 0};", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.NON_CONSTANT_MAP_KEY]);
+    verify([source]);
+  }
   void test_nonConstMapValue() {
     Source source = addSource(EngineTestCase.createSource(["f(a) {", "  return const {'a' : a};", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE]);
     verify([source]);
   }
+  void test_nonConstValueInInitializer_binary_notBool_left() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  final bool a;", "  const A(String p) : a = p && true;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER]);
+    verify([source]);
+  }
+  void test_nonConstValueInInitializer_binary_notBool_right() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  final bool a;", "  const A(String p) : a = true && p;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER]);
+    verify([source]);
+  }
+  void test_nonConstValueInInitializer_binary_notInt() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  final int a;", "  const A(String p) : a = 5 & p;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+  void test_nonConstValueInInitializer_binary_notNum() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  final int a;", "  const A(String p) : a = 5 + p;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+  void test_nonConstValueInInitializer_field() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static int C;", "  final int a;", "  const A() : a = C;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER]);
+    verify([source]);
+  }
+  void test_nonConstValueInInitializer_redirecting() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static var C;", "  const A.named(p);", "  const A() : this.named(C);", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER]);
+    verify([source]);
+  }
+  void test_nonConstValueInInitializer_super() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A(p);", "}", "class B extends A {", "  static var C;", "  const B() : super(C);", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER]);
+    verify([source]);
+  }
+  void test_nonGenerativeConstructor_explicit() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  factory A.named() {}", "}", "class B extends A {", "  B() : super.named();", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR]);
+    verify([source]);
+  }
+  void test_nonGenerativeConstructor_implicit() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  factory A() {}", "}", "class B extends A {", "  B();", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR]);
+    verify([source]);
+  }
+  void test_notEnoughRequiredArguments_const() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A(int p);", "}", "main() {", "  const A();", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.NOT_ENOUGH_REQUIRED_ARGUMENTS]);
+    verify([source]);
+  }
   void test_optionalParameterInOperator_named() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  operator +({p}) {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR]);
     verify([source]);
   }
   void test_optionalParameterInOperator_positional() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  operator +([p]) {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR]);
     verify([source]);
   }
   void test_partOfNonPart() {
     Source source = addSource(EngineTestCase.createSource(["library l1;", "part 'l2.dart';"]));
     addSource2("/l2.dart", EngineTestCase.createSource(["library l2;"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.PART_OF_NON_PART]);
     verify([source]);
   }
+  void test_prefixCollidesWithTopLevelMembers_functionTypeAlias() {
+    addSource2("/lib.dart", "library lib;");
+    Source source = addSource(EngineTestCase.createSource(["import '/lib.dart' as p;", "typedef p();"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
+    verify([source]);
+  }
+  void test_prefixCollidesWithTopLevelMembers_topLevelFunction() {
+    addSource2("/lib.dart", "library lib;");
+    Source source = addSource(EngineTestCase.createSource(["import '/lib.dart' as p;", "p() {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
+    verify([source]);
+  }
+  void test_prefixCollidesWithTopLevelMembers_topLevelVariable() {
+    addSource2("/lib.dart", "library lib;");
+    Source source = addSource(EngineTestCase.createSource(["import '/lib.dart' as p;", "var p = null;"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
+    verify([source]);
+  }
+  void test_prefixCollidesWithTopLevelMembers_type() {
+    addSource2("/lib.dart", "library lib;");
+    Source source = addSource(EngineTestCase.createSource(["import '/lib.dart' as p;", "class p {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
+    verify([source]);
+  }
   void test_privateOptionalParameter() {
     Source source = addSource(EngineTestCase.createSource(["f({_p : 0}) {}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER]);
     verify([source]);
   }
+  void test_recursiveConstructorRedirect() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A.a() : this.b();", "  A.b() : this.a();", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT, CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT]);
+    verify([source]);
+  }
+  void test_recursiveConstructorRedirect_directSelfReference() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() : this();", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT]);
+    verify([source]);
+  }
+  void test_recursiveFactoryRedirect() {
+    Source source = addSource(EngineTestCase.createSource(["class A implements B {", "  factory A() = C;", "}", "class B implements C {", "  factory B() = A;", "}", "class C implements A {", "  factory C() = B;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT, CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT, CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT, CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
+    verify([source]);
+  }
+  void test_recursiveFactoryRedirect_directSelfReference() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  factory A() = A;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT]);
+    verify([source]);
+  }
+  void test_recursiveFactoryRedirect_generic() {
+    Source source = addSource(EngineTestCase.createSource(["class A<T> implements B<T> {", "  factory A() = C;", "}", "class B<T> implements C<T> {", "  factory B() = A;", "}", "class C<T> implements A<T> {", "  factory C() = B;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT, CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT, CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT, CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
+    verify([source]);
+  }
+  void test_recursiveFactoryRedirect_named() {
+    Source source = addSource(EngineTestCase.createSource(["class A implements B {", "  factory A.nameA() = C.nameC;", "}", "class B implements C {", "  factory B.nameB() = A.nameA;", "}", "class C implements A {", "  factory C.nameC() = B.nameB;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT, CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT, CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT, CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
+    verify([source]);
+  }
+
+  /**
+   * "A" references "C" which has cycle with "B". But we should not report problem for "A" - it is
+   * not the part of a cycle.
+   */
+  void test_recursiveFactoryRedirect_outsideCycle() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  factory A() = C;", "}", "class B implements C {", "  factory B() = C;", "}", "class C implements A, B {", "  factory C() = B;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT, CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT, CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
+    verify([source]);
+  }
+  void test_recursiveInterfaceInheritance_extends() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends B {}", "class B extends A {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
+    verify([source]);
+  }
+  void test_recursiveInterfaceInheritance_extends_implements() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends B {}", "class B implements A {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
+    verify([source]);
+  }
+  void test_recursiveInterfaceInheritance_implements() {
+    Source source = addSource(EngineTestCase.createSource(["class A implements B {}", "class B implements A {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
+    verify([source]);
+  }
+  void test_recursiveInterfaceInheritance_tail() {
+    Source source = addSource(EngineTestCase.createSource(["abstract class A implements A {}", "class B implements A {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS]);
+    verify([source]);
+  }
+  void test_recursiveInterfaceInheritance_tail2() {
+    Source source = addSource(EngineTestCase.createSource(["abstract class A implements B {}", "abstract class B implements A {}", "class C implements A {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
+    verify([source]);
+  }
+  void test_recursiveInterfaceInheritance_tail3() {
+    Source source = addSource(EngineTestCase.createSource(["abstract class A implements B {}", "abstract class B implements C {}", "abstract class C implements A {}", "class D implements A {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
+    verify([source]);
+  }
+  void test_recursiveInterfaceInheritanceBaseCaseExtends() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends A {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS]);
+    verify([source]);
+  }
+  void test_recursiveInterfaceInheritanceBaseCaseImplements() {
+    Source source = addSource(EngineTestCase.createSource(["class A implements A {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS]);
+    verify([source]);
+  }
+  void test_recursiveInterfaceInheritanceBaseCaseImplements_typedef() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "class M {}", "typedef B = A with M implements B;"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS]);
+    verify([source]);
+  }
+  void test_redirectToNonConstConstructor() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A.a() {}", "  const factory A.b() = A.a;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.REDIRECT_TO_NON_CONST_CONSTRUCTOR]);
+    verify([source]);
+  }
+  void test_referenceToDeclaredVariableInInitializer_closure() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  var x = (x) {};", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER]);
+    verify([source]);
+  }
+  void test_referenceToDeclaredVariableInInitializer_getter() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  int x = x + 1;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER]);
+    verify([source]);
+  }
+  void test_referenceToDeclaredVariableInInitializer_setter() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  int x = x++;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER]);
+    verify([source]);
+  }
+  void test_referenceToDeclaredVariableInInitializer_unqualifiedInvocation() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  var x = x();", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER]);
+    verify([source]);
+  }
   void test_rethrowOutsideCatch() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  rethrow;", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.RETHROW_OUTSIDE_CATCH]);
     verify([source]);
   }
   void test_returnInGenerativeConstructor() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  A() { return 0; }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR]);
     verify([source]);
   }
+  void test_superInInvalidContext_binaryExpression() {
+    Source source = addSource(EngineTestCase.createSource(["var v = super + 0;"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
+  }
+  void test_superInInvalidContext_constructorFieldInitializer() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  m() {}", "}", "class B extends A {", "  var f;", "  B() : f = super.m();", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
+  }
+  void test_superInInvalidContext_factoryConstructor() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  m() {}", "}", "class B extends A {", "  factory B() {", "    super.m();", "  }", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
+  }
+  void test_superInInvalidContext_instanceVariableInitializer() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  var a;", "}", "class B extends A {", " var b = super.a;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
+  }
+  void test_superInInvalidContext_staticMethod() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static m() {}", "}", "class B extends A {", "  static n() { return super.m(); }", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
+  }
+  void test_superInInvalidContext_staticVariableInitializer() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static int a = 0;", "}", "class B extends A {", "  static int b = super.a;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
+  }
+  void test_superInInvalidContext_topLevelFunction() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  super.f();", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
+  }
+  void test_superInInvalidContext_topLevelVariableInitializer() {
+    Source source = addSource(EngineTestCase.createSource(["var v = super.y;"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
+  }
+  void test_superInRedirectingConstructor_redirectionSuper() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B {", "  B() : this.name(), super();", "  B.name() {}", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR]);
+    verify([source]);
+  }
+  void test_superInRedirectingConstructor_superRedirection() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B {", "  B() : super(), this.name();", "  B.name() {}", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR]);
+    verify([source]);
+  }
+  void test_undefinedClass_const() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  return const A();", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.UNDEFINED_CLASS]);
+    verify([source]);
+  }
+  void test_undefinedConstructorInInitializer_explicit_named() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B extends A {", "  B() : super.named();", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER]);
+  }
+  void test_undefinedConstructorInInitializer_explicit_unnamed() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A.named() {}", "}", "class B extends A {", "  B() : super();", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT]);
+    verify([source]);
+  }
+  void test_undefinedConstructorInInitializer_implicit() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A.named() {}", "}", "class B extends A {", "  B();", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT]);
+    verify([source]);
+  }
+  void test_undefinedNamedParameter() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A();", "}", "main() {", "  const A(p: 0);", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER]);
+  }
+  void test_uriDoesNotExist_export() {
+    Source source = addSource(EngineTestCase.createSource(["export 'unknown.dart';"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
+  }
+  void test_uriDoesNotExist_import() {
+    Source source = addSource(EngineTestCase.createSource(["import 'unknown.dart';"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
+  }
+  void test_uriDoesNotExist_part() {
+    Source source = addSource(EngineTestCase.createSource(["part 'unknown.dart';"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
+  }
   void test_uriWithInterpolation_constant() {
     Source source = addSource(EngineTestCase.createSource(["import 'stuff_\$platform.dart';"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.URI_WITH_INTERPOLATION, StaticWarningCode.UNDEFINED_IDENTIFIER]);
   }
   void test_uriWithInterpolation_nonConstant() {
     Source source = addSource(EngineTestCase.createSource(["library lib;", "part '\${'a'}.dart';"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([CompileTimeErrorCode.URI_WITH_INTERPOLATION]);
   }
-  void test_wrongNumberOfParametersForSetter_tooFew() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  set x() {}", "}"]));
-    resolve(source, []);
+  void test_wrongNumberOfParametersForOperator_minus() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  operator -(a, b) {}", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS]);
+    verify([source]);
+    reset();
+  }
+  void test_wrongNumberOfParametersForOperator_tilde() {
+    check_wrongNumberOfParametersForOperator("~", "a");
+    check_wrongNumberOfParametersForOperator("~", "a, b");
+  }
+  void test_wrongNumberOfParametersForOperator1() {
+    check_wrongNumberOfParametersForOperator1("<");
+    check_wrongNumberOfParametersForOperator1(">");
+    check_wrongNumberOfParametersForOperator1("<=");
+    check_wrongNumberOfParametersForOperator1(">=");
+    check_wrongNumberOfParametersForOperator1("+");
+    check_wrongNumberOfParametersForOperator1("/");
+    check_wrongNumberOfParametersForOperator1("~/");
+    check_wrongNumberOfParametersForOperator1("*");
+    check_wrongNumberOfParametersForOperator1("%");
+    check_wrongNumberOfParametersForOperator1("|");
+    check_wrongNumberOfParametersForOperator1("^");
+    check_wrongNumberOfParametersForOperator1("&");
+    check_wrongNumberOfParametersForOperator1("<<");
+    check_wrongNumberOfParametersForOperator1(">>");
+    check_wrongNumberOfParametersForOperator1("[]");
+  }
+  void test_wrongNumberOfParametersForSetter_function_tooFew() {
+    Source source = addSource("set x() {}");
+    resolve(source);
     assertErrors([CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
     verify([source]);
   }
-  void test_wrongNumberOfParametersForSetter_tooMany() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  set x(a, b) {}", "}"]));
-    resolve(source, []);
+  void test_wrongNumberOfParametersForSetter_function_tooMany() {
+    Source source = addSource("set x(a, b) {}");
+    resolve(source);
     assertErrors([CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
     verify([source]);
   }
+  void test_wrongNumberOfParametersForSetter_method_tooFew() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  set x() {}", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
+    verify([source]);
+  }
+  void test_wrongNumberOfParametersForSetter_method_tooMany() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  set x(a, b) {}", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
+    verify([source]);
+  }
+  void check_constEvalThrowsException_binary_null(String expr, bool resolved) {
+    Source source = addSource("const C = ${expr};");
+    resolve(source);
+    if (resolved) {
+      assertErrors([CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
+      verify([source]);
+    } else {
+      assertErrors([CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+    }
+    reset();
+  }
+  void check_constEvalTypeBool_withParameter_binary(String expr) {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  final a;", "  const A(bool p) : a = ${expr};", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL]);
+    verify([source]);
+    reset();
+  }
+  void check_constEvalTypeInt_withParameter_binary(String expr) {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  final a;", "  const A(int p) : a = ${expr};", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.CONST_EVAL_TYPE_INT, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+    reset();
+  }
+  void check_constEvalTypeNum_withParameter_binary(String expr) {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  final a;", "  const A(num p) : a = ${expr};", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.CONST_EVAL_TYPE_NUM, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+    reset();
+  }
+  void check_wrongNumberOfParametersForOperator(String name, String parameters) {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  operator ${name}(${parameters}) {}", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR]);
+    verify([source]);
+    reset();
+  }
+  void check_wrongNumberOfParametersForOperator1(String name) {
+    check_wrongNumberOfParametersForOperator(name, "");
+    check_wrongNumberOfParametersForOperator(name, "a, b");
+  }
   static dartSuite() {
     _ut.group('CompileTimeErrorCodeTest', () {
+      _ut.test('test_ambiguousExport', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_ambiguousExport);
+      });
+      _ut.test('test_ambiguousImport_as', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_ambiguousImport_as);
+      });
+      _ut.test('test_ambiguousImport_extends', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_ambiguousImport_extends);
+      });
+      _ut.test('test_ambiguousImport_function', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_ambiguousImport_function);
+      });
+      _ut.test('test_ambiguousImport_implements', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_ambiguousImport_implements);
+      });
+      _ut.test('test_ambiguousImport_instanceCreation', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_ambiguousImport_instanceCreation);
+      });
+      _ut.test('test_ambiguousImport_is', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_ambiguousImport_is);
+      });
+      _ut.test('test_ambiguousImport_qualifier', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_ambiguousImport_qualifier);
+      });
+      _ut.test('test_ambiguousImport_typeArgument_instanceCreation', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_ambiguousImport_typeArgument_instanceCreation);
+      });
+      _ut.test('test_ambiguousImport_varRead', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_ambiguousImport_varRead);
+      });
+      _ut.test('test_ambiguousImport_varWrite', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_ambiguousImport_varWrite);
+      });
       _ut.test('test_argumentDefinitionTestNonParameter', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_argumentDefinitionTestNonParameter);
@@ -3030,13 +5503,57 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_conflictingConstructorNameAndMember_method);
       });
-      _ut.test('test_constConstructorWithNonFinalField', () {
+      _ut.test('test_constConstructorWithNonFinalField_mixin', () {
         final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constConstructorWithNonFinalField);
+        runJUnitTest(__test, __test.test_constConstructorWithNonFinalField_mixin);
       });
-      _ut.test('test_constEvalThrowsException', () {
+      _ut.test('test_constConstructorWithNonFinalField_super', () {
         final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constEvalThrowsException);
+        runJUnitTest(__test, __test.test_constConstructorWithNonFinalField_super);
+      });
+      _ut.test('test_constConstructorWithNonFinalField_this', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constConstructorWithNonFinalField_this);
+      });
+      _ut.test('test_constEvalThrowsException_binaryMinus_null', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constEvalThrowsException_binaryMinus_null);
+      });
+      _ut.test('test_constEvalThrowsException_binaryPlus_null', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constEvalThrowsException_binaryPlus_null);
+      });
+      _ut.test('test_constEvalThrowsException_unaryBitNot_null', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constEvalThrowsException_unaryBitNot_null);
+      });
+      _ut.test('test_constEvalThrowsException_unaryNegated_null', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constEvalThrowsException_unaryNegated_null);
+      });
+      _ut.test('test_constEvalThrowsException_unaryNot_null', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constEvalThrowsException_unaryNot_null);
+      });
+      _ut.test('test_constEvalTypeBoolNumString_equal', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constEvalTypeBoolNumString_equal);
+      });
+      _ut.test('test_constEvalTypeBoolNumString_notEqual', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constEvalTypeBoolNumString_notEqual);
+      });
+      _ut.test('test_constEvalTypeBool_binary', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constEvalTypeBool_binary);
+      });
+      _ut.test('test_constEvalTypeInt_binary', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constEvalTypeInt_binary);
+      });
+      _ut.test('test_constEvalTypeNum_binary', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constEvalTypeNum_binary);
       });
       _ut.test('test_constFormalParameter_fieldFormalParameter', () {
         final __test = new CompileTimeErrorCodeTest();
@@ -3058,14 +5575,66 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_constWithNonConst);
       });
+      _ut.test('test_constWithNonConstantArgument', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constWithNonConstantArgument);
+      });
+      _ut.test('test_constWithNonType', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constWithNonType);
+      });
+      _ut.test('test_constWithTypeParameters_direct', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constWithTypeParameters_direct);
+      });
+      _ut.test('test_constWithTypeParameters_indirect', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constWithTypeParameters_indirect);
+      });
+      _ut.test('test_constWithUndefinedConstructor', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constWithUndefinedConstructor);
+      });
+      _ut.test('test_constWithUndefinedConstructorDefault', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constWithUndefinedConstructorDefault);
+      });
       _ut.test('test_defaultValueInFunctionTypeAlias', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_defaultValueInFunctionTypeAlias);
       });
+      _ut.test('test_duplicateConstructorName_named', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_duplicateConstructorName_named);
+      });
+      _ut.test('test_duplicateConstructorName_unnamed', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_duplicateConstructorName_unnamed);
+      });
+      _ut.test('test_duplicateDefinition_parameterWithFunctionName_local', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_duplicateDefinition_parameterWithFunctionName_local);
+      });
+      _ut.test('test_duplicateDefinition_parameterWithFunctionName_topLevel', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_duplicateDefinition_parameterWithFunctionName_topLevel);
+      });
       _ut.test('test_duplicateMemberError', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_duplicateMemberError);
       });
+      _ut.test('test_duplicateMemberError_classMembers_methods', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_duplicateMemberError_classMembers_methods);
+      });
+      _ut.test('test_duplicateNamedArgument', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_duplicateNamedArgument);
+      });
+      _ut.test('test_exportInternalLibrary', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_exportInternalLibrary);
+      });
       _ut.test('test_exportOfNonLibrary', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_exportOfNonLibrary);
@@ -3114,6 +5683,10 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_extendsOrImplementsDisallowedClass_implements_num);
       });
+      _ut.test('test_extraPositionalArguments_const', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_extraPositionalArguments_const);
+      });
       _ut.test('test_fieldInitializedByMultipleInitializers', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_fieldInitializedByMultipleInitializers);
@@ -3138,6 +5711,14 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_fieldInitializedInParameterAndInitializer);
       });
+      _ut.test('test_fieldInitializerFactoryConstructor', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_fieldInitializerFactoryConstructor);
+      });
+      _ut.test('test_fieldInitializerNotAssignable', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_fieldInitializerNotAssignable);
+      });
       _ut.test('test_fieldInitializerOutsideConstructor', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_fieldInitializerOutsideConstructor);
@@ -3146,6 +5727,18 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_fieldInitializerOutsideConstructor_defaultParameter);
       });
+      _ut.test('test_fieldInitializerRedirectingConstructor_afterRedirection', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_fieldInitializerRedirectingConstructor_afterRedirection);
+      });
+      _ut.test('test_fieldInitializerRedirectingConstructor_beforeRedirection', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_fieldInitializerRedirectingConstructor_beforeRedirection);
+      });
+      _ut.test('test_fieldInitializingFormalRedirectingConstructor', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_fieldInitializingFormalRedirectingConstructor);
+      });
       _ut.test('test_finalInitializedInDeclarationAndConstructor_initializers', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_finalInitializedInDeclarationAndConstructor_initializers);
@@ -3198,6 +5791,10 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_finalNotInitialized_local_final);
       });
+      _ut.test('test_getterAndMethodWithSameName', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_getterAndMethodWithSameName);
+      });
       _ut.test('test_implementsDynamic', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_implementsDynamic);
@@ -3218,9 +5815,29 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_implementsRepeated_3times);
       });
-      _ut.test('test_implementsSelf', () {
+      _ut.test('test_implicitThisReferenceInInitializer_field', () {
         final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_implementsSelf);
+        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_field);
+      });
+      _ut.test('test_implicitThisReferenceInInitializer_invocation', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_invocation);
+      });
+      _ut.test('test_implicitThisReferenceInInitializer_redirectingConstructorInvocation', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_redirectingConstructorInvocation);
+      });
+      _ut.test('test_implicitThisReferenceInInitializer_superConstructorInvocation', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_superConstructorInvocation);
+      });
+      _ut.test('test_importInternalLibrary', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_importInternalLibrary);
+      });
+      _ut.test('test_importInternalLibrary_collection', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_importInternalLibrary_collection);
       });
       _ut.test('test_importOfNonLibrary', () {
         final __test = new CompileTimeErrorCodeTest();
@@ -3258,6 +5875,62 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_initializingFormalForNonExistantField_static);
       });
+      _ut.test('test_invalidConstructorName_notEnclosingClassName', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidConstructorName_notEnclosingClassName);
+      });
+      _ut.test('test_invalidFactoryNameNotAClass_notClassName', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidFactoryNameNotAClass_notClassName);
+      });
+      _ut.test('test_invalidFactoryNameNotAClass_notEnclosingClassName', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidFactoryNameNotAClass_notEnclosingClassName);
+      });
+      _ut.test('test_invalidOverrideNamed_fewerNamedParameters', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidOverrideNamed_fewerNamedParameters);
+      });
+      _ut.test('test_invalidOverrideNamed_missingNamedParameter', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidOverrideNamed_missingNamedParameter);
+      });
+      _ut.test('test_invalidOverridePositional', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidOverridePositional);
+      });
+      _ut.test('test_invalidOverrideRequired', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidOverrideRequired);
+      });
+      _ut.test('test_invalidReferenceToThis_factoryConstructor', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidReferenceToThis_factoryConstructor);
+      });
+      _ut.test('test_invalidReferenceToThis_instanceVariableInitializer_inConstructor', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidReferenceToThis_instanceVariableInitializer_inConstructor);
+      });
+      _ut.test('test_invalidReferenceToThis_instanceVariableInitializer_inDeclaration', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidReferenceToThis_instanceVariableInitializer_inDeclaration);
+      });
+      _ut.test('test_invalidReferenceToThis_staticMethod', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidReferenceToThis_staticMethod);
+      });
+      _ut.test('test_invalidReferenceToThis_staticVariableInitializer', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidReferenceToThis_staticVariableInitializer);
+      });
+      _ut.test('test_invalidReferenceToThis_topLevelFunction', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidReferenceToThis_topLevelFunction);
+      });
+      _ut.test('test_invalidReferenceToThis_variableInitializer', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidReferenceToThis_variableInitializer);
+      });
       _ut.test('test_invalidTypeArgumentForKey', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_invalidTypeArgumentForKey);
@@ -3294,6 +5967,50 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_labelUndefined_continue);
       });
+      _ut.test('test_memberWithClassName_field', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_memberWithClassName_field);
+      });
+      _ut.test('test_memberWithClassName_field2', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_memberWithClassName_field2);
+      });
+      _ut.test('test_memberWithClassName_getter', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_memberWithClassName_getter);
+      });
+      _ut.test('test_memberWithClassName_method', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_memberWithClassName_method);
+      });
+      _ut.test('test_methodAndGetterWithSameName', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_methodAndGetterWithSameName);
+      });
+      _ut.test('test_mixinDeclaresConstructor_classDeclaration', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinDeclaresConstructor_classDeclaration);
+      });
+      _ut.test('test_mixinDeclaresConstructor_typedef', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinDeclaresConstructor_typedef);
+      });
+      _ut.test('test_mixinInheritsFromNotObject_classDeclaration_extends', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinInheritsFromNotObject_classDeclaration_extends);
+      });
+      _ut.test('test_mixinInheritsFromNotObject_classDeclaration_with', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinInheritsFromNotObject_classDeclaration_with);
+      });
+      _ut.test('test_mixinInheritsFromNotObject_typedef_extends', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinInheritsFromNotObject_typedef_extends);
+      });
+      _ut.test('test_mixinInheritsFromNotObject_typedef_with', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinInheritsFromNotObject_typedef_with);
+      });
       _ut.test('test_mixinOfNonClass_class', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_mixinOfNonClass_class);
@@ -3302,6 +6019,26 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_mixinOfNonClass_typedef);
       });
+      _ut.test('test_mixinReferencesSuper', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinReferencesSuper);
+      });
+      _ut.test('test_mixinWithNonClassSuperclass_class', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinWithNonClassSuperclass_class);
+      });
+      _ut.test('test_mixinWithNonClassSuperclass_typedef', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinWithNonClassSuperclass_typedef);
+      });
+      _ut.test('test_multipleRedirectingConstructorInvocations', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_multipleRedirectingConstructorInvocations);
+      });
+      _ut.test('test_multipleSuperInitializers', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_multipleSuperInitializers);
+      });
       _ut.test('test_nativeFunctionBodyInNonSDKCode_function', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_nativeFunctionBodyInNonSDKCode_function);
@@ -3322,10 +6059,62 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_nonConstListElement);
       });
+      _ut.test('test_nonConstMapAsExpressionStatement_begin', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstMapAsExpressionStatement_begin);
+      });
+      _ut.test('test_nonConstMapAsExpressionStatement_only', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstMapAsExpressionStatement_only);
+      });
+      _ut.test('test_nonConstMapKey', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstMapKey);
+      });
       _ut.test('test_nonConstMapValue', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_nonConstMapValue);
       });
+      _ut.test('test_nonConstValueInInitializer_binary_notBool_left', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializer_binary_notBool_left);
+      });
+      _ut.test('test_nonConstValueInInitializer_binary_notBool_right', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializer_binary_notBool_right);
+      });
+      _ut.test('test_nonConstValueInInitializer_binary_notInt', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializer_binary_notInt);
+      });
+      _ut.test('test_nonConstValueInInitializer_binary_notNum', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializer_binary_notNum);
+      });
+      _ut.test('test_nonConstValueInInitializer_field', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializer_field);
+      });
+      _ut.test('test_nonConstValueInInitializer_redirecting', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializer_redirecting);
+      });
+      _ut.test('test_nonConstValueInInitializer_super', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializer_super);
+      });
+      _ut.test('test_nonGenerativeConstructor_explicit', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonGenerativeConstructor_explicit);
+      });
+      _ut.test('test_nonGenerativeConstructor_implicit', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonGenerativeConstructor_implicit);
+      });
+      _ut.test('test_notEnoughRequiredArguments_const', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_notEnoughRequiredArguments_const);
+      });
       _ut.test('test_optionalParameterInOperator_named', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_optionalParameterInOperator_named);
@@ -3338,10 +6127,110 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_partOfNonPart);
       });
+      _ut.test('test_prefixCollidesWithTopLevelMembers_functionTypeAlias', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_prefixCollidesWithTopLevelMembers_functionTypeAlias);
+      });
+      _ut.test('test_prefixCollidesWithTopLevelMembers_topLevelFunction', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_prefixCollidesWithTopLevelMembers_topLevelFunction);
+      });
+      _ut.test('test_prefixCollidesWithTopLevelMembers_topLevelVariable', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_prefixCollidesWithTopLevelMembers_topLevelVariable);
+      });
+      _ut.test('test_prefixCollidesWithTopLevelMembers_type', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_prefixCollidesWithTopLevelMembers_type);
+      });
       _ut.test('test_privateOptionalParameter', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_privateOptionalParameter);
       });
+      _ut.test('test_recursiveConstructorRedirect', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveConstructorRedirect);
+      });
+      _ut.test('test_recursiveConstructorRedirect_directSelfReference', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveConstructorRedirect_directSelfReference);
+      });
+      _ut.test('test_recursiveFactoryRedirect', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveFactoryRedirect);
+      });
+      _ut.test('test_recursiveFactoryRedirect_directSelfReference', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveFactoryRedirect_directSelfReference);
+      });
+      _ut.test('test_recursiveFactoryRedirect_generic', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveFactoryRedirect_generic);
+      });
+      _ut.test('test_recursiveFactoryRedirect_named', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveFactoryRedirect_named);
+      });
+      _ut.test('test_recursiveFactoryRedirect_outsideCycle', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveFactoryRedirect_outsideCycle);
+      });
+      _ut.test('test_recursiveInterfaceInheritanceBaseCaseExtends', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveInterfaceInheritanceBaseCaseExtends);
+      });
+      _ut.test('test_recursiveInterfaceInheritanceBaseCaseImplements', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveInterfaceInheritanceBaseCaseImplements);
+      });
+      _ut.test('test_recursiveInterfaceInheritanceBaseCaseImplements_typedef', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveInterfaceInheritanceBaseCaseImplements_typedef);
+      });
+      _ut.test('test_recursiveInterfaceInheritance_extends', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveInterfaceInheritance_extends);
+      });
+      _ut.test('test_recursiveInterfaceInheritance_extends_implements', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveInterfaceInheritance_extends_implements);
+      });
+      _ut.test('test_recursiveInterfaceInheritance_implements', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveInterfaceInheritance_implements);
+      });
+      _ut.test('test_recursiveInterfaceInheritance_tail', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveInterfaceInheritance_tail);
+      });
+      _ut.test('test_recursiveInterfaceInheritance_tail2', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveInterfaceInheritance_tail2);
+      });
+      _ut.test('test_recursiveInterfaceInheritance_tail3', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveInterfaceInheritance_tail3);
+      });
+      _ut.test('test_redirectToNonConstConstructor', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_redirectToNonConstConstructor);
+      });
+      _ut.test('test_referenceToDeclaredVariableInInitializer_closure', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_referenceToDeclaredVariableInInitializer_closure);
+      });
+      _ut.test('test_referenceToDeclaredVariableInInitializer_getter', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_referenceToDeclaredVariableInInitializer_getter);
+      });
+      _ut.test('test_referenceToDeclaredVariableInInitializer_setter', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_referenceToDeclaredVariableInInitializer_setter);
+      });
+      _ut.test('test_referenceToDeclaredVariableInInitializer_unqualifiedInvocation', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_referenceToDeclaredVariableInInitializer_unqualifiedInvocation);
+      });
       _ut.test('test_rethrowOutsideCatch', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_rethrowOutsideCatch);
@@ -3350,6 +6239,78 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_returnInGenerativeConstructor);
       });
+      _ut.test('test_superInInvalidContext_binaryExpression', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_superInInvalidContext_binaryExpression);
+      });
+      _ut.test('test_superInInvalidContext_constructorFieldInitializer', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_superInInvalidContext_constructorFieldInitializer);
+      });
+      _ut.test('test_superInInvalidContext_factoryConstructor', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_superInInvalidContext_factoryConstructor);
+      });
+      _ut.test('test_superInInvalidContext_instanceVariableInitializer', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_superInInvalidContext_instanceVariableInitializer);
+      });
+      _ut.test('test_superInInvalidContext_staticMethod', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_superInInvalidContext_staticMethod);
+      });
+      _ut.test('test_superInInvalidContext_staticVariableInitializer', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_superInInvalidContext_staticVariableInitializer);
+      });
+      _ut.test('test_superInInvalidContext_topLevelFunction', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_superInInvalidContext_topLevelFunction);
+      });
+      _ut.test('test_superInInvalidContext_topLevelVariableInitializer', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_superInInvalidContext_topLevelVariableInitializer);
+      });
+      _ut.test('test_superInRedirectingConstructor_redirectionSuper', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_superInRedirectingConstructor_redirectionSuper);
+      });
+      _ut.test('test_superInRedirectingConstructor_superRedirection', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_superInRedirectingConstructor_superRedirection);
+      });
+      _ut.test('test_undefinedClass_const', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_undefinedClass_const);
+      });
+      _ut.test('test_undefinedConstructorInInitializer_explicit_named', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_undefinedConstructorInInitializer_explicit_named);
+      });
+      _ut.test('test_undefinedConstructorInInitializer_explicit_unnamed', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_undefinedConstructorInInitializer_explicit_unnamed);
+      });
+      _ut.test('test_undefinedConstructorInInitializer_implicit', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_undefinedConstructorInInitializer_implicit);
+      });
+      _ut.test('test_undefinedNamedParameter', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_undefinedNamedParameter);
+      });
+      _ut.test('test_uriDoesNotExist_export', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_uriDoesNotExist_export);
+      });
+      _ut.test('test_uriDoesNotExist_import', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_uriDoesNotExist_import);
+      });
+      _ut.test('test_uriDoesNotExist_part', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_uriDoesNotExist_part);
+      });
       _ut.test('test_uriWithInterpolation_constant', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_uriWithInterpolation_constant);
@@ -3358,44 +6319,64 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_uriWithInterpolation_nonConstant);
       });
-      _ut.test('test_wrongNumberOfParametersForSetter_tooFew', () {
+      _ut.test('test_wrongNumberOfParametersForOperator1', () {
         final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_wrongNumberOfParametersForSetter_tooFew);
+        runJUnitTest(__test, __test.test_wrongNumberOfParametersForOperator1);
       });
-      _ut.test('test_wrongNumberOfParametersForSetter_tooMany', () {
+      _ut.test('test_wrongNumberOfParametersForOperator_minus', () {
         final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_wrongNumberOfParametersForSetter_tooMany);
+        runJUnitTest(__test, __test.test_wrongNumberOfParametersForOperator_minus);
+      });
+      _ut.test('test_wrongNumberOfParametersForOperator_tilde', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_wrongNumberOfParametersForOperator_tilde);
+      });
+      _ut.test('test_wrongNumberOfParametersForSetter_function_tooFew', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_wrongNumberOfParametersForSetter_function_tooFew);
+      });
+      _ut.test('test_wrongNumberOfParametersForSetter_function_tooMany', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_wrongNumberOfParametersForSetter_function_tooMany);
+      });
+      _ut.test('test_wrongNumberOfParametersForSetter_method_tooFew', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_wrongNumberOfParametersForSetter_method_tooFew);
+      });
+      _ut.test('test_wrongNumberOfParametersForSetter_method_tooMany', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_wrongNumberOfParametersForSetter_method_tooMany);
       });
     });
   }
 }
+
 /**
  * Instances of the class {@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.
  */
 class StaticTypeVerifier extends GeneralizingASTVisitor<Object> {
+
   /**
    * A list containing all of the AST Expression nodes that were not resolved.
    */
   List<Expression> _unresolvedExpressions = new List<Expression>();
+
   /**
    * A list containing all of the AST TypeName nodes that were not resolved.
    */
   List<TypeName> _unresolvedTypes = new List<TypeName>();
+
   /**
    * Counter for the number of Expression nodes visited that are resolved.
    */
   int _resolvedExpressionCount = 0;
+
   /**
    * Counter for the number of TypeName nodes visited that are resolved.
    */
   int _resolvedTypeCount = 0;
-  /**
-   * Initialize a newly created verifier to verify that all of the nodes in an AST structure that
-   * should have a static type associated with them do have a static type.
-   */
-  StaticTypeVerifier() : super() {
-  }
+
   /**
    * Assert that all of the visited nodes have a static type associated with them.
    */
@@ -3440,7 +6421,10 @@
       JUnitTestCase.fail(writer.toString());
     }
   }
+  Object visitBreakStatement(BreakStatement node) => null;
   Object visitCommentReference(CommentReference node) => null;
+  Object visitContinueStatement(ContinueStatement node) => null;
+  Object visitExportDirective(ExportDirective node) => null;
   Object visitExpression(Expression node) {
     node.visitChildren(this);
     if (node.staticType == null) {
@@ -3450,6 +6434,8 @@
     }
     return null;
   }
+  Object visitImportDirective(ImportDirective node) => null;
+  Object visitLabel(Label node) => null;
   Object visitLibraryIdentifier(LibraryIdentifier node) => null;
   Object visitPrefixedIdentifier(PrefixedIdentifier node) {
     if (node.staticType == null && identical(node.prefix.staticType, DynamicTypeImpl.instance)) {
@@ -3467,9 +6453,7 @@
       return null;
     } else if (parent2 is ConstructorName && identical(node, ((parent2 as ConstructorName)).name)) {
       return null;
-    } else if (parent2 is Label && identical(node, ((parent2 as Label)).label)) {
-      return null;
-    } else if (parent2 is ImportDirective && identical(node, ((parent2 as ImportDirective)).prefix)) {
+    } else if (parent2 is ConstructorFieldInitializer && identical(node, ((parent2 as ConstructorFieldInitializer)).fieldName)) {
       return null;
     } else if (node.element is PrefixElement) {
       return null;
@@ -3502,22 +6486,27 @@
   }
 }
 class ElementResolverTest extends EngineTestCase {
+
   /**
    * The error listener to which errors will be reported.
    */
   GatheringErrorListener _listener;
+
   /**
    * The type provider used to access the types.
    */
   TestTypeProvider _typeProvider;
+
   /**
    * The library containing the code being resolved.
    */
   LibraryElementImpl _definingLibrary;
+
   /**
    * The resolver visitor that maintains the state for the resolver.
    */
   ResolverVisitor _visitor;
+
   /**
    * The resolver being used to resolve the test cases.
    */
@@ -3594,7 +6583,7 @@
   void test_visitConstructorName_named() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String constructorName = "a";
-    ConstructorElement constructor = ElementFactory.constructorElement(constructorName);
+    ConstructorElement constructor = ElementFactory.constructorElement(classA, constructorName);
     classA.constructors = <ConstructorElement> [constructor];
     ConstructorName name = ASTFactory.constructorName(ASTFactory.typeName(classA, []), constructorName);
     resolveNode(name, []);
@@ -3604,7 +6593,7 @@
   void test_visitConstructorName_unnamed() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String constructorName = null;
-    ConstructorElement constructor = ElementFactory.constructorElement(constructorName);
+    ConstructorElement constructor = ElementFactory.constructorElement(classA, constructorName);
     classA.constructors = <ConstructorElement> [constructor];
     ConstructorName name = ASTFactory.constructorName(ASTFactory.typeName(classA, []), constructorName);
     resolveNode(name, []);
@@ -3680,7 +6669,7 @@
   void test_visitInstanceCreationExpression_named() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String constructorName = "a";
-    ConstructorElement constructor = ElementFactory.constructorElement(constructorName);
+    ConstructorElement constructor = ElementFactory.constructorElement(classA, constructorName);
     classA.constructors = <ConstructorElement> [constructor];
     ConstructorName name = ASTFactory.constructorName(ASTFactory.typeName(classA, []), constructorName);
     name.element = constructor;
@@ -3692,7 +6681,7 @@
   void test_visitInstanceCreationExpression_unnamed() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String constructorName = null;
-    ConstructorElement constructor = ElementFactory.constructorElement(constructorName);
+    ConstructorElement constructor = ElementFactory.constructorElement(classA, constructorName);
     classA.constructors = <ConstructorElement> [constructor];
     ConstructorName name = ASTFactory.constructorName(ASTFactory.typeName(classA, []), constructorName);
     name.element = constructor;
@@ -3704,7 +6693,7 @@
   void test_visitInstanceCreationExpression_unnamed_namedParameter() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String constructorName = null;
-    ConstructorElementImpl constructor = ElementFactory.constructorElement(constructorName);
+    ConstructorElementImpl constructor = ElementFactory.constructorElement(classA, constructorName);
     String parameterName = "a";
     ParameterElement parameter = ElementFactory.namedParameter(parameterName);
     constructor.parameters = <ParameterElement> [parameter];
@@ -3808,8 +6797,9 @@
     PropertyAccessorElement getter = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement> [getter];
     SuperExpression target = ASTFactory.superExpression();
-    target.staticType = classA.type;
+    target.staticType = ElementFactory.classElement("B", classA.type, []).type;
     PropertyAccess access = ASTFactory.propertyAccess2(target, getterName);
+    ASTFactory.methodDeclaration2(null, null, null, null, ASTFactory.identifier3("m"), ASTFactory.formalParameterList([]), ASTFactory.expressionFunctionBody(access));
     resolveNode(access, []);
     JUnitTestCase.assertSame(getter, access.propertyName.element);
     _listener.assertNoErrors();
@@ -3858,10 +6848,10 @@
   }
   void test_visitSuperConstructorInvocation() {
     ClassElementImpl superclass = ElementFactory.classElement2("A", []);
-    ConstructorElementImpl superConstructor = ElementFactory.constructorElement(null);
+    ConstructorElementImpl superConstructor = ElementFactory.constructorElement(superclass, null);
     superclass.constructors = <ConstructorElement> [superConstructor];
     ClassElementImpl subclass = ElementFactory.classElement("B", superclass.type, []);
-    ConstructorElementImpl subConstructor = ElementFactory.constructorElement(null);
+    ConstructorElementImpl subConstructor = ElementFactory.constructorElement(subclass, null);
     subclass.constructors = <ConstructorElement> [subConstructor];
     SuperConstructorInvocation invocation = ASTFactory.superConstructorInvocation([]);
     resolveInClass(invocation, subclass);
@@ -3870,13 +6860,13 @@
   }
   void test_visitSuperConstructorInvocation_namedParameter() {
     ClassElementImpl superclass = ElementFactory.classElement2("A", []);
-    ConstructorElementImpl superConstructor = ElementFactory.constructorElement(null);
+    ConstructorElementImpl superConstructor = ElementFactory.constructorElement(superclass, null);
     String parameterName = "p";
     ParameterElement parameter = ElementFactory.namedParameter(parameterName);
     superConstructor.parameters = <ParameterElement> [parameter];
     superclass.constructors = <ConstructorElement> [superConstructor];
     ClassElementImpl subclass = ElementFactory.classElement("B", superclass.type, []);
-    ConstructorElementImpl subConstructor = ElementFactory.constructorElement(null);
+    ConstructorElementImpl subConstructor = ElementFactory.constructorElement(subclass, null);
     subclass.constructors = <ConstructorElement> [subConstructor];
     SuperConstructorInvocation invocation = ASTFactory.superConstructorInvocation([ASTFactory.namedExpression2(parameterName, ASTFactory.integer(0))]);
     resolveInClass(invocation, subclass);
@@ -3884,6 +6874,7 @@
     JUnitTestCase.assertSame(parameter, ((invocation.argumentList.arguments[0] as NamedExpression)).name.label.element);
     _listener.assertNoErrors();
   }
+
   /**
    * Create the resolver used by the tests.
    * @return the resolver that was created
@@ -3907,6 +6898,7 @@
       throw new IllegalArgumentException("Could not create resolver", exception);
     }
   }
+
   /**
    * Return the element associated with the label of the given statement after the resolver has
    * resolved the statement.
@@ -3918,6 +6910,7 @@
     resolveStatement(statement, labelElement);
     return statement.label.element;
   }
+
   /**
    * Return the element associated with the label of the given statement after the resolver has
    * resolved the statement.
@@ -3929,6 +6922,7 @@
     resolveStatement(statement, labelElement);
     return statement.label.element;
   }
+
   /**
    * Return the element associated with the given identifier after the resolver has resolved the
    * identifier.
@@ -3941,6 +6935,7 @@
     resolveNode(node, definedElements);
     return node.element;
   }
+
   /**
    * Return the element associated with the given expression after the resolver has resolved the
    * expression.
@@ -3953,6 +6948,7 @@
     resolveNode(node, definedElements);
     return node.element;
   }
+
   /**
    * Return the element associated with the given identifier after the resolver has resolved the
    * identifier.
@@ -3976,6 +6972,7 @@
       throw new IllegalArgumentException("Could not resolve node", exception);
     }
   }
+
   /**
    * Return the element associated with the given identifier after the resolver has resolved the
    * identifier.
@@ -4001,6 +6998,7 @@
       throw new IllegalArgumentException("Could not resolve node", exception);
     }
   }
+
   /**
    * Return the element associated with the label of the given statement after the resolver has
    * resolved the statement.
@@ -4251,336 +7249,930 @@
   }
 }
 class StaticWarningCodeTest extends ResolverTestCase {
-  void fail_argumentTypeNotAssignable() {
-    Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
+  void fail_argumentTypeNotAssignable_invocation_functionParameter_generic() {
+    Source source = addSource(EngineTestCase.createSource(["class A<K, V> {", "  m(f(K k), V v) {", "    f(v);", "  }", "}"]));
+    resolve(source);
     assertErrors([StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
-  void fail_assignmentToFinal() {
-    Source source = addSource(EngineTestCase.createSource(["final x = 0;", "f() { x = 1; }"]));
-    resolve(source, []);
-    assertErrors([StaticWarningCode.ASSIGNMENT_TO_FINAL]);
-    verify([source]);
-  }
-  void fail_caseBlockNotTerminated() {
-    Source source = addSource(EngineTestCase.createSource(["f(int p) {", "  switch (p) {", "    case 0:", "      f(p);", "    case 1:", "      break;", "  }", "}"]));
-    resolve(source, []);
-    assertErrors([StaticWarningCode.CASE_BLOCK_NOT_TERMINATED]);
-    verify([source]);
-  }
   void fail_castToNonType() {
     Source source = addSource(EngineTestCase.createSource(["var A = 0;", "f(String s) { var x = s as A; }"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticWarningCode.CAST_TO_NON_TYPE]);
     verify([source]);
   }
   void fail_commentReferenceConstructorNotVisible() {
     Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticWarningCode.COMMENT_REFERENCE_CONSTRUCTOR_NOT_VISIBLE]);
     verify([source]);
   }
   void fail_commentReferenceIdentifierNotVisible() {
     Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticWarningCode.COMMENT_REFERENCE_IDENTIFIER_NOT_VISIBLE]);
     verify([source]);
   }
   void fail_commentReferenceUndeclaredConstructor() {
     Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticWarningCode.COMMENT_REFERENCE_UNDECLARED_CONSTRUCTOR]);
     verify([source]);
   }
   void fail_commentReferenceUndeclaredIdentifier() {
     Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticWarningCode.COMMENT_REFERENCE_UNDECLARED_IDENTIFIER]);
     verify([source]);
   }
   void fail_commentReferenceUriNotLibrary() {
     Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticWarningCode.COMMENT_REFERENCE_URI_NOT_LIBRARY]);
     verify([source]);
   }
-  void fail_conflictingInstanceGetterAndSuperclassMember() {
-    Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
-    assertErrors([StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER]);
-    verify([source]);
-  }
-  void fail_conflictingInstanceSetterAndSuperclassMember() {
-    Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
-    assertErrors([StaticWarningCode.CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER]);
-    verify([source]);
-  }
-  void fail_conflictingStaticGetterAndInstanceSetter() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  static get x -> 0;", "  set x(int p) {}", "}"]));
-    resolve(source, []);
-    assertErrors([StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER]);
-    verify([source]);
-  }
-  void fail_conflictingStaticSetterAndInstanceGetter() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  get x -> 0;", "  static set x(int p) {}", "}"]));
-    resolve(source, []);
-    assertErrors([StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_INSTANCE_GETTER]);
-    verify([source]);
-  }
   void fail_incorrectNumberOfArguments_tooFew() {
-    Source source = addSource(EngineTestCase.createSource(["f(a, b) -> 0;", "g() {", "  f(2);", "}"]));
-    resolve(source, []);
+    Source source = addSource(EngineTestCase.createSource(["f(a, b) => 0;", "g() {", "  f(2);", "}"]));
+    resolve(source);
     assertErrors([StaticWarningCode.INCORRECT_NUMBER_OF_ARGUMENTS]);
     verify([source]);
   }
   void fail_incorrectNumberOfArguments_tooMany() {
-    Source source = addSource(EngineTestCase.createSource(["f(a, b) -> 0;", "g() {", "  f(2, 3, 4);", "}"]));
-    resolve(source, []);
+    Source source = addSource(EngineTestCase.createSource(["f(a, b) => 0;", "g() {", "  f(2, 3, 4);", "}"]));
+    resolve(source);
     assertErrors([StaticWarningCode.INCORRECT_NUMBER_OF_ARGUMENTS]);
     verify([source]);
   }
-  void fail_instanceMethodNameCollidesWithSuperclassStatic() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  static n", "}", "class C extends A {", "  void n() {}", "}"]));
-    resolve(source, []);
-    assertErrors([StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC]);
-    verify([source]);
-  }
   void fail_invalidFactoryName() {
     Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticWarningCode.INVALID_FACTORY_NAME]);
     verify([source]);
   }
-  void fail_invalidOverrideGetterType() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int get g -> 0", "}", "class B extends A {", "  String get g { return 'a'; }", "}"]));
-    resolve(source, []);
-    assertErrors([StaticWarningCode.INVALID_OVERRIDE_GETTER_TYPE]);
-    verify([source]);
-  }
-  void fail_invalidOverrideReturnType() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int m() { return 0; }", "}", "class B extends A {", "  String m() { return 'a'; }", "}"]));
-    resolve(source, []);
-    assertErrors([StaticWarningCode.INVALID_OVERRIDE_RETURN_TYPE]);
-    verify([source]);
-  }
-  void fail_invalidOverrideSetterReturnType() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  void set s(int v) {}", "}", "class B extends A {", "  void set s(String v) {}", "}"]));
-    resolve(source, []);
-    assertErrors([StaticWarningCode.INVALID_OVERRIDE_SETTER_RETURN_TYPE]);
+  void fail_invalidOverrideDifferentDefaultValues() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  m([int p = 0]) {}", "}", "class B extends A {", "  m([int p = 1]) {}", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES]);
     verify([source]);
   }
   void fail_invocationOfNonFunction() {
     Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticWarningCode.INVOCATION_OF_NON_FUNCTION]);
     verify([source]);
   }
-  void fail_mismatchedGetterAndSetterTypes() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int get g { return 0; }", "  set g(String v) {}", "}"]));
-    resolve(source, []);
+  void fail_mismatchedAccessorTypes_getterAndSuperSetter() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int get g { return 0; }", "  set g(int v) {}", "}", "class B extends A {", "  set g(String v) {}", "}"]));
+    resolve(source);
     assertErrors([StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES]);
     verify([source]);
   }
-  void fail_newWithNonType() {
-    Source source = addSource(EngineTestCase.createSource(["var A = 0;", "void f() {", "  A a = new A();", "}"]));
-    resolve(source, []);
-    assertErrors([StaticWarningCode.NEW_WITH_NON_TYPE]);
-    verify([source]);
-  }
-  void fail_newWithUndefinedConstructor() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A(int p) {}", "}", "A f() {", "  return new A();", "}"]));
-    resolve(source, []);
-    assertErrors([StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR]);
-    verify([source]);
-  }
-  void fail_nonAbstractClassInheritsAbstractMember() {
-    Source source = addSource(EngineTestCase.createSource(["class I {", "  m(p) {}", "}", "class C implements I {", "}"]));
-    resolve(source, []);
-    assertErrors([StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER]);
-    verify([source]);
-  }
-  void fail_nonAbstractClassInheritsAbstractMethod() {
-    Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  m(p);", "}", "class C extends A {", "}"]));
-    resolve(source, []);
-    assertErrors([StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_METHOD]);
+  void fail_mismatchedAccessorTypes_superGetterAndSetter() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int get g { return 0; }", "  set g(int v) {}", "}", "class B extends A {", "  String get g { return ''; }", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES]);
     verify([source]);
   }
   void fail_nonType() {
     Source source = addSource(EngineTestCase.createSource(["var A = 0;", "f(var p) {", "  if (p is A) {", "  }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticWarningCode.NON_TYPE]);
     verify([source]);
   }
-  void fail_nonTypeInCatchClause() {
-    Source source = addSource(EngineTestCase.createSource(["var T = 0;", "f(var p) {", "  try {", "  } on T catch e {", "  }", "}"]));
-    resolve(source, []);
-    assertErrors([StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE]);
-    verify([source]);
-  }
-  void fail_nonVoidReturnForOperator() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int operator []=() {}", "}"]));
-    resolve(source, []);
-    assertErrors([StaticWarningCode.NON_VOID_RETURN_FOR_OPERATOR]);
-    verify([source]);
-  }
-  void fail_nonVoidReturnForSetter() {
-    Source source = addSource(EngineTestCase.createSource(["int set x(int v) {", "  var s = x;", "  x = v;", "  return s;", "}"]));
-    resolve(source, []);
-    assertErrors([StaticWarningCode.NON_VOID_RETURN_FOR_SETTER]);
-    verify([source]);
-  }
-  void fail_overrideNotSubtype() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int m() {}", "}", "class B extends A {", "  String m() {}", "}"]));
-    resolve(source, []);
-    assertErrors([StaticWarningCode.OVERRIDE_NOT_SUBTYPE]);
-    verify([source]);
-  }
-  void fail_overrideWithDifferentDefault() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  m([int p = 0]) {}", "}", "class B extends A {", "  m([int p = 1]) {}", "}"]));
-    resolve(source, []);
-    assertErrors([StaticWarningCode.OVERRIDE_WITH_DIFFERENT_DEFAULT]);
-    verify([source]);
-  }
-  void fail_redirectToInvalidReturnType() {
-    Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
-    assertErrors([StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE]);
-    verify([source]);
-  }
   void fail_redirectToMissingConstructor() {
     Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR]);
     verify([source]);
   }
   void fail_redirectToNonClass() {
     Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticWarningCode.REDIRECT_TO_NON_CLASS]);
     verify([source]);
   }
-  void fail_switchExpressionNotAssignable() {
-    Source source = addSource(EngineTestCase.createSource(["f(int p) {", "  switch (p) {", "    case 'a': break;", "  }", "}"]));
-    resolve(source, []);
-    assertErrors([StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE]);
-    verify([source]);
-  }
   void fail_undefinedGetter() {
     Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticWarningCode.UNDEFINED_GETTER]);
     verify([source]);
   }
+  void fail_undefinedIdentifier_commentReference() {
+    Source source = addSource(EngineTestCase.createSource(["/** [m] xxx [new B.c] */", "class A {", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.UNDEFINED_IDENTIFIER, StaticWarningCode.UNDEFINED_IDENTIFIER]);
+  }
   void fail_undefinedIdentifier_function() {
-    Source source = addSource(EngineTestCase.createSource(["int a() -> b;"]));
-    resolve(source, []);
+    Source source = addSource(EngineTestCase.createSource(["int a() => b;"]));
+    resolve(source);
     assertErrors([StaticWarningCode.UNDEFINED_IDENTIFIER]);
     verify([source]);
   }
   void fail_undefinedSetter() {
     Source source = addSource(EngineTestCase.createSource(["class C {}", "f(var p) {", "  C.m = 0;", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticWarningCode.UNDEFINED_SETTER]);
     verify([source]);
   }
   void fail_undefinedStaticMethodOrGetter_getter() {
     Source source = addSource(EngineTestCase.createSource(["class C {}", "f(var p) {", "  f(C.m);", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticWarningCode.UNDEFINED_STATIC_METHOD_OR_GETTER]);
     verify([source]);
   }
   void fail_undefinedStaticMethodOrGetter_method() {
     Source source = addSource(EngineTestCase.createSource(["class C {}", "f(var p) {", "  f(C.m());", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticWarningCode.UNDEFINED_STATIC_METHOD_OR_GETTER]);
     verify([source]);
   }
+  void test_ambiguousImport_typeAnnotation() {
+    Source source = addSource(EngineTestCase.createSource(["import 'lib1.dart';", "import 'lib2.dart';", "typedef N FT(N p);", "N f(N p) {", "  N v;", "}", "class A {", "  N m() {}", "}", "class B<T extends N> {}"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.AMBIGUOUS_IMPORT, StaticWarningCode.AMBIGUOUS_IMPORT, StaticWarningCode.AMBIGUOUS_IMPORT, StaticWarningCode.AMBIGUOUS_IMPORT, StaticWarningCode.AMBIGUOUS_IMPORT, StaticWarningCode.AMBIGUOUS_IMPORT, StaticWarningCode.AMBIGUOUS_IMPORT]);
+  }
+  void test_ambiguousImport_typeArgument_annotation() {
+    Source source = addSource(EngineTestCase.createSource(["import 'lib1.dart';", "import 'lib2.dart';", "class A<T> {}", "A<N> f() {}"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.AMBIGUOUS_IMPORT]);
+  }
+  void test_argumentTypeNotAssignable_binary() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  operator +(int p) {}", "}", "f(A a) {", "  a + '0';", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+  void test_argumentTypeNotAssignable_index() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  operator [](int index) {}", "}", "f(A a) {", "  a['0'];", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+  void test_argumentTypeNotAssignable_invocation_callParameter() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  call(int p) {}", "}", "f(A a) {", "  a('0');", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+  void test_argumentTypeNotAssignable_invocation_callVariable() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  call(int p) {}", "}", "main() {", "  A a = new A();", "  a('0');", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+  void test_argumentTypeNotAssignable_invocation_functionParameter() {
+    Source source = addSource(EngineTestCase.createSource(["a(b(int p)) {", "  b('0');", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+  void test_argumentTypeNotAssignable_invocation_generic() {
+    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  m(T t) {}", "}", "f(A<String> a) {", "  a.m(1);", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+  void test_argumentTypeNotAssignable_invocation_named() {
+    Source source = addSource(EngineTestCase.createSource(["f({String p}) {}", "main() {", "  f(p: 42);", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+  void test_argumentTypeNotAssignable_invocation_optional() {
+    Source source = addSource(EngineTestCase.createSource(["f([String p]) {}", "main() {", "  f(42);", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+  void test_argumentTypeNotAssignable_invocation_required() {
+    Source source = addSource(EngineTestCase.createSource(["f(String p) {}", "main() {", "  f(42);", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+  void test_argumentTypeNotAssignable_invocation_typedef_generic() {
+    Source source = addSource(EngineTestCase.createSource(["typedef A<T>(T p);", "f(A<int> a) {", "  a('1');", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+  void test_argumentTypeNotAssignable_invocation_typedef_local() {
+    Source source = addSource(EngineTestCase.createSource(["typedef A(int p);", "A getA() => null;", "main() {", "  A a = getA();", "  a('1');", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+  void test_argumentTypeNotAssignable_invocation_typedef_parameter() {
+    Source source = addSource(EngineTestCase.createSource(["typedef A(int p);", "f(A a) {", "  a('1');", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+  void test_argumentTypeNotAssignable_new_generic() {
+    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  A(T p) {}", "}", "main() {", "  new A<String>(42);", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+  void test_argumentTypeNotAssignable_new_optional() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A([String p]) {}", "}", "main() {", "  new A(42);", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+  void test_argumentTypeNotAssignable_new_required() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A(String p) {}", "}", "main() {", "  new A(42);", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+  void test_assignmentToFinal_instanceVariable() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  final v = 0;", "}", "f() {", "  A a = new A();", "  a.v = 1;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    verify([source]);
+  }
+  void test_assignmentToFinal_localVariable() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  final x = 0;", "  x = 1;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    verify([source]);
+  }
+  void test_assignmentToFinal_prefixMinusMinus() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  final x = 0;", "  --x;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    verify([source]);
+  }
+  void test_assignmentToFinal_prefixPlusPlus() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  final x = 0;", "  ++x;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    verify([source]);
+  }
+  void test_assignmentToFinal_propertyAccess() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int get x => 0;", "}", "class B {", "  static A a;", "}", "main() {", "  B.a.x = 0;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    verify([source]);
+  }
+  void test_assignmentToFinal_suffixMinusMinus() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  final x = 0;", "  x--;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    verify([source]);
+  }
+  void test_assignmentToFinal_suffixPlusPlus() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  final x = 0;", "  x++;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    verify([source]);
+  }
+  void test_assignmentToFinal_topLevelVariable() {
+    Source source = addSource(EngineTestCase.createSource(["final x = 0;", "f() { x = 1; }"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    verify([source]);
+  }
+  void test_caseBlockNotTerminated() {
+    Source source = addSource(EngineTestCase.createSource(["f(int p) {", "  switch (p) {", "    case 0:", "      f(p);", "    case 1:", "      break;", "  }", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.CASE_BLOCK_NOT_TERMINATED]);
+    verify([source]);
+  }
   void test_concreteClassWithAbstractMember() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  m();", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER]);
     verify([source]);
   }
+  void test_conflictingInstanceGetterAndSuperclassMember_direct_field() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static int v;", "}", "class B extends A {", "  get v => 0;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER]);
+    verify([source]);
+  }
+  void test_conflictingInstanceGetterAndSuperclassMember_direct_getter() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static get v => 0;", "}", "class B extends A {", "  get v => 0;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER]);
+    verify([source]);
+  }
+  void test_conflictingInstanceGetterAndSuperclassMember_direct_method() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static v() {}", "}", "class B extends A {", "  get v => 0;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER]);
+    verify([source]);
+  }
+  void test_conflictingInstanceGetterAndSuperclassMember_direct_setter() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static set v(x) {}", "}", "class B extends A {", "  get v => 0;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER]);
+    verify([source]);
+  }
+  void test_conflictingInstanceGetterAndSuperclassMember_indirect() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static int v;", "}", "class B extends A {}", "class C extends B {", "  get v => 0;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER]);
+    verify([source]);
+  }
+  void test_conflictingInstanceGetterAndSuperclassMember_mixin() {
+    Source source = addSource(EngineTestCase.createSource(["class M {", "  static int v;", "}", "class B extends Object with M {", "  get v => 0;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER]);
+    verify([source]);
+  }
+  void test_conflictingInstanceSetterAndSuperclassMember() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static int v;", "}", "class B extends A {", "  set v(x) {}", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER]);
+    verify([source]);
+  }
+  void test_conflictingStaticGetterAndInstanceSetter_mixin() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  set x(int p) {}", "}", "class B extends Object with A {", "  static get x => 0;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER]);
+    verify([source]);
+  }
+  void test_conflictingStaticGetterAndInstanceSetter_superClass() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  set x(int p) {}", "}", "class B extends A {", "  static get x => 0;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER]);
+    verify([source]);
+  }
+  void test_conflictingStaticGetterAndInstanceSetter_thisClass() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static get x => 0;", "  set x(int p) {}", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER]);
+    verify([source]);
+  }
+  void test_conflictingStaticSetterAndInstanceMember_thisClass_getter() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  get x => 0;", "  static set x(int p) {}", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER]);
+    verify([source]);
+  }
+  void test_conflictingStaticSetterAndInstanceMember_thisClass_method() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  x() {}", "  static set x(int p) {}", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER]);
+    verify([source]);
+  }
   void test_constWithAbstractClass() {
-    Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  const A() {}", "}", "void f() {", "  A a = const A();", "}"]));
-    resolve(source, []);
+    Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  const A();", "}", "void f() {", "  A a = const A();", "}"]));
+    resolve(source);
     assertErrors([StaticWarningCode.CONST_WITH_ABSTRACT_CLASS]);
     verify([source]);
   }
   void test_equalKeysInMap() {
     Source source = addSource(EngineTestCase.createSource(["var m = {'a' : 0, 'b' : 1, 'a' : 2};"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticWarningCode.EQUAL_KEYS_IN_MAP]);
     verify([source]);
   }
-  void test_fieldInitializerWithInvalidType() {
+  void test_exportDuplicatedLibraryName() {
+    Source source = addSource(EngineTestCase.createSource(["library test;", "export 'lib1.dart';", "export 'lib2.dart';"]));
+    addSource2("/lib1.dart", "library lib;");
+    addSource2("/lib2.dart", "library lib;");
+    resolve(source);
+    assertErrors([StaticWarningCode.EXPORT_DUPLICATED_LIBRARY_NAME]);
+    verify([source]);
+  }
+  void test_extraPositionalArguments() {
+    Source source = addSource(EngineTestCase.createSource(["f() {}", "main() {", "  f(0, 1, '2');", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS]);
+    verify([source]);
+  }
+  void test_fieldInitializerNotAssignable() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A() : x = '';", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+  void test_fieldInitializingFormalNotAssignable() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A(String this.x) {}", "}"]));
-    resolve(source, []);
-    assertErrors([StaticWarningCode.FIELD_INITIALIZER_WITH_INVALID_TYPE]);
+    resolve(source);
+    assertErrors([StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+  void test_importDuplicatedLibraryName() {
+    Source source = addSource(EngineTestCase.createSource(["library test;", "import 'lib1.dart';", "import 'lib2.dart';"]));
+    addSource2("/lib1.dart", "library lib;");
+    addSource2("/lib2.dart", "library lib;");
+    resolve(source);
+    assertErrors([StaticWarningCode.IMPORT_DUPLICATED_LIBRARY_NAME]);
+    verify([source]);
+  }
+  void test_inconsistentMethodInheritance() {
+    Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  x(int i);", "}", "abstract class B {", "  x(String s);", "}", "abstract class C implements A, B {}"]));
+    resolve(source);
+    assertErrors([StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
+    verify([source]);
+  }
+  void test_instanceMethodNameCollidesWithSuperclassStatic_field() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static var n;", "}", "class B extends A {", "  void n() {}", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC]);
+    verify([source]);
+  }
+  void test_instanceMethodNameCollidesWithSuperclassStatic_field2() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static var n;", "}", "class B extends A {", "}", "class C extends B {", "  void n() {}", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC]);
+    verify([source]);
+  }
+  void test_instanceMethodNameCollidesWithSuperclassStatic_getter() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static get n {return 0;}", "}", "class B extends A {", "  void n() {}", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC]);
+    verify([source]);
+  }
+  void test_instanceMethodNameCollidesWithSuperclassStatic_getter2() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static get n {return 0;}", "}", "class B extends A {", "}", "class C extends B {", "  void n() {}", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC]);
+    verify([source]);
+  }
+  void test_instanceMethodNameCollidesWithSuperclassStatic_method() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static n () {}", "}", "class B extends A {", "  void n() {}", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC]);
+    verify([source]);
+  }
+  void test_instanceMethodNameCollidesWithSuperclassStatic_method2() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static n () {}", "}", "class B extends A {", "}", "class C extends B {", "  void n() {}", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC]);
+    verify([source]);
+  }
+  void test_instanceMethodNameCollidesWithSuperclassStatic_setter() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int i = 0;", "  static set n(int x) {i = x;}", "}", "class B extends A {", "  void n() {}", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC]);
+    verify([source]);
+  }
+  void test_instanceMethodNameCollidesWithSuperclassStatic_setter2() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int i = 0;", "  static set n(int x) {i = x;}", "}", "class B extends A {", "}", "class C extends B {", "  void n() {}", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC]);
+    verify([source]);
+  }
+  void test_invalidGetterOverrideReturnType() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int get g { return 0; }", "}", "class B extends A {", "  String get g { return 'a'; }", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE]);
+    verify([source]);
+  }
+  void test_invalidMethodOverrideNamedParamType() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  m({int a}) {}", "}", "class B implements A {", "  m({String a}) {}", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE]);
+    verify([source]);
+  }
+  void test_invalidMethodOverrideNormalParamType() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  m(int a) {}", "}", "class B implements A {", "  m(String a) {}", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE]);
+    verify([source]);
+  }
+  void test_invalidMethodOverrideOptionalParamType() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  m([int a]) {}", "}", "class B implements A {", "  m([String a]) {}", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE]);
+    verify([source]);
+  }
+  void test_invalidMethodOverrideReturnType_interface() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int m() { return 0; }", "}", "class B implements A {", "  String m() { return 'a'; }", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
+    verify([source]);
+  }
+  void test_invalidMethodOverrideReturnType_interface2() {
+    Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  int m();", "}", "abstract class B implements A {", "}", "class C implements B {", "  String m() { return 'a'; }", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
+    verify([source]);
+  }
+  void test_invalidMethodOverrideReturnType_mixin() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int m() { return 0; }", "}", "class B extends Object with A {", "  String m() { return 'a'; }", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
+    verify([source]);
+  }
+  void test_invalidMethodOverrideReturnType_superclass() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int m() { return 0; }", "}", "class B extends A {", "  String m() { return 'a'; }", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
+    verify([source]);
+  }
+  void test_invalidMethodOverrideReturnType_superclass2() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int m() { return 0; }", "}", "class B extends A {", "}", "class C extends B {", "  String m() { return 'a'; }", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
+    verify([source]);
+  }
+  void test_invalidMethodOverrideReturnType_void() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int m() {}", "}", "class B extends A {", "  void m() {}", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
+    verify([source]);
+  }
+  void test_invalidSetterOverrideNormalParamType() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  void set s(int v) {}", "}", "class B extends A {", "  void set s(String v) {}", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE]);
+    verify([source]);
+  }
+  void test_mismatchedAccessorTypes_class() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int get g { return 0; }", "  set g(String v) {}", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES]);
+    verify([source]);
+  }
+  void test_mismatchedAccessorTypes_topLevel() {
+    Source source = addSource(EngineTestCase.createSource(["int get g { return 0; }", "set g(String v) {}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES]);
     verify([source]);
   }
   void test_newWithAbstractClass() {
     Source source = addSource(EngineTestCase.createSource(["abstract class A {}", "void f() {", "  A a = new A();", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticWarningCode.NEW_WITH_ABSTRACT_CLASS]);
     verify([source]);
   }
+  void test_newWithNonType() {
+    Source source = addSource(EngineTestCase.createSource(["var A = 0;", "void f() {", "  A a = new A();", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.NEW_WITH_NON_TYPE]);
+    verify([source]);
+  }
+  void test_newWithUndefinedConstructor() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "}", "f() {", "  new A.name();", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR]);
+  }
+  void test_newWithUndefinedConstructorDefault() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A.name() {}", "}", "f() {", "  new A();", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT]);
+    verify([source]);
+  }
+  void test_nonAbstractClassInheritsAbstractMemberFivePlus() {
+    Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  m();", "  n();", "  o();", "  p();", "  q();", "}", "class C extends A {", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS]);
+    verify([source]);
+  }
+  void test_nonAbstractClassInheritsAbstractMemberFour() {
+    Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  m();", "  n();", "  o();", "  p();", "}", "class C extends A {", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR]);
+    verify([source]);
+  }
+  void test_nonAbstractClassInheritsAbstractMemberOne_getter_fromInterface() {
+    Source source = addSource(EngineTestCase.createSource(["class I {", "  int get g {return 1;}", "}", "class C implements I {", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
+    verify([source]);
+  }
+  void test_nonAbstractClassInheritsAbstractMemberOne_getter_fromSuperclass() {
+    Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  int get g;", "}", "class C extends A {", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
+    verify([source]);
+  }
+  void test_nonAbstractClassInheritsAbstractMemberOne_method_fromInterface() {
+    Source source = addSource(EngineTestCase.createSource(["class I {", "  m(p) {}", "}", "class C implements I {", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
+    verify([source]);
+  }
+  void test_nonAbstractClassInheritsAbstractMemberOne_method_fromSuperclass() {
+    Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  m(p);", "}", "class C extends A {", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
+    verify([source]);
+  }
+  void test_nonAbstractClassInheritsAbstractMemberOne_setter_fromInterface() {
+    Source source = addSource(EngineTestCase.createSource(["class I {", "  set s(int i) {}", "}", "class C implements I {", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
+    verify([source]);
+  }
+  void test_nonAbstractClassInheritsAbstractMemberOne_setter_fromSuperclass() {
+    Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  set s(int i);", "}", "class C extends A {", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
+    verify([source]);
+  }
+  void test_nonAbstractClassInheritsAbstractMemberThree() {
+    Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  m();", "  n();", "  o();", "}", "class C extends A {", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE]);
+    verify([source]);
+  }
+  void test_nonAbstractClassInheritsAbstractMemberTwo() {
+    Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  m();", "  n();", "}", "class C extends A {", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO]);
+    verify([source]);
+  }
+  void test_nonTypeInCatchClause_noElement() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  try {", "  } on T catch (e) {", "  }", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE]);
+    verify([source]);
+  }
+  void test_nonTypeInCatchClause_notType() {
+    Source source = addSource(EngineTestCase.createSource(["var T = 0;", "f() {", "  try {", "  } on T catch (e) {", "  }", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE]);
+    verify([source]);
+  }
+  void test_nonVoidReturnForOperator() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int operator []=(a, b) {}", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.NON_VOID_RETURN_FOR_OPERATOR]);
+    verify([source]);
+  }
+  void test_nonVoidReturnForSetter_function() {
+    Source source = addSource(EngineTestCase.createSource(["int set x(int v) {", "  return 42;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.NON_VOID_RETURN_FOR_SETTER]);
+    verify([source]);
+  }
+  void test_nonVoidReturnForSetter_method() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int set x(int v) {", "    return 42;", "  }", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.NON_VOID_RETURN_FOR_SETTER]);
+    verify([source]);
+  }
+  void test_notEnoughRequiredArguments() {
+    Source source = addSource(EngineTestCase.createSource(["f(int a, String b) {}", "main() {", "  f();", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS]);
+    verify([source]);
+  }
   void test_partOfDifferentLibrary() {
     Source source = addSource(EngineTestCase.createSource(["library lib;", "part 'part.dart';"]));
     addSource2("/part.dart", EngineTestCase.createSource(["part of lub;"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticWarningCode.PART_OF_DIFFERENT_LIBRARY]);
     verify([source]);
   }
+  void test_redirectToInvalidFunctionType() {
+    Source source = addSource(EngineTestCase.createSource(["class A implements B {", "  A(int p) {}", "}", "class B {", "  B() = A;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.REDIRECT_TO_INVALID_FUNCTION_TYPE]);
+    verify([source]);
+  }
+  void test_redirectToInvalidReturnType() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "}", "class B {", "  B() = A;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE]);
+    verify([source]);
+  }
   void test_returnWithoutValue() {
     Source source = addSource(EngineTestCase.createSource(["int f() { return; }"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticWarningCode.RETURN_WITHOUT_VALUE]);
     verify([source]);
   }
+  void test_staticAccessToInstanceMember_method_invocation() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  m() {}", "}", "main() {", "  A.m();", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER]);
+    verify([source]);
+  }
+  void test_staticAccessToInstanceMember_method_reference() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  m() {}", "}", "main() {", "  A.m;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER]);
+    verify([source]);
+  }
+  void test_staticAccessToInstanceMember_propertyAccess_field() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  var f;", "}", "main() {", "  A.f;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER]);
+    verify([source]);
+  }
+  void test_staticAccessToInstanceMember_propertyAccess_getter() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  get f => 42;", "}", "main() {", "  A.f;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER]);
+    verify([source]);
+  }
+  void test_staticAccessToInstanceMember_propertyAccess_setter() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  set f(x) {}", "}", "main() {", "  A.f = 42;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER]);
+    verify([source]);
+  }
+  void test_switchExpressionNotAssignable() {
+    Source source = addSource(EngineTestCase.createSource(["f(int p) {", "  switch (p) {", "    case 'a': break;", "  }", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
   void test_undefinedClass_instanceCreation() {
     Source source = addSource(EngineTestCase.createSource(["f() { new C(); }"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticWarningCode.UNDEFINED_CLASS]);
   }
   void test_undefinedClass_variableDeclaration() {
     Source source = addSource(EngineTestCase.createSource(["f() { C c; }"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticWarningCode.UNDEFINED_CLASS]);
   }
   void test_undefinedClassBoolean_variableDeclaration() {
     Source source = addSource(EngineTestCase.createSource(["f() { boolean v; }"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticWarningCode.UNDEFINED_CLASS_BOOLEAN]);
   }
-  void test_undefinedIdentifier_commentReference() {
-    Source source = addSource(EngineTestCase.createSource(["/** [m] xxx [new B.c] */", "class A {", "}"]));
-    resolve(source, []);
-    assertErrors([StaticWarningCode.UNDEFINED_IDENTIFIER, StaticWarningCode.UNDEFINED_IDENTIFIER]);
-  }
   void test_undefinedIdentifier_initializer() {
     Source source = addSource(EngineTestCase.createSource(["var a = b;"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticWarningCode.UNDEFINED_IDENTIFIER]);
   }
   void test_undefinedIdentifier_metadata() {
     Source source = addSource(EngineTestCase.createSource(["@undefined class A {}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticWarningCode.UNDEFINED_IDENTIFIER]);
   }
   void test_undefinedIdentifier_methodInvocation() {
     Source source = addSource(EngineTestCase.createSource(["f() { C.m(); }"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticWarningCode.UNDEFINED_IDENTIFIER]);
   }
+  void test_undefinedNamedParameter() {
+    Source source = addSource(EngineTestCase.createSource(["f({a, b}) {}", "main() {", "  f(c: 1);", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.UNDEFINED_NAMED_PARAMETER]);
+  }
   static dartSuite() {
     _ut.group('StaticWarningCodeTest', () {
+      _ut.test('test_ambiguousImport_typeAnnotation', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_ambiguousImport_typeAnnotation);
+      });
+      _ut.test('test_ambiguousImport_typeArgument_annotation', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_ambiguousImport_typeArgument_annotation);
+      });
+      _ut.test('test_argumentTypeNotAssignable_binary', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_binary);
+      });
+      _ut.test('test_argumentTypeNotAssignable_index', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_index);
+      });
+      _ut.test('test_argumentTypeNotAssignable_invocation_callParameter', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_invocation_callParameter);
+      });
+      _ut.test('test_argumentTypeNotAssignable_invocation_callVariable', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_invocation_callVariable);
+      });
+      _ut.test('test_argumentTypeNotAssignable_invocation_functionParameter', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_invocation_functionParameter);
+      });
+      _ut.test('test_argumentTypeNotAssignable_invocation_generic', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_invocation_generic);
+      });
+      _ut.test('test_argumentTypeNotAssignable_invocation_named', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_invocation_named);
+      });
+      _ut.test('test_argumentTypeNotAssignable_invocation_optional', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_invocation_optional);
+      });
+      _ut.test('test_argumentTypeNotAssignable_invocation_required', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_invocation_required);
+      });
+      _ut.test('test_argumentTypeNotAssignable_invocation_typedef_generic', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_invocation_typedef_generic);
+      });
+      _ut.test('test_argumentTypeNotAssignable_invocation_typedef_local', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_invocation_typedef_local);
+      });
+      _ut.test('test_argumentTypeNotAssignable_invocation_typedef_parameter', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_invocation_typedef_parameter);
+      });
+      _ut.test('test_argumentTypeNotAssignable_new_generic', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_new_generic);
+      });
+      _ut.test('test_argumentTypeNotAssignable_new_optional', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_new_optional);
+      });
+      _ut.test('test_argumentTypeNotAssignable_new_required', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_new_required);
+      });
+      _ut.test('test_assignmentToFinal_instanceVariable', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_assignmentToFinal_instanceVariable);
+      });
+      _ut.test('test_assignmentToFinal_localVariable', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_assignmentToFinal_localVariable);
+      });
+      _ut.test('test_assignmentToFinal_prefixMinusMinus', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_assignmentToFinal_prefixMinusMinus);
+      });
+      _ut.test('test_assignmentToFinal_prefixPlusPlus', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_assignmentToFinal_prefixPlusPlus);
+      });
+      _ut.test('test_assignmentToFinal_propertyAccess', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_assignmentToFinal_propertyAccess);
+      });
+      _ut.test('test_assignmentToFinal_suffixMinusMinus', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_assignmentToFinal_suffixMinusMinus);
+      });
+      _ut.test('test_assignmentToFinal_suffixPlusPlus', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_assignmentToFinal_suffixPlusPlus);
+      });
+      _ut.test('test_assignmentToFinal_topLevelVariable', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_assignmentToFinal_topLevelVariable);
+      });
+      _ut.test('test_caseBlockNotTerminated', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_caseBlockNotTerminated);
+      });
       _ut.test('test_concreteClassWithAbstractMember', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_concreteClassWithAbstractMember);
       });
+      _ut.test('test_conflictingInstanceGetterAndSuperclassMember_direct_field', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_conflictingInstanceGetterAndSuperclassMember_direct_field);
+      });
+      _ut.test('test_conflictingInstanceGetterAndSuperclassMember_direct_getter', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_conflictingInstanceGetterAndSuperclassMember_direct_getter);
+      });
+      _ut.test('test_conflictingInstanceGetterAndSuperclassMember_direct_method', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_conflictingInstanceGetterAndSuperclassMember_direct_method);
+      });
+      _ut.test('test_conflictingInstanceGetterAndSuperclassMember_direct_setter', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_conflictingInstanceGetterAndSuperclassMember_direct_setter);
+      });
+      _ut.test('test_conflictingInstanceGetterAndSuperclassMember_indirect', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_conflictingInstanceGetterAndSuperclassMember_indirect);
+      });
+      _ut.test('test_conflictingInstanceGetterAndSuperclassMember_mixin', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_conflictingInstanceGetterAndSuperclassMember_mixin);
+      });
+      _ut.test('test_conflictingInstanceSetterAndSuperclassMember', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_conflictingInstanceSetterAndSuperclassMember);
+      });
+      _ut.test('test_conflictingStaticGetterAndInstanceSetter_mixin', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_conflictingStaticGetterAndInstanceSetter_mixin);
+      });
+      _ut.test('test_conflictingStaticGetterAndInstanceSetter_superClass', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_conflictingStaticGetterAndInstanceSetter_superClass);
+      });
+      _ut.test('test_conflictingStaticGetterAndInstanceSetter_thisClass', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_conflictingStaticGetterAndInstanceSetter_thisClass);
+      });
+      _ut.test('test_conflictingStaticSetterAndInstanceMember_thisClass_getter', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_conflictingStaticSetterAndInstanceMember_thisClass_getter);
+      });
+      _ut.test('test_conflictingStaticSetterAndInstanceMember_thisClass_method', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_conflictingStaticSetterAndInstanceMember_thisClass_method);
+      });
       _ut.test('test_constWithAbstractClass', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_constWithAbstractClass);
@@ -4589,22 +8181,234 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_equalKeysInMap);
       });
-      _ut.test('test_fieldInitializerWithInvalidType', () {
+      _ut.test('test_exportDuplicatedLibraryName', () {
         final __test = new StaticWarningCodeTest();
-        runJUnitTest(__test, __test.test_fieldInitializerWithInvalidType);
+        runJUnitTest(__test, __test.test_exportDuplicatedLibraryName);
+      });
+      _ut.test('test_extraPositionalArguments', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_extraPositionalArguments);
+      });
+      _ut.test('test_fieldInitializerNotAssignable', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_fieldInitializerNotAssignable);
+      });
+      _ut.test('test_fieldInitializingFormalNotAssignable', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_fieldInitializingFormalNotAssignable);
+      });
+      _ut.test('test_importDuplicatedLibraryName', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_importDuplicatedLibraryName);
+      });
+      _ut.test('test_inconsistentMethodInheritance', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_inconsistentMethodInheritance);
+      });
+      _ut.test('test_instanceMethodNameCollidesWithSuperclassStatic_field', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_instanceMethodNameCollidesWithSuperclassStatic_field);
+      });
+      _ut.test('test_instanceMethodNameCollidesWithSuperclassStatic_field2', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_instanceMethodNameCollidesWithSuperclassStatic_field2);
+      });
+      _ut.test('test_instanceMethodNameCollidesWithSuperclassStatic_getter', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_instanceMethodNameCollidesWithSuperclassStatic_getter);
+      });
+      _ut.test('test_instanceMethodNameCollidesWithSuperclassStatic_getter2', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_instanceMethodNameCollidesWithSuperclassStatic_getter2);
+      });
+      _ut.test('test_instanceMethodNameCollidesWithSuperclassStatic_method', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_instanceMethodNameCollidesWithSuperclassStatic_method);
+      });
+      _ut.test('test_instanceMethodNameCollidesWithSuperclassStatic_method2', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_instanceMethodNameCollidesWithSuperclassStatic_method2);
+      });
+      _ut.test('test_instanceMethodNameCollidesWithSuperclassStatic_setter', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_instanceMethodNameCollidesWithSuperclassStatic_setter);
+      });
+      _ut.test('test_instanceMethodNameCollidesWithSuperclassStatic_setter2', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_instanceMethodNameCollidesWithSuperclassStatic_setter2);
+      });
+      _ut.test('test_invalidGetterOverrideReturnType', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_invalidGetterOverrideReturnType);
+      });
+      _ut.test('test_invalidMethodOverrideNamedParamType', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_invalidMethodOverrideNamedParamType);
+      });
+      _ut.test('test_invalidMethodOverrideNormalParamType', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_invalidMethodOverrideNormalParamType);
+      });
+      _ut.test('test_invalidMethodOverrideOptionalParamType', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_invalidMethodOverrideOptionalParamType);
+      });
+      _ut.test('test_invalidMethodOverrideReturnType_interface', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_invalidMethodOverrideReturnType_interface);
+      });
+      _ut.test('test_invalidMethodOverrideReturnType_interface2', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_invalidMethodOverrideReturnType_interface2);
+      });
+      _ut.test('test_invalidMethodOverrideReturnType_mixin', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_invalidMethodOverrideReturnType_mixin);
+      });
+      _ut.test('test_invalidMethodOverrideReturnType_superclass', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_invalidMethodOverrideReturnType_superclass);
+      });
+      _ut.test('test_invalidMethodOverrideReturnType_superclass2', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_invalidMethodOverrideReturnType_superclass2);
+      });
+      _ut.test('test_invalidMethodOverrideReturnType_void', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_invalidMethodOverrideReturnType_void);
+      });
+      _ut.test('test_invalidSetterOverrideNormalParamType', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_invalidSetterOverrideNormalParamType);
+      });
+      _ut.test('test_mismatchedAccessorTypes_class', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_mismatchedAccessorTypes_class);
+      });
+      _ut.test('test_mismatchedAccessorTypes_topLevel', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_mismatchedAccessorTypes_topLevel);
       });
       _ut.test('test_newWithAbstractClass', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_newWithAbstractClass);
       });
+      _ut.test('test_newWithNonType', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_newWithNonType);
+      });
+      _ut.test('test_newWithUndefinedConstructor', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_newWithUndefinedConstructor);
+      });
+      _ut.test('test_newWithUndefinedConstructorDefault', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_newWithUndefinedConstructorDefault);
+      });
+      _ut.test('test_nonAbstractClassInheritsAbstractMemberFivePlus', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_nonAbstractClassInheritsAbstractMemberFivePlus);
+      });
+      _ut.test('test_nonAbstractClassInheritsAbstractMemberFour', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_nonAbstractClassInheritsAbstractMemberFour);
+      });
+      _ut.test('test_nonAbstractClassInheritsAbstractMemberOne_getter_fromInterface', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_nonAbstractClassInheritsAbstractMemberOne_getter_fromInterface);
+      });
+      _ut.test('test_nonAbstractClassInheritsAbstractMemberOne_getter_fromSuperclass', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_nonAbstractClassInheritsAbstractMemberOne_getter_fromSuperclass);
+      });
+      _ut.test('test_nonAbstractClassInheritsAbstractMemberOne_method_fromInterface', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_nonAbstractClassInheritsAbstractMemberOne_method_fromInterface);
+      });
+      _ut.test('test_nonAbstractClassInheritsAbstractMemberOne_method_fromSuperclass', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_nonAbstractClassInheritsAbstractMemberOne_method_fromSuperclass);
+      });
+      _ut.test('test_nonAbstractClassInheritsAbstractMemberOne_setter_fromInterface', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_nonAbstractClassInheritsAbstractMemberOne_setter_fromInterface);
+      });
+      _ut.test('test_nonAbstractClassInheritsAbstractMemberOne_setter_fromSuperclass', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_nonAbstractClassInheritsAbstractMemberOne_setter_fromSuperclass);
+      });
+      _ut.test('test_nonAbstractClassInheritsAbstractMemberThree', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_nonAbstractClassInheritsAbstractMemberThree);
+      });
+      _ut.test('test_nonAbstractClassInheritsAbstractMemberTwo', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_nonAbstractClassInheritsAbstractMemberTwo);
+      });
+      _ut.test('test_nonTypeInCatchClause_noElement', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_nonTypeInCatchClause_noElement);
+      });
+      _ut.test('test_nonTypeInCatchClause_notType', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_nonTypeInCatchClause_notType);
+      });
+      _ut.test('test_nonVoidReturnForOperator', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_nonVoidReturnForOperator);
+      });
+      _ut.test('test_nonVoidReturnForSetter_function', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_nonVoidReturnForSetter_function);
+      });
+      _ut.test('test_nonVoidReturnForSetter_method', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_nonVoidReturnForSetter_method);
+      });
+      _ut.test('test_notEnoughRequiredArguments', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_notEnoughRequiredArguments);
+      });
       _ut.test('test_partOfDifferentLibrary', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_partOfDifferentLibrary);
       });
+      _ut.test('test_redirectToInvalidFunctionType', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_redirectToInvalidFunctionType);
+      });
+      _ut.test('test_redirectToInvalidReturnType', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_redirectToInvalidReturnType);
+      });
       _ut.test('test_returnWithoutValue', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_returnWithoutValue);
       });
+      _ut.test('test_staticAccessToInstanceMember_method_invocation', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_staticAccessToInstanceMember_method_invocation);
+      });
+      _ut.test('test_staticAccessToInstanceMember_method_reference', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_staticAccessToInstanceMember_method_reference);
+      });
+      _ut.test('test_staticAccessToInstanceMember_propertyAccess_field', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_staticAccessToInstanceMember_propertyAccess_field);
+      });
+      _ut.test('test_staticAccessToInstanceMember_propertyAccess_getter', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_staticAccessToInstanceMember_propertyAccess_getter);
+      });
+      _ut.test('test_staticAccessToInstanceMember_propertyAccess_setter', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_staticAccessToInstanceMember_propertyAccess_setter);
+      });
+      _ut.test('test_switchExpressionNotAssignable', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_switchExpressionNotAssignable);
+      });
       _ut.test('test_undefinedClassBoolean_variableDeclaration', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_undefinedClassBoolean_variableDeclaration);
@@ -4617,10 +8421,6 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_undefinedClass_variableDeclaration);
       });
-      _ut.test('test_undefinedIdentifier_commentReference', () {
-        final __test = new StaticWarningCodeTest();
-        runJUnitTest(__test, __test.test_undefinedIdentifier_commentReference);
-      });
       _ut.test('test_undefinedIdentifier_initializer', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_undefinedIdentifier_initializer);
@@ -4633,19 +8433,23 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_undefinedIdentifier_methodInvocation);
       });
+      _ut.test('test_undefinedNamedParameter', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_undefinedNamedParameter);
+      });
     });
   }
 }
 class ErrorResolverTest extends ResolverTestCase {
   void test_breakLabelOnSwitchMember() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  void m(int i) {", "    switch (i) {", "      l: case 0:", "        break;", "      case 1:", "        break l;", "    }", "  }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([ResolverErrorCode.BREAK_LABEL_ON_SWITCH_MEMBER]);
     verify([source]);
   }
   void test_continueLabelOnSwitch() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  void m(int i) {", "    l: switch (i) {", "      case 0:", "        continue l;", "    }", "  }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([ResolverErrorCode.CONTINUE_LABEL_ON_SWITCH]);
     verify([source]);
   }
@@ -4662,77 +8466,87 @@
     });
   }
 }
+
 /**
  * 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.
  */
 class TestTypeProvider 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 'Iterable'.
    */
   InterfaceType _iterableType;
+
   /**
    * The type representing the built-in type 'Iterator'.
    */
   InterfaceType _iteratorType;
+
   /**
    * 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 stand-ins for the types defined in the core
-   * library.
-   */
-  TestTypeProvider() : super() {
-  }
   InterfaceType get boolType {
     if (_boolType == null) {
       _boolType = ElementFactory.classElement2("bool", []).type;
@@ -4790,6 +8604,7 @@
   InterfaceType get listType {
     if (_listType == null) {
       ClassElementImpl listElement = ElementFactory.classElement2("List", ["E"]);
+      listElement.constructors = <ConstructorElement> [ElementFactory.constructorElement(listElement, null)];
       _listType = listElement.type;
       Type2 eType = listElement.typeVariables[0].type;
       InterfaceType supertype = iterableType.substitute5(<Type2> [eType]);
@@ -4800,7 +8615,9 @@
   }
   InterfaceType get mapType {
     if (_mapType == null) {
-      _mapType = ElementFactory.classElement2("Map", ["K", "V"]).type;
+      ClassElementImpl mapElement = ElementFactory.classElement2("Map", ["K", "V"]);
+      _mapType = mapElement.type;
+      mapElement.accessors = <PropertyAccessorElement> [ElementFactory.getterElement("length", false, _intType)];
     }
     return _mapType;
   }
@@ -4815,8 +8632,9 @@
       ClassElementImpl objectElement = ElementFactory.object;
       _objectType = objectElement.type;
       if (objectElement.methods.length == 0) {
-        objectElement.methods = <MethodElement> [ElementFactory.methodElement("toString", stringType, []), ElementFactory.methodElement("==", _boolType, [_objectType])];
-        objectElement.accessors = <PropertyAccessorElement> [ElementFactory.getterElement("hashCode", false, intType)];
+        objectElement.constructors = <ConstructorElement> [ElementFactory.constructorElement(objectElement, null)];
+        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)];
       }
     }
     return _objectType;
@@ -4831,7 +8649,7 @@
     if (_stringType == null) {
       _stringType = ElementFactory.classElement2("String", []).type;
       ClassElementImpl stringElement = _stringType.element as ClassElementImpl;
-      stringElement.accessors = <PropertyAccessorElement> [ElementFactory.getterElement("isEmpty", false, boolType), ElementFactory.getterElement("length", false, intType)];
+      stringElement.accessors = <PropertyAccessorElement> [ElementFactory.getterElement("isEmpty", false, boolType), ElementFactory.getterElement("length", false, intType), ElementFactory.getterElement("codeUnits", false, listType.substitute5(<Type2> [intType]))];
       stringElement.methods = <MethodElement> [ElementFactory.methodElement("toLowerCase", _stringType, []), ElementFactory.methodElement("toUpperCase", _stringType, [])];
     }
     return _stringType;
@@ -4842,6 +8660,7 @@
     }
     return _typeType;
   }
+
   /**
    * Initialize the numeric types. They are created as a group so that we can (a) create the right
    * hierarchy and (b) add members to them.
@@ -4868,11 +8687,13 @@
     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.
  */
 class AnalysisContextFactory {
+
   /**
    * Create an analysis context that has a fake core library already resolved.
    * @return the analysis context that was created
@@ -4899,9 +8720,9 @@
     htmlDocumentElement.methods = <MethodElement> [ElementFactory.methodElement("query", elementType, <Type2> [provider.stringType])];
     htmlUnit.types = <ClassElement> [ElementFactory.classElement("AnchorElement", elementType, []), ElementFactory.classElement("BodyElement", elementType, []), ElementFactory.classElement("ButtonElement", elementType, []), ElementFactory.classElement("DivElement", elementType, []), documentElement, elementElement, htmlDocumentElement, ElementFactory.classElement("InputElement", elementType, []), ElementFactory.classElement("SelectElement", elementType, [])];
     htmlUnit.functions = <FunctionElement> [ElementFactory.functionElement3("query", elementElement, <ClassElement> [provider.stringType.element], ClassElementImpl.EMPTY_ARRAY)];
-    TopLevelVariableElementImpl document = ElementFactory.topLevelVariableElement2("document");
-    document.type = htmlDocumentElement.type;
+    TopLevelVariableElementImpl document = ElementFactory.topLevelVariableElement3("document", true, htmlDocumentElement.type);
     htmlUnit.topLevelVariables = <TopLevelVariableElement> [document];
+    htmlUnit.accessors = <PropertyAccessorElement> [document.getter];
     LibraryElementImpl htmlLibrary = new LibraryElementImpl(sdkContext, ASTFactory.libraryIdentifier2(["dart", "dom", "html"]));
     htmlLibrary.definingCompilationUnit = htmlUnit;
     Map<Source, LibraryElement> elementMap = new Map<Source, LibraryElement>();
@@ -4913,11 +8734,6 @@
     context.sourceFactory = sourceFactory2;
     return context;
   }
-  /**
-   * Prevent the creation of instances of this class.
-   */
-  AnalysisContextFactory() {
-  }
 }
 class LibraryImportScopeTest extends ResolverTestCase {
   void test_conflictingImports() {
@@ -4925,33 +8741,42 @@
     String typeNameA = "A";
     String typeNameB = "B";
     String typeNameC = "C";
-    ClassElement typeA = new ClassElementImpl(ASTFactory.identifier3(typeNameA));
-    ClassElement typeB1 = new ClassElementImpl(ASTFactory.identifier3(typeNameB));
-    ClassElement typeB2 = new ClassElementImpl(ASTFactory.identifier3(typeNameB));
-    ClassElement typeC = new ClassElementImpl(ASTFactory.identifier3(typeNameC));
+    ClassElement typeA = ElementFactory.classElement2(typeNameA, []);
+    ClassElement typeB1 = ElementFactory.classElement2(typeNameB, []);
+    ClassElement typeB2 = ElementFactory.classElement2(typeNameB, []);
+    ClassElement typeC = ElementFactory.classElement2(typeNameC, []);
     LibraryElement importedLibrary1 = createTestLibrary2(context, "imported1", []);
     ((importedLibrary1.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [typeA, typeB1];
-    ImportElementImpl import1 = new ImportElementImpl();
-    import1.importedLibrary = importedLibrary1;
+    ImportElementImpl import1 = ElementFactory.importFor(importedLibrary1, null, []);
     LibraryElement importedLibrary2 = createTestLibrary2(context, "imported2", []);
     ((importedLibrary2.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [typeB2, typeC];
-    ImportElementImpl import2 = new ImportElementImpl();
-    import2.importedLibrary = importedLibrary2;
+    ImportElementImpl import2 = ElementFactory.importFor(importedLibrary2, null, []);
     LibraryElementImpl importingLibrary = createTestLibrary2(context, "importing", []);
     importingLibrary.imports = <ImportElement> [import1, import2];
-    GatheringErrorListener errorListener = new GatheringErrorListener();
-    Scope scope = new LibraryImportScope(importingLibrary, errorListener);
-    JUnitTestCase.assertEquals(typeA, scope.lookup3(typeNameA, importingLibrary));
-    errorListener.assertNoErrors();
-    JUnitTestCase.assertEquals(typeC, scope.lookup3(typeNameC, importingLibrary));
-    errorListener.assertNoErrors();
-    Element element = scope.lookup3(typeNameB, importingLibrary);
-    errorListener.assertNoErrors();
-    EngineTestCase.assertInstanceOf(MultiplyDefinedElement, element);
-    List<Element> conflictingElements2 = ((element as MultiplyDefinedElement)).conflictingElements;
-    JUnitTestCase.assertEquals(typeB1, conflictingElements2[0]);
-    JUnitTestCase.assertEquals(typeB2, conflictingElements2[1]);
-    JUnitTestCase.assertEquals(2, conflictingElements2.length);
+    {
+      GatheringErrorListener errorListener = new GatheringErrorListener();
+      Scope scope = new LibraryImportScope(importingLibrary, errorListener);
+      JUnitTestCase.assertEquals(typeA, scope.lookup(ASTFactory.identifier3(typeNameA), importingLibrary));
+      errorListener.assertNoErrors();
+      JUnitTestCase.assertEquals(typeC, scope.lookup(ASTFactory.identifier3(typeNameC), importingLibrary));
+      errorListener.assertNoErrors();
+      Element element = scope.lookup(ASTFactory.identifier3(typeNameB), importingLibrary);
+      errorListener.assertErrors2([CompileTimeErrorCode.AMBIGUOUS_IMPORT]);
+      EngineTestCase.assertInstanceOf(MultiplyDefinedElement, element);
+      List<Element> conflictingElements2 = ((element as MultiplyDefinedElement)).conflictingElements;
+      JUnitTestCase.assertEquals(typeB1, conflictingElements2[0]);
+      JUnitTestCase.assertEquals(typeB2, conflictingElements2[1]);
+      JUnitTestCase.assertEquals(2, conflictingElements2.length);
+    }
+    {
+      GatheringErrorListener errorListener = new GatheringErrorListener();
+      Scope scope = new LibraryImportScope(importingLibrary, errorListener);
+      Identifier identifier = ASTFactory.identifier3(typeNameB);
+      ASTFactory.methodDeclaration(null, ASTFactory.typeName3(identifier, []), null, null, ASTFactory.identifier3("foo"), null);
+      Element element = scope.lookup(identifier, importingLibrary);
+      errorListener.assertErrors2([StaticWarningCode.AMBIGUOUS_IMPORT]);
+      EngineTestCase.assertInstanceOf(MultiplyDefinedElement, element);
+    }
   }
   void test_creation_empty() {
     LibraryElement definingLibrary = createTestLibrary();
@@ -4970,7 +8795,7 @@
     definingLibrary.imports = <ImportElement> [importElement];
     GatheringErrorListener errorListener = new GatheringErrorListener();
     Scope scope = new LibraryImportScope(definingLibrary, errorListener);
-    JUnitTestCase.assertEquals(importedType, scope.lookup3(importedTypeName, definingLibrary));
+    JUnitTestCase.assertEquals(importedType, scope.lookup(ASTFactory.identifier3(importedTypeName), definingLibrary));
   }
   void test_getDefiningLibrary() {
     LibraryElement definingLibrary = createTestLibrary();
@@ -4984,6 +8809,29 @@
     Scope scope = new LibraryImportScope(definingLibrary, errorListener);
     JUnitTestCase.assertEquals(errorListener, scope.errorListener);
   }
+  void test_prefixedAndNonPrefixed() {
+    AnalysisContext context = new AnalysisContextImpl();
+    String typeName = "C";
+    String prefixName = "p";
+    ClassElement prefixedType = ElementFactory.classElement2(typeName, []);
+    ClassElement nonPrefixedType = ElementFactory.classElement2(typeName, []);
+    LibraryElement prefixedLibrary = createTestLibrary2(context, "import.prefixed", []);
+    ((prefixedLibrary.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [prefixedType];
+    ImportElementImpl prefixedImport = ElementFactory.importFor(prefixedLibrary, ElementFactory.prefix(prefixName), []);
+    LibraryElement nonPrefixedLibrary = createTestLibrary2(context, "import.nonPrefixed", []);
+    ((nonPrefixedLibrary.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [nonPrefixedType];
+    ImportElementImpl nonPrefixedImport = ElementFactory.importFor(nonPrefixedLibrary, null, []);
+    LibraryElementImpl importingLibrary = createTestLibrary2(context, "importing", []);
+    importingLibrary.imports = <ImportElement> [prefixedImport, nonPrefixedImport];
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    Scope scope = new LibraryImportScope(importingLibrary, errorListener);
+    Element prefixedElement = scope.lookup(ASTFactory.identifier5(prefixName, typeName), importingLibrary);
+    errorListener.assertNoErrors();
+    JUnitTestCase.assertSame(prefixedType, prefixedElement);
+    Element nonPrefixedElement = scope.lookup(ASTFactory.identifier3(typeName), importingLibrary);
+    errorListener.assertNoErrors();
+    JUnitTestCase.assertSame(nonPrefixedType, nonPrefixedElement);
+  }
   static dartSuite() {
     _ut.group('LibraryImportScopeTest', () {
       _ut.test('test_conflictingImports', () {
@@ -5006,37 +8854,47 @@
         final __test = new LibraryImportScopeTest();
         runJUnitTest(__test, __test.test_getErrorListener);
       });
+      _ut.test('test_prefixedAndNonPrefixed', () {
+        final __test = new LibraryImportScopeTest();
+        runJUnitTest(__test, __test.test_prefixedAndNonPrefixed);
+      });
     });
   }
 }
+
 /**
  * Instances of the class {@code ResolutionVerifier} verify that all of the nodes in an AST
  * structure that should have been resolved were resolved.
  */
 class ResolutionVerifier extends RecursiveASTVisitor<Object> {
+
   /**
    * A set containing nodes that are known to not be resolvable and should therefore not cause the
    * test to fail.
    */
   Set<ASTNode> _knownExceptions;
+
   /**
    * A list containing all of the AST nodes that were not resolved.
    */
   List<ASTNode> _unresolvedNodes = new List<ASTNode>();
+
   /**
    * A list containing all of the AST nodes that were resolved to an element of the wrong type.
    */
   List<ASTNode> _wrongTypedNodes = new List<ASTNode>();
+
   /**
    * Initialize a newly created verifier to verify that all of the nodes in the visited AST
    * structures that are expected to have been resolved have an element associated with them.
    */
   ResolutionVerifier() {
-    _jtd_constructor_351_impl();
+    _jtd_constructor_359_impl();
   }
-  _jtd_constructor_351_impl() {
-    _jtd_constructor_352_impl(null);
+  _jtd_constructor_359_impl() {
+    _jtd_constructor_360_impl(null);
   }
+
   /**
    * Initialize a newly created verifier to verify that all of the identifiers in the visited AST
    * structures that are expected to have been resolved have an element associated with them. Nodes
@@ -5046,11 +8904,12 @@
    * therefore not cause the test to fail
    */
   ResolutionVerifier.con1(Set<ASTNode> knownExceptions2) {
-    _jtd_constructor_352_impl(knownExceptions2);
+    _jtd_constructor_360_impl(knownExceptions2);
   }
-  _jtd_constructor_352_impl(Set<ASTNode> knownExceptions2) {
+  _jtd_constructor_360_impl(Set<ASTNode> knownExceptions2) {
     this._knownExceptions = knownExceptions2;
   }
+
   /**
    * Assert that all of the visited identifiers were resolved.
    */
@@ -5192,7 +9051,7 @@
     definingLibrary.imports = <ImportElement> [importElement];
     GatheringErrorListener errorListener = new GatheringErrorListener();
     Scope scope = new LibraryScope(definingLibrary, errorListener);
-    JUnitTestCase.assertEquals(importedType, scope.lookup3(importedTypeName, definingLibrary));
+    JUnitTestCase.assertEquals(importedType, scope.lookup(ASTFactory.identifier3(importedTypeName), definingLibrary));
   }
   void test_getDefiningLibrary() {
     LibraryElement definingLibrary = createTestLibrary();
@@ -5228,14 +9087,22 @@
   }
 }
 class StaticTypeAnalyzerTest extends EngineTestCase {
+
   /**
    * The error listener to which errors will be reported.
    */
   GatheringErrorListener _listener;
+
+  /**
+   * The resolver visitor used to create the analyzer.
+   */
+  ResolverVisitor _visitor;
+
   /**
    * The analyzer being used to analyze the test cases.
    */
   StaticTypeAnalyzer _analyzer;
+
   /**
    * The type provider used to access the types.
    */
@@ -5279,7 +9146,9 @@
     InterfaceType numType2 = _typeProvider.numType;
     SimpleIdentifier identifier = resolvedVariable(_typeProvider.intType, "i");
     AssignmentExpression node = ASTFactory.assignmentExpression(identifier, TokenType.PLUS_EQ, resolvedInteger(1));
-    node.element = getMethod(numType2, "+");
+    MethodElement plusMethod = getMethod(numType2, "+");
+    node.staticElement = plusMethod;
+    node.element = plusMethod;
     JUnitTestCase.assertSame(numType2, analyze(node));
     _listener.assertNoErrors();
   }
@@ -5309,12 +9178,30 @@
     JUnitTestCase.assertSame(_typeProvider.boolType, analyze(node));
     _listener.assertNoErrors();
   }
-  void test_visitBinaryExpression_plus() {
-    BinaryExpression node = ASTFactory.binaryExpression(resolvedInteger(2), TokenType.PLUS, resolvedInteger(2));
-    node.element = getMethod(_typeProvider.numType, "+");
+  void test_visitBinaryExpression_plusID() {
+    BinaryExpression node = ASTFactory.binaryExpression(resolvedInteger(1), TokenType.PLUS, resolvedDouble(2.0));
+    setStaticElement(node, getMethod(_typeProvider.numType, "+"));
+    JUnitTestCase.assertSame(_typeProvider.doubleType, analyze(node));
+    _listener.assertNoErrors();
+  }
+  void test_visitBinaryExpression_plusII() {
+    BinaryExpression node = ASTFactory.binaryExpression(resolvedInteger(1), TokenType.PLUS, resolvedInteger(2));
+    setStaticElement(node, getMethod(_typeProvider.numType, "+"));
     JUnitTestCase.assertSame(_typeProvider.intType, analyze(node));
     _listener.assertNoErrors();
   }
+  void test_visitBinaryExpression_slash() {
+    BinaryExpression node = ASTFactory.binaryExpression(resolvedInteger(2), TokenType.SLASH, resolvedInteger(2));
+    setStaticElement(node, getMethod(_typeProvider.numType, "/"));
+    JUnitTestCase.assertSame(_typeProvider.doubleType, analyze(node));
+    _listener.assertNoErrors();
+  }
+  void test_visitBinaryExpression_starID() {
+    BinaryExpression node = ASTFactory.binaryExpression(resolvedInteger(1), TokenType.PLUS, resolvedDouble(2.0));
+    setStaticElement(node, getMethod(_typeProvider.numType, "*"));
+    JUnitTestCase.assertSame(_typeProvider.doubleType, analyze(node));
+    _listener.assertNoErrors();
+  }
   void test_visitBooleanLiteral_false() {
     Expression node = ASTFactory.booleanLiteral(false);
     JUnitTestCase.assertSame(_typeProvider.boolType, analyze(node));
@@ -5477,7 +9364,9 @@
     InterfaceType listType2 = _typeProvider.listType;
     SimpleIdentifier identifier = resolvedVariable(listType2, "a");
     IndexExpression node = ASTFactory.indexExpression(identifier, resolvedInteger(2));
-    node.element = listType2.element.methods[0];
+    MethodElement indexMethod = listType2.element.methods[0];
+    node.staticElement = indexMethod;
+    node.element = indexMethod;
     JUnitTestCase.assertSame(listType2.typeArguments[0], analyze(node));
     _listener.assertNoErrors();
   }
@@ -5485,7 +9374,9 @@
     InterfaceType listType2 = _typeProvider.listType;
     SimpleIdentifier identifier = resolvedVariable(listType2, "a");
     IndexExpression node = ASTFactory.indexExpression(identifier, resolvedInteger(2));
-    node.element = listType2.element.methods[1];
+    MethodElement indexMethod = listType2.element.methods[1];
+    node.staticElement = indexMethod;
+    node.element = indexMethod;
     ASTFactory.assignmentExpression(node, TokenType.EQ, ASTFactory.integer(0));
     JUnitTestCase.assertSame(listType2.typeArguments[0], analyze(node));
     _listener.assertNoErrors();
@@ -5498,7 +9389,9 @@
     InterfaceType listOfIntType = listType2.substitute5(<Type2> [intType2]);
     identifier.staticType = listOfIntType;
     IndexExpression indexExpression2 = ASTFactory.indexExpression(identifier, ASTFactory.integer(0));
-    indexExpression2.element = MethodMember.from(methodElement, listOfIntType);
+    MethodElement indexMethod = MethodMember.from(methodElement, listOfIntType);
+    indexExpression2.staticElement = indexMethod;
+    indexExpression2.element = indexMethod;
     JUnitTestCase.assertSame(intType2, analyze(indexExpression2));
     _listener.assertNoErrors();
   }
@@ -5510,7 +9403,9 @@
     InterfaceType listOfIntType = listType2.substitute5(<Type2> [intType2]);
     identifier.staticType = listOfIntType;
     IndexExpression indexExpression2 = ASTFactory.indexExpression(identifier, ASTFactory.integer(0));
-    indexExpression2.element = MethodMember.from(methodElement, listOfIntType);
+    MethodElement indexMethod = MethodMember.from(methodElement, listOfIntType);
+    indexExpression2.staticElement = indexMethod;
+    indexExpression2.element = indexMethod;
     ASTFactory.assignmentExpression(indexExpression2, TokenType.EQ, ASTFactory.integer(0));
     JUnitTestCase.assertSame(intType2, analyze(indexExpression2));
     _listener.assertNoErrors();
@@ -5518,7 +9413,7 @@
   void test_visitInstanceCreationExpression_named() {
     ClassElementImpl classElement = ElementFactory.classElement2("C", []);
     String constructorName = "m";
-    ConstructorElementImpl constructor = ElementFactory.constructorElement(constructorName);
+    ConstructorElementImpl constructor = ElementFactory.constructorElement(classElement, constructorName);
     FunctionTypeImpl constructorType = new FunctionTypeImpl.con1(constructor);
     constructorType.returnType = classElement.type;
     constructor.type = constructorType;
@@ -5531,7 +9426,7 @@
   void test_visitInstanceCreationExpression_typeParameters() {
     ClassElementImpl elementC = ElementFactory.classElement2("C", ["E"]);
     ClassElementImpl elementI = ElementFactory.classElement2("I", []);
-    ConstructorElementImpl constructor = ElementFactory.constructorElement(null);
+    ConstructorElementImpl constructor = ElementFactory.constructorElement(elementC, null);
     elementC.constructors = <ConstructorElement> [constructor];
     FunctionTypeImpl constructorType = new FunctionTypeImpl.con1(constructor);
     constructorType.returnType = elementC.type;
@@ -5548,7 +9443,7 @@
   }
   void test_visitInstanceCreationExpression_unnamed() {
     ClassElementImpl classElement = ElementFactory.classElement2("C", []);
-    ConstructorElementImpl constructor = ElementFactory.constructorElement(null);
+    ConstructorElementImpl constructor = ElementFactory.constructorElement(classElement, null);
     FunctionTypeImpl constructorType = new FunctionTypeImpl.con1(constructor);
     constructorType.returnType = classElement.type;
     constructor.type = constructorType;
@@ -5588,13 +9483,13 @@
   void test_visitMapLiteral_empty() {
     Expression node = ASTFactory.mapLiteral2([]);
     Type2 resultType = analyze(node);
-    assertType2(_typeProvider.mapType.substitute5(<Type2> [_typeProvider.stringType, _typeProvider.dynamicType]), resultType);
+    assertType2(_typeProvider.mapType.substitute5(<Type2> [_typeProvider.dynamicType, _typeProvider.dynamicType]), resultType);
     _listener.assertNoErrors();
   }
   void test_visitMapLiteral_nonEmpty() {
     Expression node = ASTFactory.mapLiteral2([ASTFactory.mapLiteralEntry("k", resolvedInteger(0))]);
     Type2 resultType = analyze(node);
-    assertType2(_typeProvider.mapType.substitute5(<Type2> [_typeProvider.stringType, _typeProvider.dynamicType]), resultType);
+    assertType2(_typeProvider.mapType.substitute5(<Type2> [_typeProvider.dynamicType, _typeProvider.dynamicType]), resultType);
     _listener.assertNoErrors();
   }
   void test_visitNamedExpression() {
@@ -5654,14 +9549,18 @@
   }
   void test_visitPrefixExpression_minus() {
     PrefixExpression node = ASTFactory.prefixExpression(TokenType.MINUS, resolvedInteger(0));
-    node.element = getMethod(_typeProvider.numType, "-");
+    MethodElement minusMethod = getMethod(_typeProvider.numType, "-");
+    node.staticElement = minusMethod;
+    node.element = minusMethod;
     JUnitTestCase.assertSame(_typeProvider.numType, analyze(node));
     _listener.assertNoErrors();
   }
   void test_visitPrefixExpression_minusMinus() {
     PrefixExpression node = ASTFactory.prefixExpression(TokenType.MINUS_MINUS, resolvedInteger(0));
-    node.element = getMethod(_typeProvider.numType, "-");
-    JUnitTestCase.assertSame(_typeProvider.numType, analyze(node));
+    MethodElement minusMethod = getMethod(_typeProvider.numType, "-");
+    node.staticElement = minusMethod;
+    node.element = minusMethod;
+    JUnitTestCase.assertSame(_typeProvider.intType, analyze(node));
     _listener.assertNoErrors();
   }
   void test_visitPrefixExpression_not() {
@@ -5671,13 +9570,17 @@
   }
   void test_visitPrefixExpression_plusPlus() {
     PrefixExpression node = ASTFactory.prefixExpression(TokenType.PLUS_PLUS, resolvedInteger(0));
-    node.element = getMethod(_typeProvider.numType, "+");
-    JUnitTestCase.assertSame(_typeProvider.numType, analyze(node));
+    MethodElement plusMethod = getMethod(_typeProvider.numType, "+");
+    node.staticElement = plusMethod;
+    node.element = plusMethod;
+    JUnitTestCase.assertSame(_typeProvider.intType, analyze(node));
     _listener.assertNoErrors();
   }
   void test_visitPrefixExpression_tilde() {
     PrefixExpression node = ASTFactory.prefixExpression(TokenType.TILDE, resolvedInteger(0));
-    node.element = getMethod(_typeProvider.intType, "~");
+    MethodElement tildeMethod = getMethod(_typeProvider.intType, "~");
+    node.staticElement = tildeMethod;
+    node.element = tildeMethod;
     JUnitTestCase.assertSame(_typeProvider.intType, analyze(node));
     _listener.assertNoErrors();
   }
@@ -5712,7 +9615,7 @@
     InterfaceType superType = ElementFactory.classElement2("A", []).type;
     InterfaceType thisType = ElementFactory.classElement("B", superType, []).type;
     Expression node = ASTFactory.superExpression();
-    JUnitTestCase.assertSame(superType, analyze2(node, thisType));
+    JUnitTestCase.assertSame(thisType, analyze2(node, thisType));
     _listener.assertNoErrors();
   }
   void test_visitThisExpression() {
@@ -5731,6 +9634,7 @@
     JUnitTestCase.assertSame(_typeProvider.bottomType, analyze(node));
     _listener.assertNoErrors();
   }
+
   /**
    * Return the type associated with the given expression after the static type analyzer has
    * computed a type for it.
@@ -5738,6 +9642,7 @@
    * @return the type associated with the expression
    */
   Type2 analyze(Expression node) => analyze2(node, null);
+
   /**
    * Return the type associated with the given expression after the static type analyzer has
    * computed a type for it.
@@ -5754,6 +9659,7 @@
     node.accept(_analyzer);
     return node.staticType;
   }
+
   /**
    * Return the type associated with the given parameter after the static type analyzer has computed
    * a type for it.
@@ -5764,6 +9670,7 @@
     node.accept(_analyzer);
     return ((node.identifier.element as ParameterElement)).type;
   }
+
   /**
    * Assert that the actual type is a function type with the expected characteristics.
    * @param expectedReturnType the expected return type of the function
@@ -5807,7 +9714,7 @@
     JUnitTestCase.assertSame(expectedReturnType, functionType.returnType);
   }
   void assertType(InterfaceTypeImpl expectedType, InterfaceTypeImpl actualType) {
-    JUnitTestCase.assertEquals(expectedType.name, actualType.name);
+    JUnitTestCase.assertEquals(expectedType.displayName, actualType.displayName);
     JUnitTestCase.assertEquals(expectedType.element, actualType.element);
     List<Type2> expectedArguments = expectedType.typeArguments;
     int length2 = expectedArguments.length;
@@ -5823,6 +9730,7 @@
       assertType((expectedType as InterfaceTypeImpl), (actualType as InterfaceTypeImpl));
     }
   }
+
   /**
    * Create the analyzer used by the tests.
    * @return the analyzer to be used by the tests
@@ -5838,14 +9746,15 @@
     definingLibrary.definingCompilationUnit = definingCompilationUnit;
     Library library = new Library(context, _listener, source);
     library.libraryElement = definingLibrary;
-    ResolverVisitor visitor = new ResolverVisitor.con1(library, source, _typeProvider);
-    visitor.overrideManager.enterScope();
+    _visitor = new ResolverVisitor.con1(library, source, _typeProvider);
+    _visitor.overrideManager.enterScope();
     try {
-      return visitor.typeAnalyzer_J2DAccessor as StaticTypeAnalyzer;
+      return _visitor.typeAnalyzer_J2DAccessor as StaticTypeAnalyzer;
     } catch (exception) {
       throw new IllegalArgumentException("Could not create analyzer", exception);
     }
   }
+
   /**
    * Return an integer literal that has been resolved to the correct type.
    * @param value the value of the literal
@@ -5856,6 +9765,7 @@
     literal.staticType = _typeProvider.doubleType;
     return literal;
   }
+
   /**
    * Create a function expression that has an element associated with it, where the element has an
    * incomplete type associated with it (just like the one{@link ElementBuilder#visitFunctionExpression(FunctionExpression)} would have built if we had
@@ -5877,6 +9787,7 @@
     node.element = element;
     return node;
   }
+
   /**
    * Return an integer literal that has been resolved to the correct type.
    * @param value the value of the literal
@@ -5887,6 +9798,7 @@
     literal.staticType = _typeProvider.intType;
     return literal;
   }
+
   /**
    * Return a string literal that has been resolved to the correct type.
    * @param value the value of the literal
@@ -5897,6 +9809,7 @@
     string.staticType = _typeProvider.stringType;
     return string;
   }
+
   /**
    * Return a simple identifier that has been resolved to a variable element with the given type.
    * @param type the type of the variable being represented
@@ -5911,6 +9824,15 @@
     identifier.staticType = type2;
     return identifier;
   }
+
+  /**
+   * Sets the element for the node and remembers it as the static resolution.
+   */
+  void setStaticElement(BinaryExpression node, MethodElement element2) {
+    node.staticElement = element2;
+    node.element = element2;
+  }
+
   /**
    * Set the type of the given parameter to the given type.
    * @param parameter the parameter whose type is to be set
@@ -5963,9 +9885,21 @@
         final __test = new StaticTypeAnalyzerTest();
         runJUnitTest(__test, __test.test_visitBinaryExpression_notEquals);
       });
-      _ut.test('test_visitBinaryExpression_plus', () {
+      _ut.test('test_visitBinaryExpression_plusID', () {
         final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitBinaryExpression_plus);
+        runJUnitTest(__test, __test.test_visitBinaryExpression_plusID);
+      });
+      _ut.test('test_visitBinaryExpression_plusII', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitBinaryExpression_plusII);
+      });
+      _ut.test('test_visitBinaryExpression_slash', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitBinaryExpression_slash);
+      });
+      _ut.test('test_visitBinaryExpression_starID', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitBinaryExpression_starID);
       });
       _ut.test('test_visitBooleanLiteral_false', () {
         final __test = new StaticTypeAnalyzerTest();
@@ -6182,7 +10116,7 @@
   void test_define_duplicate() {
     LibraryElement definingLibrary2 = createTestLibrary();
     GatheringErrorListener errorListener2 = new GatheringErrorListener();
-    Scope rootScope = new Scope_16(definingLibrary2, errorListener2);
+    Scope rootScope = new Scope_17(definingLibrary2, errorListener2);
     EnclosedScope scope = new EnclosedScope(rootScope);
     VariableElement element1 = ElementFactory.localVariableElement(ASTFactory.identifier3("v1"));
     VariableElement element2 = ElementFactory.localVariableElement(ASTFactory.identifier3("v1"));
@@ -6193,7 +10127,7 @@
   void test_define_normal() {
     LibraryElement definingLibrary3 = createTestLibrary();
     GatheringErrorListener errorListener3 = new GatheringErrorListener();
-    Scope rootScope = new Scope_17(definingLibrary3, errorListener3);
+    Scope rootScope = new Scope_18(definingLibrary3, errorListener3);
     EnclosedScope outerScope = new EnclosedScope(rootScope);
     EnclosedScope innerScope = new EnclosedScope(outerScope);
     VariableElement element1 = ElementFactory.localVariableElement(ASTFactory.identifier3("v1"));
@@ -6215,23 +10149,24 @@
     });
   }
 }
-class Scope_16 extends Scope {
+class Scope_17 extends Scope {
   LibraryElement definingLibrary2;
   GatheringErrorListener errorListener2;
-  Scope_16(this.definingLibrary2, this.errorListener2) : super();
+  Scope_17(this.definingLibrary2, this.errorListener2) : super();
   LibraryElement get definingLibrary => definingLibrary2;
   AnalysisErrorListener get errorListener => errorListener2;
-  Element lookup3(String name, LibraryElement referencingLibrary) => null;
+  Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) => null;
 }
-class Scope_17 extends Scope {
+class Scope_18 extends Scope {
   LibraryElement definingLibrary3;
   GatheringErrorListener errorListener3;
-  Scope_17(this.definingLibrary3, this.errorListener3) : super();
+  Scope_18(this.definingLibrary3, this.errorListener3) : super();
   LibraryElement get definingLibrary => definingLibrary3;
   AnalysisErrorListener get errorListener => errorListener3;
-  Element lookup3(String name, LibraryElement referencingLibrary) => null;
+  Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) => null;
 }
 class LibraryElementBuilderTest extends EngineTestCase {
+
   /**
    * The source factory used to create {@link Source sources}.
    */
@@ -6239,6 +10174,20 @@
   void setUp() {
     _sourceFactory = new SourceFactory.con2([new FileUriResolver()]);
   }
+  void test_accessorsAcrossFiles() {
+    Source librarySource = addSource("/lib.dart", EngineTestCase.createSource(["library lib;", "part 'first.dart';", "part 'second.dart';"]));
+    addSource("/first.dart", EngineTestCase.createSource(["part of lib;", "int get V => 0;"]));
+    addSource("/second.dart", EngineTestCase.createSource(["part of lib;", "void set V(int v) {}"]));
+    LibraryElement element = buildLibrary(librarySource, []);
+    JUnitTestCase.assertNotNull(element);
+    List<CompilationUnitElement> sourcedUnits = element.parts;
+    EngineTestCase.assertLength(2, sourcedUnits);
+    List<PropertyAccessorElement> firstAccessors = sourcedUnits[0].accessors;
+    EngineTestCase.assertLength(1, firstAccessors);
+    List<PropertyAccessorElement> secondAccessors = sourcedUnits[1].accessors;
+    EngineTestCase.assertLength(1, secondAccessors);
+    JUnitTestCase.assertSame(firstAccessors[0].variable, secondAccessors[0].variable);
+  }
   void test_empty() {
     Source librarySource = addSource("/lib.dart", "library lib;");
     LibraryElement element = buildLibrary(librarySource, []);
@@ -6300,6 +10249,7 @@
     JUnitTestCase.assertNotNull(element);
     assertTypes(element.definingCompilationUnit, ["A"]);
   }
+
   /**
    * Add a source file to the content provider. The file path should be absolute.
    * @param filePath the path of the file being added
@@ -6311,6 +10261,7 @@
     _sourceFactory.setContents(source, contents);
     return source;
   }
+
   /**
    * Ensure that there are elements representing all of the types in the given array of type names.
    * @param unit the compilation unit containing the types
@@ -6322,7 +10273,7 @@
     EngineTestCase.assertLength(typeNames.length, types2);
     for (ClassElement type in types2) {
       JUnitTestCase.assertNotNull(type);
-      String actualTypeName = type.name;
+      String actualTypeName = type.displayName;
       bool wasExpected = false;
       for (String expectedTypeName in typeNames) {
         if (expectedTypeName == actualTypeName) {
@@ -6334,6 +10285,7 @@
       }
     }
   }
+
   /**
    * Build the element model for the library whose defining compilation unit has the given source.
    * @param librarySource the source of the defining compilation unit for the library
@@ -6345,16 +10297,21 @@
   LibraryElement buildLibrary(Source librarySource, List<ErrorCode> expectedErrorCodes) {
     AnalysisContextImpl context = new AnalysisContextImpl();
     context.sourceFactory = new SourceFactory.con2([new DartUriResolver(DirectoryBasedDartSdk.defaultSdk), new FileUriResolver()]);
-    GatheringErrorListener listener = new GatheringErrorListener();
-    LibraryResolver resolver = new LibraryResolver.con2(context, listener);
+    LibraryResolver resolver = new LibraryResolver(context);
     LibraryElementBuilder builder = new LibraryElementBuilder(resolver);
     Library library = resolver.createLibrary(librarySource) as Library;
     LibraryElement element = builder.buildLibrary(library);
+    GatheringErrorListener listener = new GatheringErrorListener();
+    listener.addAll(resolver.errorListener);
     listener.assertErrors2(expectedErrorCodes);
     return element;
   }
   static dartSuite() {
     _ut.group('LibraryElementBuilderTest', () {
+      _ut.test('test_accessorsAcrossFiles', () {
+        final __test = new LibraryElementBuilderTest();
+        runJUnitTest(__test, __test.test_accessorsAcrossFiles);
+      });
       _ut.test('test_empty', () {
         final __test = new LibraryElementBuilderTest();
         runJUnitTest(__test, __test.test_empty);
@@ -6449,14 +10406,17 @@
     });
   }
 }
+
 /**
  * A non-abstract subclass that can be used for testing purposes.
  */
 class ScopeTest_TestScope extends Scope {
+
   /**
    * 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.
    */
@@ -6467,115 +10427,170 @@
   }
   LibraryElement get definingLibrary => _definingLibrary;
   AnalysisErrorListener get errorListener => _errorListener;
-  Element lookup3(String name, LibraryElement referencingLibrary) => localLookup(name, referencingLibrary);
+  Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) => localLookup(name, referencingLibrary);
 }
 class SimpleResolverTest extends ResolverTestCase {
   void fail_staticInvocation() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  static int get g => (a,b) => 0;", "}", "class B {", "  f() {", "    A.g(1,0);", "  }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
+  void test_argumentResolution_required_matching() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  void f() {", "    g(1, 2, 3);", "  }", "  void g(a, b, c) {}", "}"]));
+    validateArgumentResolution(source, [0, 1, 2]);
+  }
+  void test_argumentResolution_required_tooFew() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  void f() {", "    g(1, 2);", "  }", "  void g(a, b, c) {}", "}"]));
+    validateArgumentResolution(source, [0, 1]);
+  }
+  void test_argumentResolution_required_tooMany() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  void f() {", "    g(1, 2, 3);", "  }", "  void g(a, b) {}", "}"]));
+    validateArgumentResolution(source, [0, 1, -1]);
+  }
+  void test_argumentResolution_requiredAndNamed_extra() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  void f() {", "    g(1, 2, c: 3, d: 4);", "  }", "  void g(a, b, {c}) {}", "}"]));
+    validateArgumentResolution(source, [0, 1, 2, -1]);
+  }
+  void test_argumentResolution_requiredAndNamed_matching() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  void f() {", "    g(1, 2, c: 3);", "  }", "  void g(a, b, {c}) {}", "}"]));
+    validateArgumentResolution(source, [0, 1, 2]);
+  }
+  void test_argumentResolution_requiredAndNamed_missing() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  void f() {", "    g(1, 2, d: 3);", "  }", "  void g(a, b, {c, d}) {}", "}"]));
+    validateArgumentResolution(source, [0, 1, 3]);
+  }
+  void test_argumentResolution_requiredAndPositional_fewer() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  void f() {", "    g(1, 2, 3);", "  }", "  void g(a, b, [c, d]) {}", "}"]));
+    validateArgumentResolution(source, [0, 1, 2]);
+  }
+  void test_argumentResolution_requiredAndPositional_matching() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  void f() {", "    g(1, 2, 3, 4);", "  }", "  void g(a, b, [c, d]) {}", "}"]));
+    validateArgumentResolution(source, [0, 1, 2, 3]);
+  }
+  void test_argumentResolution_requiredAndPositional_more() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  void f() {", "    g(1, 2, 3, 4);", "  }", "  void g(a, b, [c]) {}", "}"]));
+    validateArgumentResolution(source, [0, 1, 2, -1]);
+  }
   void test_class_definesCall() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int call(int x) { return x; }", "}", "int f(A a) {", "  return a(0);", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_class_extends_implements() {
     Source source = addSource(EngineTestCase.createSource(["class A extends B implements C {}", "class B {}", "class C {}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_commentReference_class() {
     Source source = addSource(EngineTestCase.createSource(["f() {}", "/** [A] [new A] [A.n] [new A.n] [m] [f] */", "class A {", "  A() {}", "  A.n() {}", "  m() {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_commentReference_parameter() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "  A.n() {}", "  /** [e] [f] */", "  m(e, f()) {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_commentReference_singleLine() {
     Source source = addSource(EngineTestCase.createSource(["/// [A]", "class A {}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_empty() {
     Source source = addSource("");
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_extractedMethodAsConstant() {
     Source source = addSource(EngineTestCase.createSource(["abstract class Comparable<T> {", "  int compareTo(T other);", "  static int compare(Comparable a, Comparable b) => a.compareTo(b);", "}", "class A {", "  void sort([compare = Comparable.compare]) {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_fieldFormalParameter() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A(this.x) {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_forEachLoops_nonConflicting() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  List list = [1,2,3];", "  for (int x in list) {}", "  for (int x in list) {}", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_forLoops_nonConflicting() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  for (int i = 0; i < 3; i++) {", "  }", "  for (int i = 0; i < 3; i++) {", "  }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_functionTypeAlias() {
     Source source = addSource(EngineTestCase.createSource(["typedef bool P(e);", "class A {", "  P p;", "  m(e) {", "    if (p(e)) {}", "  }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_getterAndSetterWithDifferentTypes() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int get f => 0;", "  void set f(String s) {}", "}", "g (A a) {", "  a.f = a.f.toString();", "}"]));
-    resolve(source, []);
+    resolve(source);
+    assertErrors([StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES]);
+    verify([source]);
+  }
+  void test_hasReferenceToSuper() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B {toString() => super.toString();}"]));
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    JUnitTestCase.assertNotNull(unit);
+    List<ClassElement> classes = unit.types;
+    EngineTestCase.assertLength(2, classes);
+    JUnitTestCase.assertFalse(classes[0].hasReferenceToSuper());
+    JUnitTestCase.assertTrue(classes[1].hasReferenceToSuper());
     assertNoErrors();
     verify([source]);
   }
   void test_importWithPrefix() {
     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, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_indexExpression_typeParameters() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  List<int> a;", "  a[0];", "  List<List<int>> b;", "  b[0][0];", "  List<List<List<int>>> c;", "  c[0][0][0];", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_indexExpression_typeParameters_invalidAssignmentWarning() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  List<List<int>> b;", "  b[0][0] = 'hi';", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertErrors([StaticTypeWarningCode.INVALID_ASSIGNMENT]);
     verify([source]);
   }
+  void test_indirectOperatorThroughCall() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  B call() { return new B(); }", "}", "", "class B {", "  int operator [](int i) { return i; }", "}", "", "A f = new A();", "", "g(int x) {}", "", "main() {", "  g(f()[0]);", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
   void test_invoke_dynamicThroughGetter() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  List get X => [() => 0];", "  m(A a) {", "    X.last;", "  }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_isValidMixin_badSuperclass() {
     Source source = addSource(EngineTestCase.createSource(["class A extends B {}", "class B {}"]));
-    LibraryElement library = resolve(source, []);
+    LibraryElement library = resolve(source);
     JUnitTestCase.assertNotNull(library);
     CompilationUnitElement unit = library.definingCompilationUnit;
     JUnitTestCase.assertNotNull(unit);
@@ -6587,7 +10602,7 @@
   }
   void test_isValidMixin_constructor() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "}"]));
-    LibraryElement library = resolve(source, []);
+    LibraryElement library = resolve(source);
     JUnitTestCase.assertNotNull(library);
     CompilationUnitElement unit = library.definingCompilationUnit;
     JUnitTestCase.assertNotNull(unit);
@@ -6599,7 +10614,7 @@
   }
   void test_isValidMixin_super() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  toString() {", "    return super.toString();", "  }", "}"]));
-    LibraryElement library = resolve(source, []);
+    LibraryElement library = resolve(source);
     JUnitTestCase.assertNotNull(library);
     CompilationUnitElement unit = library.definingCompilationUnit;
     JUnitTestCase.assertNotNull(unit);
@@ -6611,7 +10626,7 @@
   }
   void test_isValidMixin_valid() {
     Source source = addSource(EngineTestCase.createSource(["class A {}"]));
-    LibraryElement library = resolve(source, []);
+    LibraryElement library = resolve(source);
     JUnitTestCase.assertNotNull(library);
     CompilationUnitElement unit = library.definingCompilationUnit;
     JUnitTestCase.assertNotNull(unit);
@@ -6621,32 +10636,190 @@
     assertNoErrors();
     verify([source]);
   }
+  void test_labels_switch() {
+    Source source = addSource(EngineTestCase.createSource(["void doSwitch(int target) {", "  switch (target) {", "    l0: case 0:", "      continue l1;", "    l1: case 1:", "      continue l0;", "    default:", "      continue l1;", "  }", "}"]));
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_metadata_class() {
+    Source source = addSource(EngineTestCase.createSource(["const A = null;", "@A class C {}"]));
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    JUnitTestCase.assertNotNull(unit);
+    List<ClassElement> classes = unit.types;
+    EngineTestCase.assertLength(1, classes);
+    List<Annotation> annotations = classes[0].metadata;
+    EngineTestCase.assertLength(1, annotations);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_metadata_field() {
+    Source source = addSource(EngineTestCase.createSource(["const A = null;", "class C {", "  @A int f;", "}"]));
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    JUnitTestCase.assertNotNull(unit);
+    List<ClassElement> classes = unit.types;
+    EngineTestCase.assertLength(1, classes);
+    FieldElement field = classes[0].fields[0];
+    List<Annotation> annotations = field.metadata;
+    EngineTestCase.assertLength(1, annotations);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_metadata_libraryDirective() {
+    Source source = addSource(EngineTestCase.createSource(["@A library lib;", "const A = null;"]));
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    List<Annotation> annotations = library.metadata;
+    EngineTestCase.assertLength(1, annotations);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_metadata_method() {
+    Source source = addSource(EngineTestCase.createSource(["const A = null;", "class C {", "  @A void m() {}", "}"]));
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    JUnitTestCase.assertNotNull(unit);
+    List<ClassElement> classes = unit.types;
+    EngineTestCase.assertLength(1, classes);
+    MethodElement method = classes[0].methods[0];
+    List<Annotation> annotations = method.metadata;
+    EngineTestCase.assertLength(1, annotations);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_method_fromMixin() {
+    Source source = addSource(EngineTestCase.createSource(["class B {", "  bar() => 1;", "}", "class A {", "  foo() => 2;", "}", "", "class C extends B with A {", "  bar() => super.bar();", "  foo() => super.foo();", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
   void test_method_fromSuperclassMixin() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  void m1() {}", "}", "class B with A {", "}", "class C extends B {", "}", "f(C c) {", "  c.m1()", "}"]));
-    resolve(source, []);
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  void m1() {}", "}", "class B extends Object with A {", "}", "class C extends B {", "}", "f(C c) {", "  c.m1();", "}"]));
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_methodCascades() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  void m1() {}", "  void m2() {}", "  void m() {", "    A a = new A();", "    a..m1()", "     ..m2();", "  }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_methodCascades_withSetter() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  String name;", "  void m1() {}", "  void m2() {}", "  void m() {", "    A a = new A();", "    a..m1()", "     ..name = 'name'", "     ..m2();", "  }", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_resolveAgainstNull() {
     Source source = addSource(EngineTestCase.createSource(["f(var p) {", "  return null == p;", "}"]));
-    resolve(source, []);
+    resolve(source);
     assertNoErrors();
     verify([source]);
   }
+  void test_setter_inherited() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int get x => 0;", "  set x(int p) {}", "}", "class B extends A {", "  int get x => super.x == null ? 0 : super.x;", "  void f() => x = 1;", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_setter_static() {
+    Source source = addSource(EngineTestCase.createSource(["set s(x) {", "}", "", "main() {", "  s = 123;", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+
+  /**
+   * Resolve the given source and verify that the arguments in a specific method invocation were
+   * correctly resolved.
+   * <p>
+   * The source is expected to be source for a compilation unit, the first declaration is expected
+   * to be a class, the first member of which is expected to be a method with a block body, and the
+   * first statement in the body is expected to be an expression statement whose expression is a
+   * method invocation. It is the arguments to that method invocation that are tested. The method
+   * invocation can contain errors.
+   * <p>
+   * The arguments were resolved correctly if the number of expressions in the list matches the
+   * length of the array of indices and if, for each index in the array of indices, the parameter to
+   * which the argument expression was resolved is the parameter in the invoked method's list of
+   * parameters at that index. Arguments that should not be resolved to a parameter because of an
+   * error can be denoted by including a negative index in the array of indices.
+   * @param source the source to be resolved
+   * @param indices the array of indices used to associate arguments with parameters
+   * @throws Exception if the source could not be resolved or if the structure of the source is not
+   * valid
+   */
+  void validateArgumentResolution(Source source, List<int> indices) {
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    ClassElement classElement = library.definingCompilationUnit.types[0];
+    List<ParameterElement> parameters2 = classElement.methods[1].parameters;
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    JUnitTestCase.assertNotNull(unit);
+    ClassDeclaration classDeclaration = unit.declarations[0] as ClassDeclaration;
+    MethodDeclaration methodDeclaration = (classDeclaration.members[0] as MethodDeclaration);
+    Block block2 = ((methodDeclaration.body as BlockFunctionBody)).block;
+    ExpressionStatement statement = block2.statements[0] as ExpressionStatement;
+    MethodInvocation invocation = statement.expression as MethodInvocation;
+    NodeList<Expression> arguments2 = invocation.argumentList.arguments;
+    int argumentCount = arguments2.length;
+    JUnitTestCase.assertEquals(indices.length, argumentCount);
+    for (int i = 0; i < argumentCount; i++) {
+      Expression argument = arguments2[i];
+      ParameterElement element = argument.parameterElement;
+      int index = indices[i];
+      if (index < 0) {
+        JUnitTestCase.assertNull(element);
+      } else {
+        JUnitTestCase.assertSame(parameters2[index], element);
+      }
+    }
+  }
   static dartSuite() {
     _ut.group('SimpleResolverTest', () {
+      _ut.test('test_argumentResolution_requiredAndNamed_extra', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_argumentResolution_requiredAndNamed_extra);
+      });
+      _ut.test('test_argumentResolution_requiredAndNamed_matching', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_argumentResolution_requiredAndNamed_matching);
+      });
+      _ut.test('test_argumentResolution_requiredAndNamed_missing', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_argumentResolution_requiredAndNamed_missing);
+      });
+      _ut.test('test_argumentResolution_requiredAndPositional_fewer', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_argumentResolution_requiredAndPositional_fewer);
+      });
+      _ut.test('test_argumentResolution_requiredAndPositional_matching', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_argumentResolution_requiredAndPositional_matching);
+      });
+      _ut.test('test_argumentResolution_requiredAndPositional_more', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_argumentResolution_requiredAndPositional_more);
+      });
+      _ut.test('test_argumentResolution_required_matching', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_argumentResolution_required_matching);
+      });
+      _ut.test('test_argumentResolution_required_tooFew', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_argumentResolution_required_tooFew);
+      });
+      _ut.test('test_argumentResolution_required_tooMany', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_argumentResolution_required_tooMany);
+      });
       _ut.test('test_class_definesCall', () {
         final __test = new SimpleResolverTest();
         runJUnitTest(__test, __test.test_class_definesCall);
@@ -6695,6 +10868,10 @@
         final __test = new SimpleResolverTest();
         runJUnitTest(__test, __test.test_getterAndSetterWithDifferentTypes);
       });
+      _ut.test('test_hasReferenceToSuper', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_hasReferenceToSuper);
+      });
       _ut.test('test_importWithPrefix', () {
         final __test = new SimpleResolverTest();
         runJUnitTest(__test, __test.test_importWithPrefix);
@@ -6707,6 +10884,10 @@
         final __test = new SimpleResolverTest();
         runJUnitTest(__test, __test.test_indexExpression_typeParameters_invalidAssignmentWarning);
       });
+      _ut.test('test_indirectOperatorThroughCall', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_indirectOperatorThroughCall);
+      });
       _ut.test('test_invoke_dynamicThroughGetter', () {
         final __test = new SimpleResolverTest();
         runJUnitTest(__test, __test.test_invoke_dynamicThroughGetter);
@@ -6727,6 +10908,26 @@
         final __test = new SimpleResolverTest();
         runJUnitTest(__test, __test.test_isValidMixin_valid);
       });
+      _ut.test('test_labels_switch', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_labels_switch);
+      });
+      _ut.test('test_metadata_class', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_metadata_class);
+      });
+      _ut.test('test_metadata_field', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_metadata_field);
+      });
+      _ut.test('test_metadata_libraryDirective', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_metadata_libraryDirective);
+      });
+      _ut.test('test_metadata_method', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_metadata_method);
+      });
       _ut.test('test_methodCascades', () {
         final __test = new SimpleResolverTest();
         runJUnitTest(__test, __test.test_methodCascades);
@@ -6735,6 +10936,10 @@
         final __test = new SimpleResolverTest();
         runJUnitTest(__test, __test.test_methodCascades_withSetter);
       });
+      _ut.test('test_method_fromMixin', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_method_fromMixin);
+      });
       _ut.test('test_method_fromSuperclassMixin', () {
         final __test = new SimpleResolverTest();
         runJUnitTest(__test, __test.test_method_fromSuperclassMixin);
@@ -6743,11 +10948,20 @@
         final __test = new SimpleResolverTest();
         runJUnitTest(__test, __test.test_resolveAgainstNull);
       });
+      _ut.test('test_setter_inherited', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_setter_inherited);
+      });
+      _ut.test('test_setter_static', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_setter_static);
+      });
     });
   }
 }
 main() {
 //  ElementResolverTest.dartSuite();
+//  InheritanceManagerTest.dartSuite();
 //  LibraryElementBuilderTest.dartSuite();
 //  LibraryTest.dartSuite();
 //  StaticTypeAnalyzerTest.dartSuite();
@@ -6765,4 +10979,4 @@
 //  StaticTypeWarningCodeTest.dartSuite();
 //  StaticWarningCodeTest.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 5ea98f7..5ac3673 100644
--- a/pkg/analyzer_experimental/test/generated/scanner_test.dart
+++ b/pkg/analyzer_experimental/test/generated/scanner_test.dart
@@ -131,6 +131,7 @@
     });
   }
 }
+
 /**
  * The class {@code TokenFactory} defines utility methods that can be used to create tokens.
  */
@@ -139,11 +140,6 @@
   static Token token2(String lexeme) => new StringToken(TokenType.STRING, lexeme, 0);
   static Token token3(TokenType type) => new Token(type, 0);
   static Token token4(TokenType type, String lexeme) => new StringToken(type, lexeme, 0);
-  /**
-   * Prevent the creation of instances of this class.
-   */
-  TokenFactory() {
-  }
 }
 class CharBufferScannerTest extends AbstractScannerTest {
   Token scan(String source, GatheringErrorListener listener) {
@@ -555,9 +551,17 @@
         final __test = new CharBufferScannerTest();
         runJUnitTest(__test, __test.test_keyword_with);
       });
-      _ut.test('test_lineInfo', () {
+      _ut.test('test_lineInfo_multilineComment', () {
         final __test = new CharBufferScannerTest();
-        runJUnitTest(__test, __test.test_lineInfo);
+        runJUnitTest(__test, __test.test_lineInfo_multilineComment);
+      });
+      _ut.test('test_lineInfo_simpleClass', () {
+        final __test = new CharBufferScannerTest();
+        runJUnitTest(__test, __test.test_lineInfo_simpleClass);
+      });
+      _ut.test('test_lineInfo_slashN', () {
+        final __test = new CharBufferScannerTest();
+        runJUnitTest(__test, __test.test_lineInfo_slashN);
       });
       _ut.test('test_lt', () {
         final __test = new CharBufferScannerTest();
@@ -739,6 +743,10 @@
         final __test = new CharBufferScannerTest();
         runJUnitTest(__test, __test.test_string_simple_escapedDollar);
       });
+      _ut.test('test_string_simple_interpolation_adjacentIdentifiers', () {
+        final __test = new CharBufferScannerTest();
+        runJUnitTest(__test, __test.test_string_simple_interpolation_adjacentIdentifiers);
+      });
       _ut.test('test_string_simple_interpolation_block', () {
         final __test = new CharBufferScannerTest();
         runJUnitTest(__test, __test.test_string_simple_interpolation_block);
@@ -755,6 +763,14 @@
         final __test = new CharBufferScannerTest();
         runJUnitTest(__test, __test.test_string_simple_interpolation_identifier);
       });
+      _ut.test('test_string_simple_interpolation_missingIdentifier', () {
+        final __test = new CharBufferScannerTest();
+        runJUnitTest(__test, __test.test_string_simple_interpolation_missingIdentifier);
+      });
+      _ut.test('test_string_simple_interpolation_nonIdentifier', () {
+        final __test = new CharBufferScannerTest();
+        runJUnitTest(__test, __test.test_string_simple_interpolation_nonIdentifier);
+      });
       _ut.test('test_string_simple_single', () {
         final __test = new CharBufferScannerTest();
         runJUnitTest(__test, __test.test_string_simple_single);
@@ -1206,9 +1222,17 @@
         final __test = new StringScannerTest();
         runJUnitTest(__test, __test.test_keyword_with);
       });
-      _ut.test('test_lineInfo', () {
+      _ut.test('test_lineInfo_multilineComment', () {
         final __test = new StringScannerTest();
-        runJUnitTest(__test, __test.test_lineInfo);
+        runJUnitTest(__test, __test.test_lineInfo_multilineComment);
+      });
+      _ut.test('test_lineInfo_simpleClass', () {
+        final __test = new StringScannerTest();
+        runJUnitTest(__test, __test.test_lineInfo_simpleClass);
+      });
+      _ut.test('test_lineInfo_slashN', () {
+        final __test = new StringScannerTest();
+        runJUnitTest(__test, __test.test_lineInfo_slashN);
       });
       _ut.test('test_lt', () {
         final __test = new StringScannerTest();
@@ -1394,6 +1418,10 @@
         final __test = new StringScannerTest();
         runJUnitTest(__test, __test.test_string_simple_escapedDollar);
       });
+      _ut.test('test_string_simple_interpolation_adjacentIdentifiers', () {
+        final __test = new StringScannerTest();
+        runJUnitTest(__test, __test.test_string_simple_interpolation_adjacentIdentifiers);
+      });
       _ut.test('test_string_simple_interpolation_block', () {
         final __test = new StringScannerTest();
         runJUnitTest(__test, __test.test_string_simple_interpolation_block);
@@ -1410,6 +1438,14 @@
         final __test = new StringScannerTest();
         runJUnitTest(__test, __test.test_string_simple_interpolation_identifier);
       });
+      _ut.test('test_string_simple_interpolation_missingIdentifier', () {
+        final __test = new StringScannerTest();
+        runJUnitTest(__test, __test.test_string_simple_interpolation_missingIdentifier);
+      });
+      _ut.test('test_string_simple_interpolation_nonIdentifier', () {
+        final __test = new StringScannerTest();
+        runJUnitTest(__test, __test.test_string_simple_interpolation_nonIdentifier);
+      });
       _ut.test('test_string_simple_single', () {
         final __test = new StringScannerTest();
         runJUnitTest(__test, __test.test_string_simple_single);
@@ -1441,11 +1477,13 @@
     });
   }
 }
+
 /**
  * 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
@@ -1802,15 +1840,17 @@
   void test_keyword_with() {
     assertKeywordToken("with");
   }
-  void test_lineInfo() {
+  void test_lineInfo_multilineComment() {
     String source = "/*\r *\r */";
-    GatheringErrorListener listener = new GatheringErrorListener();
-    Token token = scan(source, listener);
-    JUnitTestCase.assertSame(TokenType.MULTI_LINE_COMMENT, token.precedingComments.type);
-    listener.assertNoErrors();
-    LineInfo info = listener.getLineInfo(new TestSource());
-    JUnitTestCase.assertNotNull(info);
-    JUnitTestCase.assertEquals(3, info.getLocation(source.length - 1).lineNumber);
+    assertLineInfo(source, [new AbstractScannerTest_ExpectedLocation(0, 1, 1), new AbstractScannerTest_ExpectedLocation(4, 2, 2), new AbstractScannerTest_ExpectedLocation(source.length - 1, 3, 3)]);
+  }
+  void test_lineInfo_simpleClass() {
+    String source = "class Test {\r\n    String s = '...';\r\n    int get x => s.MISSING_GETTER;\r\n}";
+    assertLineInfo(source, [new AbstractScannerTest_ExpectedLocation(0, 1, 1), new AbstractScannerTest_ExpectedLocation(source.indexOf("MISSING_GETTER"), 3, 20), new AbstractScannerTest_ExpectedLocation(source.length - 1, 4, 1)]);
+  }
+  void test_lineInfo_slashN() {
+    String source = "class Test {\n}";
+    assertLineInfo(source, [new AbstractScannerTest_ExpectedLocation(0, 1, 1), new AbstractScannerTest_ExpectedLocation(source.indexOf("}"), 2, 1)]);
   }
   void test_lt() {
     assertToken(TokenType.LT, "<");
@@ -1953,6 +1993,9 @@
   void test_string_simple_escapedDollar() {
     assertToken(TokenType.STRING, "'a\\\$b'");
   }
+  void test_string_simple_interpolation_adjacentIdentifiers() {
+    assertTokens("'\$a\$b'", [new StringToken(TokenType.STRING, "'", 0), new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 1), new StringToken(TokenType.IDENTIFIER, "a", 2), new StringToken(TokenType.STRING, "", 3), new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 3), new StringToken(TokenType.IDENTIFIER, "b", 4), new StringToken(TokenType.STRING, "'", 5)]);
+  }
   void test_string_simple_interpolation_block() {
     assertTokens("'Hello \${name}!'", [new StringToken(TokenType.STRING, "'Hello ", 0), new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 7), new StringToken(TokenType.IDENTIFIER, "name", 9), new Token(TokenType.CLOSE_CURLY_BRACKET, 13), new StringToken(TokenType.STRING, "!'", 14)]);
   }
@@ -1965,6 +2008,12 @@
   void test_string_simple_interpolation_identifier() {
     assertTokens("'Hello \$name!'", [new StringToken(TokenType.STRING, "'Hello ", 0), new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 7), new StringToken(TokenType.IDENTIFIER, "name", 8), new StringToken(TokenType.STRING, "!'", 12)]);
   }
+  void test_string_simple_interpolation_missingIdentifier() {
+    assertTokens("'\$x\$'", [new StringToken(TokenType.STRING, "'", 0), new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 1), new StringToken(TokenType.IDENTIFIER, "x", 2), new StringToken(TokenType.STRING, "", 3), new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 3), new StringToken(TokenType.STRING, "'", 4)]);
+  }
+  void test_string_simple_interpolation_nonIdentifier() {
+    assertTokens("'\$1'", [new StringToken(TokenType.STRING, "'", 0), new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 1), new StringToken(TokenType.STRING, "1'", 2)]);
+  }
   void test_string_simple_single() {
     assertToken(TokenType.STRING, "'string'");
   }
@@ -1999,6 +2048,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
@@ -2010,6 +2060,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.
@@ -2036,6 +2087,19 @@
     JUnitTestCase.assertEquals(source, ((value2 as Keyword)).syntax);
     JUnitTestCase.assertEquals(TokenType.EOF, token.next.type);
   }
+  void assertLineInfo(String source, List<AbstractScannerTest_ExpectedLocation> expectedLocations) {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    scan(source, listener);
+    listener.assertNoErrors();
+    LineInfo info = listener.getLineInfo(new TestSource());
+    JUnitTestCase.assertNotNull(info);
+    for (AbstractScannerTest_ExpectedLocation expectedLocation in expectedLocations) {
+      LineInfo_Location location = info.getLocation(expectedLocation._offset);
+      JUnitTestCase.assertEquals(expectedLocation._lineNumber, location.lineNumber);
+      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
@@ -2068,6 +2132,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.
@@ -2095,6 +2160,21 @@
     return token;
   }
 }
+
+/**
+ * Instances of the class {@code ExpectedLocation} encode information about the expected location
+ * of a given offset in source code.
+ */
+class AbstractScannerTest_ExpectedLocation {
+  int _offset = 0;
+  int _lineNumber = 0;
+  int _columnNumber = 0;
+  AbstractScannerTest_ExpectedLocation(int offset, int lineNumber, int columnNumber) {
+    this._offset = offset;
+    this._lineNumber = lineNumber;
+    this._columnNumber = columnNumber;
+  }
+}
 main() {
   CharBufferScannerTest.dartSuite();
   KeywordStateTest.dartSuite();
diff --git a/pkg/analyzer_experimental/test/generated/test_support.dart b/pkg/analyzer_experimental/test/generated/test_support.dart
index df7f862..59bafe1 100644
--- a/pkg/analyzer_experimental/test/generated/test_support.dart
+++ b/pkg/analyzer_experimental/test/generated/test_support.dart
@@ -11,53 +11,72 @@
 import 'package:analyzer_experimental/src/generated/error.dart';
 import 'package:analyzer_experimental/src/generated/scanner.dart';
 import 'package:analyzer_experimental/src/generated/element.dart' show InterfaceType, MethodElement, PropertyAccessorElement;
-import 'package:analyzer_experimental/src/generated/engine.dart' show AnalysisContext, AnalysisContextImpl;
+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_349_impl();
+    _jtd_constructor_357_impl();
   }
-  _jtd_constructor_349_impl() {
+  _jtd_constructor_357_impl() {
   }
+  
   /**
    * Initialize a newly created error listener to collect errors.
    */
   GatheringErrorListener.con1(String rawSource2) {
-    _jtd_constructor_350_impl(rawSource2);
+    _jtd_constructor_358_impl(rawSource2);
   }
-  _jtd_constructor_350_impl(String rawSource2) {
+  _jtd_constructor_358_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
+   */
+  void addAll(RecordingErrorListener listener) {
+    for (AnalysisError error in listener.errors) {
+      onError(error);
+    }
+  }
+  
   /**
    * Assert that the number of errors that have been gathered matches the number of errors that are
    * given and that they have the expected error codes and locations. The order in which the errors
@@ -80,6 +99,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
@@ -90,6 +110,9 @@
    */
   void assertErrors2(List<ErrorCode> expectedErrorCodes) {
     JavaStringBuilder builder = new JavaStringBuilder();
+    for (ErrorCode errorCode in expectedErrorCodes) {
+      JUnitTestCase.assertFalseMsg("Empty error code message", errorCode.message.isEmpty);
+    }
     Map<ErrorCode, int> expectedCounts = new Map<ErrorCode, int>();
     for (ErrorCode code in expectedErrorCodes) {
       int count = expectedCounts[code];
@@ -128,7 +151,7 @@
         }
         builder.append(expectedCount);
         builder.append(" errors of type ");
-        builder.append(code);
+        builder.append("${code.runtimeType.toString()}.${code}");
         builder.append(", found ");
         builder.append(actualCount);
       }
@@ -143,7 +166,7 @@
         builder.append("; ");
       }
       builder.append("0 errors of type ");
-      builder.append(code);
+      builder.append("${code.runtimeType.toString()}.${code}");
       builder.append(", found ");
       builder.append(actualCount);
       builder.append(" (");
@@ -160,6 +183,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
@@ -191,6 +215,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
@@ -198,11 +223,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.
@@ -210,6 +237,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
@@ -223,6 +251,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
@@ -236,6 +265,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
@@ -244,6 +274,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
@@ -252,6 +283,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
@@ -259,6 +291,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
@@ -273,6 +306,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
@@ -315,6 +349,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.
@@ -332,11 +367,13 @@
     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
@@ -354,6 +391,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
@@ -383,6 +421,7 @@
       }
     }
   }
+  
   /**
    * Assert that a given String is equal to an expected value.
    * @param expected the expected String value
@@ -408,6 +447,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
@@ -430,6 +470,7 @@
       }
     }
   }
+  
   /**
    * Assert that the given array is non-{@code null} and has exactly expected elements.
    * @param array the array being tested
@@ -446,13 +487,14 @@
       JUnitTestCase.fail("Expected array of size ${expectedSize}; contained ${array.length} elements");
     }
     for (int i = 0; i < expectedElements.length; i++) {
-      Object element = array[0];
+      Object element = array[i];
       Object expectedElement = expectedElements[i];
       if (!element == expectedElement) {
         JUnitTestCase.fail("Expected ${expectedElement} at [${i}]; found ${element}");
       }
     }
   }
+  
   /**
    * Assert that the given list is non-{@code null} and has exactly expected elements.
    * @param set the list being tested
@@ -474,6 +516,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
@@ -487,6 +530,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
@@ -501,6 +545,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).
@@ -518,6 +563,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
@@ -532,6 +578,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
@@ -546,6 +593,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
@@ -560,6 +608,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
@@ -572,6 +621,7 @@
     }
     return writer.toString();
   }
+  
   /**
    * Calculate the offset where the given strings differ.
    * @param str1 the first String to compare
@@ -597,6 +647,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
@@ -609,9 +660,10 @@
         return accessor;
       }
     }
-    JUnitTestCase.fail("Could not find getter named ${getterName} in ${type.name}");
+    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
@@ -624,7 +676,7 @@
         return method;
       }
     }
-    JUnitTestCase.fail("Could not find method named ${methodName} in ${type.name}");
+    JUnitTestCase.fail("Could not find method named ${methodName} in ${type.displayName}");
     return null;
   }
   static dartSuite() {
diff --git a/tools/VERSION b/tools/VERSION
index b6d74d9..6594807 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -1,4 +1,4 @@
 MAJOR 0
 MINOR 5
 BUILD 13
-PATCH 0
+PATCH 1
diff --git a/utils/pub/pub.target.mk b/utils/pub/pub.target.mk
index 6ddab0c..6362e21 100644
--- a/utils/pub/pub.target.mk
+++ b/utils/pub/pub.target.mk
@@ -9,7 +9,7 @@
 $(obj)/gen/pub.dart.snapshot: obj := $(abs_obj)
 $(obj)/gen/pub.dart.snapshot: builddir := $(abs_builddir)
 $(obj)/gen/pub.dart.snapshot: TOOLSET := $(TOOLSET)
-$(obj)/gen/pub.dart.snapshot: $(builddir)/dart sdk/lib/_internal/pub/bin/pub.dart sdk/lib/_internal/pub/lib/src/http.dart sdk/lib/_internal/pub/lib/src/utils.dart sdk/lib/_internal/pub/lib/src/git_source.dart sdk/lib/_internal/pub/lib/src/command_install.dart sdk/lib/_internal/pub/lib/src/exit_codes.dart sdk/lib/_internal/pub/lib/src/command.dart sdk/lib/_internal/pub/lib/src/source_registry.dart sdk/lib/_internal/pub/lib/src/pubspec.dart sdk/lib/_internal/pub/lib/src/command_help.dart sdk/lib/_internal/pub/lib/src/oauth2.dart sdk/lib/_internal/pub/lib/src/command_uploader.dart sdk/lib/_internal/pub/lib/src/error_group.dart sdk/lib/_internal/pub/lib/src/directory_tree.dart sdk/lib/_internal/pub/lib/src/sdk.dart sdk/lib/_internal/pub/lib/src/hosted_source.dart sdk/lib/_internal/pub/lib/src/version.dart sdk/lib/_internal/pub/lib/src/git.dart sdk/lib/_internal/pub/lib/src/io.dart sdk/lib/_internal/pub/lib/src/system_cache.dart sdk/lib/_internal/pub/lib/src/safe_http_server.dart sdk/lib/_internal/pub/lib/src/command_update.dart sdk/lib/_internal/pub/lib/src/command_version.dart sdk/lib/_internal/pub/lib/src/validator.dart sdk/lib/_internal/pub/lib/src/command_cache.dart sdk/lib/_internal/pub/lib/src/source.dart sdk/lib/_internal/pub/lib/src/command_lish.dart sdk/lib/_internal/pub/lib/src/package.dart sdk/lib/_internal/pub/lib/src/log.dart sdk/lib/_internal/pub/lib/src/entrypoint.dart sdk/lib/_internal/pub/lib/src/lock_file.dart sdk/lib/_internal/pub/lib/src/path_source.dart sdk/lib/_internal/pub/lib/src/validator/name.dart sdk/lib/_internal/pub/lib/src/validator/size.dart sdk/lib/_internal/pub/lib/src/validator/pubspec_field.dart sdk/lib/_internal/pub/lib/src/validator/compiled_dartdoc.dart sdk/lib/_internal/pub/lib/src/validator/directory.dart sdk/lib/_internal/pub/lib/src/validator/utf8_readme.dart sdk/lib/_internal/pub/lib/src/validator/dependency.dart sdk/lib/_internal/pub/lib/src/validator/license.dart sdk/lib/_internal/pub/lib/src/validator/lib.dart sdk/lib/_internal/pub/lib/src/solver/version_solver.dart sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart sdk/lib/_internal/pub/test/command_line_config.dart sdk/lib/_internal/pub/test/version_test.dart sdk/lib/_internal/pub/test/io_test.dart sdk/lib/_internal/pub/test/pub_cache_test.dart sdk/lib/_internal/pub/test/test_pub.dart sdk/lib/_internal/pub/test/lock_file_test.dart sdk/lib/_internal/pub/test/real_version_test.dart sdk/lib/_internal/pub/test/directory_tree_test.dart sdk/lib/_internal/pub/test/dev_dependency_test.dart sdk/lib/_internal/pub/test/pubspec_test.dart sdk/lib/_internal/pub/test/pub_test.dart sdk/lib/_internal/pub/test/version_solver_test.dart sdk/lib/_internal/pub/test/descriptor.dart sdk/lib/_internal/pub/test/error_group_test.dart sdk/lib/_internal/pub/test/pub_uploader_test.dart sdk/lib/_internal/pub/test/lish/cloud_storage_upload_doesnt_redirect_test.dart sdk/lib/_internal/pub/test/lish/cloud_storage_upload_provides_an_error_test.dart sdk/lib/_internal/pub/test/lish/upload_form_provides_an_error_test.dart sdk/lib/_internal/pub/test/lish/utils.dart sdk/lib/_internal/pub/test/lish/package_creation_provides_a_malformed_error_test.dart sdk/lib/_internal/pub/test/lish/package_validation_has_a_warning_and_is_canceled_test.dart sdk/lib/_internal/pub/test/lish/force_cannot_be_combined_with_dry_run_test.dart sdk/lib/_internal/pub/test/lish/upload_form_fields_is_not_a_map_test.dart sdk/lib/_internal/pub/test/lish/package_creation_provides_invalid_json_test.dart sdk/lib/_internal/pub/test/lish/package_creation_provides_a_malformed_success_test.dart sdk/lib/_internal/pub/test/lish/package_creation_provides_an_error_test.dart sdk/lib/_internal/pub/test/lish/upload_form_is_missing_url_test.dart sdk/lib/_internal/pub/test/lish/force_does_not_publish_if_there_are_errors_test.dart sdk/lib/_internal/pub/test/lish/upload_form_is_missing_fields_test.dart sdk/lib/_internal/pub/test/lish/package_validation_has_an_error_test.dart sdk/lib/_internal/pub/test/lish/preview_package_validation_has_a_warning_test.dart sdk/lib/_internal/pub/test/lish/package_validation_has_a_warning_and_continues_test.dart sdk/lib/_internal/pub/test/lish/force_publishes_if_tests_are_no_warnings_or_errors_test.dart sdk/lib/_internal/pub/test/lish/preview_package_validation_has_no_warnings_test.dart sdk/lib/_internal/pub/test/lish/archives_and_uploads_a_package_test.dart sdk/lib/_internal/pub/test/lish/upload_form_url_is_not_a_string_test.dart sdk/lib/_internal/pub/test/lish/force_publishes_if_there_are_warnings_test.dart sdk/lib/_internal/pub/test/lish/upload_form_fields_has_a_non_string_value_test.dart sdk/lib/_internal/pub/test/lish/upload_form_provides_invalid_json_test.dart sdk/lib/_internal/pub/test/update/pub_update_test.dart sdk/lib/_internal/pub/test/update/git/do_not_update_if_unneeded_test.dart sdk/lib/_internal/pub/test/update/git/update_to_incompatible_pubspec_test.dart sdk/lib/_internal/pub/test/update/git/update_to_nonexistent_pubspec_test.dart sdk/lib/_internal/pub/test/update/git/update_locked_test.dart sdk/lib/_internal/pub/test/update/git/update_one_locked_test.dart sdk/lib/_internal/pub/test/update/hosted/fail_gracefully_on_missing_package_test.dart sdk/lib/_internal/pub/test/update/hosted/unlock_dependers_test.dart sdk/lib/_internal/pub/test/update/hosted/unlock_if_necessary_test.dart sdk/lib/_internal/pub/test/update/hosted/fail_gracefully_on_url_resolve_test.dart sdk/lib/_internal/pub/test/update/hosted/remove_removed_transitive_dependency_test.dart sdk/lib/_internal/pub/test/update/hosted/update_removed_constraints_test.dart sdk/lib/_internal/pub/test/update/hosted/remove_removed_dependency_test.dart sdk/lib/_internal/pub/test/validator/license_test.dart sdk/lib/_internal/pub/test/validator/utils.dart sdk/lib/_internal/pub/test/validator/pubspec_field_test.dart sdk/lib/_internal/pub/test/validator/dependency_test.dart sdk/lib/_internal/pub/test/validator/directory_test.dart sdk/lib/_internal/pub/test/validator/name_test.dart sdk/lib/_internal/pub/test/validator/lib_test.dart sdk/lib/_internal/pub/test/validator/size_test.dart sdk/lib/_internal/pub/test/validator/utf8_readme_test.dart sdk/lib/_internal/pub/test/validator/compiled_dartdoc_test.dart sdk/lib/_internal/pub/test/oauth2/utils.dart sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart sdk/lib/_internal/pub/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart sdk/lib/_internal/pub/test/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart sdk/lib/_internal/pub/test/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart sdk/lib/_internal/pub/test/oauth2/with_a_malformed_credentials_authenticates_again_test.dart sdk/lib/_internal/pub/test/descriptor/tar.dart sdk/lib/_internal/pub/test/descriptor/git.dart sdk/lib/_internal/pub/test/install/pub_install_test.dart sdk/lib/_internal/pub/test/install/relative_symlink_test.dart sdk/lib/_internal/pub/test/install/broken_symlink_test.dart sdk/lib/_internal/pub/test/install/switch_source_test.dart sdk/lib/_internal/pub/test/install/git/check_out_transitive_test.dart sdk/lib/_internal/pub/test/install/git/unlock_if_incompatible_test.dart sdk/lib/_internal/pub/test/install/git/require_pubspec_test.dart sdk/lib/_internal/pub/test/install/git/check_out_with_trailing_slash_test.dart sdk/lib/_internal/pub/test/install/git/dependency_name_match_pubspec_test.dart sdk/lib/_internal/pub/test/install/git/check_out_branch_test.dart sdk/lib/_internal/pub/test/install/git/stay_locked_if_compatible_test.dart sdk/lib/_internal/pub/test/install/git/check_out_and_update_test.dart sdk/lib/_internal/pub/test/install/git/check_out_twice_test.dart sdk/lib/_internal/pub/test/install/git/check_out_test.dart sdk/lib/_internal/pub/test/install/git/lock_version_test.dart sdk/lib/_internal/pub/test/install/git/require_pubspec_name_test.dart sdk/lib/_internal/pub/test/install/git/check_out_revision_test.dart sdk/lib/_internal/pub/test/install/git/different_repo_name_test.dart sdk/lib/_internal/pub/test/install/hosted/unlock_if_incompatible_test.dart sdk/lib/_internal/pub/test/install/hosted/fail_gracefully_on_missing_package_test.dart sdk/lib/_internal/pub/test/install/hosted/do_not_update_on_removed_constraints_test.dart sdk/lib/_internal/pub/test/install/hosted/stay_locked_test.dart sdk/lib/_internal/pub/test/install/hosted/install_test.dart sdk/lib/_internal/pub/test/install/hosted/stay_locked_if_compatible_test.dart sdk/lib/_internal/pub/test/install/hosted/install_transitive_test.dart sdk/lib/_internal/pub/test/install/hosted/fail_gracefully_on_url_resolve_test.dart sdk/lib/_internal/pub/test/install/hosted/remove_removed_transitive_dependency_test.dart sdk/lib/_internal/pub/test/install/hosted/unlock_if_new_is_unsatisfied_test.dart sdk/lib/_internal/pub/test/install/hosted/stay_locked_if_new_is_satisfied_test.dart sdk/lib/_internal/pub/test/install/hosted/remove_removed_dependency_test.dart sdk/lib/_internal/pub/test/install/hosted/cached_pubspec_test.dart sdk/lib/_internal/pub/test/install/hosted/resolve_constraints_test.dart sdk/lib/_internal/pub/test/install/hosted/repair_cache_test.dart sdk/lib/_internal/pub/test/install/path/nonexistent_dir_test.dart sdk/lib/_internal/pub/test/install/path/absolute_path_test.dart sdk/lib/_internal/pub/test/install/path/relative_symlink_test.dart sdk/lib/_internal/pub/test/install/path/shared_dependency_test.dart sdk/lib/_internal/pub/test/install/path/shared_dependency_symlink_test.dart sdk/lib/_internal/pub/test/install/path/absolute_symlink_test.dart sdk/lib/_internal/pub/test/install/path/no_pubspec_test.dart sdk/lib/_internal/pub/test/install/path/relative_path_test.dart sdk/lib/_internal/pub/test/install/path/path_is_file_test.dart sdk/lib/_internal/libraries.dart sdk/lib/_internal/compiler/compiler.dart sdk/lib/_internal/compiler/implementation/dart_types.dart sdk/lib/_internal/compiler/implementation/string_validator.dart sdk/lib/_internal/compiler/implementation/world.dart sdk/lib/_internal/compiler/implementation/typechecker.dart sdk/lib/_internal/compiler/implementation/filenames.dart sdk/lib/_internal/compiler/implementation/dart2js.dart sdk/lib/_internal/compiler/implementation/patch_parser.dart sdk/lib/_internal/compiler/implementation/constants.dart sdk/lib/_internal/compiler/implementation/script.dart sdk/lib/_internal/compiler/implementation/library_loader.dart sdk/lib/_internal/compiler/implementation/enqueue.dart sdk/lib/_internal/compiler/implementation/compiler.dart sdk/lib/_internal/compiler/implementation/diagnostic_listener.dart sdk/lib/_internal/compiler/implementation/warnings.dart sdk/lib/_internal/compiler/implementation/source_file_provider.dart sdk/lib/_internal/compiler/implementation/tree_validator.dart sdk/lib/_internal/compiler/implementation/apiimpl.dart sdk/lib/_internal/compiler/implementation/native_handler.dart sdk/lib/_internal/compiler/implementation/constant_system_dart.dart sdk/lib/_internal/compiler/implementation/dart2jslib.dart sdk/lib/_internal/compiler/implementation/compile_time_constants.dart sdk/lib/_internal/compiler/implementation/closure.dart sdk/lib/_internal/compiler/implementation/code_buffer.dart sdk/lib/_internal/compiler/implementation/source_file.dart sdk/lib/_internal/compiler/implementation/deferred_load.dart sdk/lib/_internal/compiler/implementation/resolved_visitor.dart sdk/lib/_internal/compiler/implementation/colors.dart sdk/lib/_internal/compiler/implementation/source_map_builder.dart sdk/lib/_internal/compiler/implementation/constant_system.dart sdk/lib/_internal/compiler/implementation/util/characters.dart sdk/lib/_internal/compiler/implementation/util/util.dart sdk/lib/_internal/compiler/implementation/util/uri_extras.dart sdk/lib/_internal/compiler/implementation/util/link_implementation.dart sdk/lib/_internal/compiler/implementation/util/link.dart sdk/lib/_internal/compiler/implementation/util/util_implementation.dart sdk/lib/_internal/compiler/implementation/tools/mini_parser.dart sdk/lib/_internal/compiler/implementation/dart_backend/utils.dart sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart sdk/lib/_internal/compiler/implementation/dart_backend/emitter.dart sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart sdk/lib/_internal/compiler/implementation/js_backend/minify_namer.dart sdk/lib/_internal/compiler/implementation/js_backend/namer.dart sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart sdk/lib/_internal/compiler/implementation/js_backend/emitter_no_eval.dart sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart sdk/lib/_internal/compiler/implementation/js_backend/backend.dart sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart sdk/lib/_internal/compiler/implementation/lib/string_helper.dart sdk/lib/_internal/compiler/implementation/lib/collection_patch.dart sdk/lib/_internal/compiler/implementation/lib/js_rti.dart sdk/lib/_internal/compiler/implementation/lib/core_patch.dart sdk/lib/_internal/compiler/implementation/lib/js_array.dart sdk/lib/_internal/compiler/implementation/lib/mirrors_patch.dart sdk/lib/_internal/compiler/implementation/lib/isolate_patch.dart sdk/lib/_internal/compiler/implementation/lib/async_patch.dart sdk/lib/_internal/compiler/implementation/lib/collection_dev_patch.dart sdk/lib/_internal/compiler/implementation/lib/js_helper.dart sdk/lib/_internal/compiler/implementation/lib/scalarlist_patch.dart sdk/lib/_internal/compiler/implementation/lib/native_helper.dart sdk/lib/_internal/compiler/implementation/lib/io_patch.dart sdk/lib/_internal/compiler/implementation/lib/js_number.dart sdk/lib/_internal/compiler/implementation/lib/regexp_helper.dart sdk/lib/_internal/compiler/implementation/lib/isolate_helper.dart sdk/lib/_internal/compiler/implementation/lib/constant_map.dart sdk/lib/_internal/compiler/implementation/lib/typed_data_patch.dart sdk/lib/_internal/compiler/implementation/lib/math_patch.dart sdk/lib/_internal/compiler/implementation/lib/js_string.dart sdk/lib/_internal/compiler/implementation/lib/json_patch.dart sdk/lib/_internal/compiler/implementation/lib/foreign_helper.dart sdk/lib/_internal/compiler/implementation/lib/interceptors.dart sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart sdk/lib/_internal/compiler/implementation/mirrors/util.dart sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart sdk/lib/_internal/compiler/implementation/resolution/scope.dart sdk/lib/_internal/compiler/implementation/resolution/resolution.dart sdk/lib/_internal/compiler/implementation/resolution/secret_tree_element.dart sdk/lib/_internal/compiler/implementation/resolution/members.dart sdk/lib/_internal/compiler/implementation/ssa/ssa.dart sdk/lib/_internal/compiler/implementation/ssa/bailout.dart sdk/lib/_internal/compiler/implementation/ssa/codegen.dart sdk/lib/_internal/compiler/implementation/ssa/types.dart sdk/lib/_internal/compiler/implementation/ssa/validate.dart sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart sdk/lib/_internal/compiler/implementation/ssa/optimize.dart sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart sdk/lib/_internal/compiler/implementation/ssa/nodes.dart sdk/lib/_internal/compiler/implementation/ssa/value_set.dart sdk/lib/_internal/compiler/implementation/ssa/builder.dart sdk/lib/_internal/compiler/implementation/ssa/tracer.dart sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart sdk/lib/_internal/compiler/implementation/js/precedence.dart sdk/lib/_internal/compiler/implementation/js/nodes.dart sdk/lib/_internal/compiler/implementation/js/builder.dart sdk/lib/_internal/compiler/implementation/js/printer.dart sdk/lib/_internal/compiler/implementation/js/js.dart sdk/lib/_internal/compiler/implementation/types/types.dart sdk/lib/_internal/compiler/implementation/types/type_mask.dart sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart sdk/lib/_internal/compiler/implementation/elements/elements.dart sdk/lib/_internal/compiler/implementation/elements/modelx.dart sdk/lib/_internal/compiler/implementation/universe/selector_map.dart sdk/lib/_internal/compiler/implementation/universe/universe.dart sdk/lib/_internal/compiler/implementation/universe/function_set.dart sdk/lib/_internal/compiler/implementation/universe/full_function_set.dart sdk/lib/_internal/compiler/implementation/scanner/byte_array_scanner.dart sdk/lib/_internal/compiler/implementation/scanner/byte_strings.dart sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart sdk/lib/_internal/compiler/implementation/scanner/scanner_implementation.dart sdk/lib/_internal/compiler/implementation/scanner/listener.dart sdk/lib/_internal/compiler/implementation/scanner/class_element_parser.dart sdk/lib/_internal/compiler/implementation/scanner/parser_task.dart sdk/lib/_internal/compiler/implementation/scanner/scanner.dart sdk/lib/_internal/compiler/implementation/scanner/keyword.dart sdk/lib/_internal/compiler/implementation/scanner/scanner_task.dart sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart sdk/lib/_internal/compiler/implementation/scanner/token.dart sdk/lib/_internal/compiler/implementation/scanner/parser.dart sdk/lib/_internal/compiler/implementation/scanner/array_based_scanner.dart sdk/lib/_internal/compiler/implementation/scanner/string_scanner.dart sdk/lib/_internal/compiler/implementation/tree/visitors.dart sdk/lib/_internal/compiler/implementation/tree/prettyprint.dart sdk/lib/_internal/compiler/implementation/tree/unparser.dart sdk/lib/_internal/compiler/implementation/tree/tree.dart sdk/lib/_internal/compiler/implementation/tree/nodes.dart sdk/lib/_internal/compiler/implementation/tree/dartstring.dart sdk/lib/_internal/compiler/samples/leap/leap_leg.dart sdk/lib/_internal/compiler/samples/leap/request_cache.dart sdk/lib/_internal/compiler/samples/leap/leap_script.dart sdk/lib/_internal/compiler/samples/leap/leap_server.dart sdk/lib/_internal/compiler/samples/leap/leap.dart pkg/intl/lib/number_symbols.dart pkg/intl/lib/intl.dart pkg/intl/lib/number_format.dart pkg/intl/lib/date_format.dart pkg/intl/lib/number_symbols_data.dart pkg/intl/lib/date_symbol_data_http_request.dart pkg/intl/lib/intl_browser.dart pkg/intl/lib/bidi_utils.dart pkg/intl/lib/date_symbol_data_local.dart pkg/intl/lib/date_time_patterns.dart pkg/intl/lib/message_lookup_by_library.dart pkg/intl/lib/date_symbol_data_file.dart pkg/intl/lib/extract_messages.dart pkg/intl/lib/generate_localized.dart pkg/intl/lib/bidi_formatter.dart pkg/intl/lib/date_symbols.dart pkg/intl/lib/intl_standalone.dart pkg/intl/lib/src/date_format_helpers.dart pkg/intl/lib/src/http_request_data_reader.dart pkg/intl/lib/src/file_data_reader.dart pkg/intl/lib/src/date_format_internal.dart pkg/intl/lib/src/intl_message.dart pkg/intl/lib/src/intl_helpers.dart pkg/intl/lib/src/date_format_field.dart pkg/intl/lib/src/lazy_locale_data.dart pkg/intl/lib/src/data/dates/localeList.dart pkg/intl/test/date_time_format_local_odd_test.dart pkg/intl/test/data_directory.dart pkg/intl/test/date_time_format_local_even_test.dart pkg/intl/test/intl_message_basic_example_test.dart pkg/intl/test/number_test_data.dart pkg/intl/test/bidi_utils_test.dart pkg/intl/test/date_time_format_test_data.dart pkg/intl/test/number_closure_test.dart pkg/intl/test/date_time_format_file_even_test.dart pkg/intl/test/number_format_test.dart pkg/intl/test/intl_test.dart pkg/intl/test/find_default_locale_standalone_test.dart pkg/intl/test/date_time_format_test_core.dart pkg/intl/test/date_time_format_http_request_test.dart pkg/intl/test/date_time_format_uninitialized_test.dart pkg/intl/test/date_time_format_test_stub.dart pkg/intl/test/find_default_locale_browser_test.dart pkg/intl/test/bidi_format_test.dart pkg/intl/test/date_time_format_file_odd_test.dart pkg/intl/test/message_extraction/generate_from_json.dart pkg/intl/test/message_extraction/sample_with_messages.dart pkg/intl/test/message_extraction/make_hardcoded_translation.dart pkg/intl/test/message_extraction/part_of_sample_with_messages.dart pkg/intl/test/message_extraction/extract_to_json.dart pkg/intl/test/message_extraction/message_extraction_test.dart pkg/intl/tool/generate_locale_data_files.dart pkg/intl/example/basic/basic_example_runner.dart pkg/intl/example/basic/basic_example.dart pkg/intl/example/basic/messages_de.dart pkg/intl/example/basic/messages_all.dart pkg/intl/example/basic/messages_th_th.dart pkg/serialization/lib/serialization.dart pkg/serialization/lib/src/format.dart pkg/serialization/lib/src/serialization_rule.dart pkg/serialization/lib/src/serialization_helpers.dart pkg/serialization/lib/src/mirrors_helpers.dart pkg/serialization/lib/src/basic_rule.dart pkg/serialization/lib/src/reader_writer.dart pkg/serialization/test/serialization_test.dart pkg/serialization/test/test_models.dart pkg/serialization/test/polyfill_identity_map_test.dart pkg/serialization/test/no_library_test.dart pkg/analyzer_experimental/bin/analyzer.dart pkg/analyzer_experimental/lib/options.dart pkg/analyzer_experimental/lib/analyzer.dart pkg/analyzer_experimental/lib/src/generated/constant.dart pkg/analyzer_experimental/lib/src/generated/utilities_dart.dart pkg/analyzer_experimental/lib/src/generated/instrumentation.dart pkg/analyzer_experimental/lib/src/generated/source_io.dart pkg/analyzer_experimental/lib/src/generated/ast.dart pkg/analyzer_experimental/lib/src/generated/sdk.dart pkg/analyzer_experimental/lib/src/generated/element.dart pkg/analyzer_experimental/lib/src/generated/engine.dart pkg/analyzer_experimental/lib/src/generated/scanner.dart pkg/analyzer_experimental/lib/src/generated/java_core.dart pkg/analyzer_experimental/lib/src/generated/java_engine.dart pkg/analyzer_experimental/lib/src/generated/java_io.dart pkg/analyzer_experimental/lib/src/generated/parser.dart pkg/analyzer_experimental/lib/src/generated/java_junit.dart pkg/analyzer_experimental/lib/src/generated/sdk_io.dart pkg/analyzer_experimental/lib/src/generated/html.dart pkg/analyzer_experimental/lib/src/generated/java_engine_io.dart pkg/analyzer_experimental/lib/src/generated/error.dart pkg/analyzer_experimental/lib/src/generated/source.dart pkg/analyzer_experimental/lib/src/generated/resolver.dart pkg/analyzer_experimental/test/options_test.dart pkg/analyzer_experimental/test/generated/resolver_test.dart pkg/analyzer_experimental/test/generated/scanner_test.dart pkg/analyzer_experimental/test/generated/element_test.dart pkg/analyzer_experimental/test/generated/ast_test.dart pkg/analyzer_experimental/test/generated/test_support.dart pkg/analyzer_experimental/test/generated/parser_test.dart pkg/analyzer_experimental/example/scanner_driver.dart pkg/analyzer_experimental/example/resolver_driver.dart pkg/analyzer_experimental/example/parser_driver.dart pkg/webdriver/lib/webdriver.dart pkg/webdriver/lib/src/base64decoder.dart pkg/webdriver/test/webdriver_test.dart pkg/fixnum/lib/fixnum.dart pkg/fixnum/lib/src/int64.dart pkg/fixnum/lib/src/intx.dart pkg/fixnum/lib/src/int32.dart pkg/fixnum/test/int_32_test.dart pkg/fixnum/test/int_64_vm_test.dart pkg/fixnum/test/int_64_test.dart pkg/pathos/lib/path.dart pkg/pathos/test/pathos_test.dart pkg/pathos/test/pathos_windows_test.dart pkg/pathos/test/pathos_posix_test.dart pkg/meta/lib/meta.dart pkg/oauth2/lib/oauth2.dart pkg/oauth2/lib/src/utils.dart pkg/oauth2/lib/src/expiration_exception.dart pkg/oauth2/lib/src/credentials.dart pkg/oauth2/lib/src/authorization_exception.dart pkg/oauth2/lib/src/authorization_code_grant.dart pkg/oauth2/lib/src/handle_access_token_response.dart pkg/oauth2/lib/src/client.dart pkg/oauth2/test/utils.dart pkg/oauth2/test/handle_access_token_response_test.dart pkg/oauth2/test/authorization_code_grant_test.dart pkg/oauth2/test/client_test.dart pkg/oauth2/test/utils_test.dart pkg/oauth2/test/credentials_test.dart pkg/http/lib/http.dart pkg/http/lib/testing.dart pkg/http/lib/src/io_client.dart pkg/http/lib/src/utils.dart pkg/http/lib/src/base_request.dart pkg/http/lib/src/streamed_response.dart pkg/http/lib/src/byte_stream.dart pkg/http/lib/src/base_client.dart pkg/http/lib/src/streamed_request.dart pkg/http/lib/src/base_response.dart pkg/http/lib/src/mock_client.dart pkg/http/lib/src/response.dart pkg/http/lib/src/request.dart pkg/http/lib/src/client.dart pkg/http/lib/src/multipart_file.dart pkg/http/lib/src/multipart_request.dart pkg/http/test/mock_client_test.dart pkg/http/test/utils.dart pkg/http/test/streamed_request_test.dart pkg/http/test/multipart_test.dart pkg/http/test/client_test.dart pkg/http/test/http_test.dart pkg/http/test/request_test.dart pkg/http/test/response_test.dart pkg/http/test/safe_http_server.dart pkg/expect/lib/expect.dart pkg/logging/lib/logging.dart pkg/logging/test/logging_test.dart pkg/stack_trace/lib/stack_trace.dart pkg/stack_trace/lib/src/utils.dart pkg/stack_trace/lib/src/trace.dart pkg/stack_trace/lib/src/frame.dart pkg/stack_trace/test/frame_test.dart pkg/stack_trace/test/trace_test.dart pkg/yaml/lib/yaml.dart pkg/yaml/lib/src/composer.dart pkg/yaml/lib/src/utils.dart pkg/yaml/lib/src/yaml_exception.dart pkg/yaml/lib/src/deep_equals.dart pkg/yaml/lib/src/visitor.dart pkg/yaml/lib/src/yaml_map.dart pkg/yaml/lib/src/parser.dart pkg/yaml/lib/src/model.dart pkg/yaml/lib/src/constructor.dart pkg/yaml/test/yaml_test.dart pkg/scheduled_test/lib/scheduled_test.dart pkg/scheduled_test/lib/scheduled_process.dart pkg/scheduled_test/lib/scheduled_server.dart pkg/scheduled_test/lib/descriptor.dart pkg/scheduled_test/lib/src/utils.dart pkg/scheduled_test/lib/src/schedule_error.dart pkg/scheduled_test/lib/src/task.dart pkg/scheduled_test/lib/src/substitute_future.dart pkg/scheduled_test/lib/src/scheduled_future_matchers.dart pkg/scheduled_test/lib/src/value_future.dart pkg/scheduled_test/lib/src/mock_clock.dart pkg/scheduled_test/lib/src/future_group.dart pkg/scheduled_test/lib/src/schedule.dart pkg/scheduled_test/lib/src/scheduled_server/handler.dart pkg/scheduled_test/lib/src/scheduled_server/safe_http_server.dart pkg/scheduled_test/lib/src/descriptor/directory_descriptor.dart pkg/scheduled_test/lib/src/descriptor/async_descriptor.dart pkg/scheduled_test/lib/src/descriptor/nothing_descriptor.dart pkg/scheduled_test/lib/src/descriptor/descriptor.dart pkg/scheduled_test/lib/src/descriptor/file_descriptor.dart pkg/scheduled_test/lib/src/descriptor/pattern_descriptor.dart pkg/scheduled_test/test/utils.dart pkg/scheduled_test/test/substitute_future_test.dart pkg/scheduled_test/test/scheduled_server_test.dart pkg/scheduled_test/test/scheduled_future_matchers_test.dart pkg/scheduled_test/test/metatest.dart pkg/scheduled_test/test/value_future_test.dart pkg/scheduled_test/test/scheduled_process_test.dart pkg/scheduled_test/test/descriptor/utils.dart pkg/scheduled_test/test/descriptor/file_test.dart pkg/scheduled_test/test/descriptor/nothing_test.dart pkg/scheduled_test/test/descriptor/pattern_test.dart pkg/scheduled_test/test/descriptor/directory_test.dart pkg/scheduled_test/test/descriptor/async_test.dart pkg/scheduled_test/test/scheduled_test/current_schedule_state_test.dart pkg/scheduled_test/test/scheduled_test/current_schedule_current_task_test.dart pkg/scheduled_test/test/scheduled_test/nested_task_test.dart pkg/scheduled_test/test/scheduled_test/on_exception_test.dart pkg/scheduled_test/test/scheduled_test/task_return_value_test.dart pkg/scheduled_test/test/scheduled_test/abort_test.dart pkg/scheduled_test/test/scheduled_test/timeout_test.dart pkg/scheduled_test/test/scheduled_test/out_of_band_task_test.dart pkg/scheduled_test/test/scheduled_test/wrap_async_test.dart pkg/scheduled_test/test/scheduled_test/capture_stack_traces_test.dart pkg/scheduled_test/test/scheduled_test/wrap_future_test.dart pkg/scheduled_test/test/scheduled_test/signal_error_test.dart pkg/scheduled_test/test/scheduled_test/set_up_test.dart pkg/scheduled_test/test/scheduled_test/on_complete_test.dart pkg/scheduled_test/test/scheduled_test/simple_test.dart pkg/scheduled_test/test/scheduled_test/current_schedule_errors_test.dart pkg/unittest/lib/unittest.dart pkg/unittest/lib/html_individual_config.dart pkg/unittest/lib/vm_config.dart pkg/unittest/lib/html_enhanced_config.dart pkg/unittest/lib/matcher.dart pkg/unittest/lib/interactive_html_config.dart pkg/unittest/lib/mock.dart pkg/unittest/lib/html_config.dart pkg/unittest/lib/compact_vm_config.dart pkg/unittest/lib/src/expect.dart pkg/unittest/lib/src/basematcher.dart pkg/unittest/lib/src/string_matchers.dart pkg/unittest/lib/src/core_matchers.dart pkg/unittest/lib/src/interfaces.dart pkg/unittest/lib/src/description.dart pkg/unittest/lib/src/future_matchers.dart pkg/unittest/lib/src/numeric_matchers.dart pkg/unittest/lib/src/iterable_matchers.dart pkg/unittest/lib/src/map_matchers.dart pkg/unittest/lib/src/config.dart pkg/unittest/lib/src/test_case.dart pkg/unittest/lib/src/operator_matchers.dart pkg/unittest/test/mock_regexp_negative_test.dart pkg/unittest/test/matchers_test.dart pkg/unittest/test/unittest_test.dart pkg/unittest/test/test_utils.dart pkg/unittest/test/instance_test.dart pkg/unittest/test/mock_test.dart pkg/unittest/test/mock_stepwise_negative_test.dart pkg/args/lib/args.dart pkg/args/lib/src/parser.dart pkg/args/lib/src/usage.dart pkg/args/test/args_test.dart pkg/args/test/usage_test.dart pkg/args/test/command_test.dart pkg/args/test/parse_test.dart pkg/args/example/test_runner.dart pkg/source_maps/lib/span.dart pkg/source_maps/lib/source_maps.dart pkg/source_maps/lib/parser.dart pkg/source_maps/lib/builder.dart pkg/source_maps/lib/printer.dart pkg/source_maps/lib/src/utils.dart pkg/source_maps/lib/src/vlq.dart pkg/source_maps/test/vlq_test.dart pkg/source_maps/test/run.dart pkg/source_maps/test/builder_test.dart pkg/source_maps/test/utils_test.dart pkg/source_maps/test/common.dart pkg/source_maps/test/parser_test.dart pkg/source_maps/test/printer_test.dart pkg/source_maps/test/span_test.dart pkg/source_maps/test/end2end_test.dart FORCE_DO_CMD
+$(obj)/gen/pub.dart.snapshot: $(builddir)/dart sdk/lib/_internal/pub/bin/pub.dart sdk/lib/_internal/pub/lib/src/http.dart sdk/lib/_internal/pub/lib/src/utils.dart sdk/lib/_internal/pub/lib/src/command_deploy.dart sdk/lib/_internal/pub/lib/src/git_source.dart sdk/lib/_internal/pub/lib/src/command_install.dart sdk/lib/_internal/pub/lib/src/exit_codes.dart sdk/lib/_internal/pub/lib/src/command.dart sdk/lib/_internal/pub/lib/src/source_registry.dart sdk/lib/_internal/pub/lib/src/pubspec.dart sdk/lib/_internal/pub/lib/src/command_help.dart sdk/lib/_internal/pub/lib/src/oauth2.dart sdk/lib/_internal/pub/lib/src/command_uploader.dart sdk/lib/_internal/pub/lib/src/error_group.dart sdk/lib/_internal/pub/lib/src/directory_tree.dart sdk/lib/_internal/pub/lib/src/sdk.dart sdk/lib/_internal/pub/lib/src/dart.dart sdk/lib/_internal/pub/lib/src/hosted_source.dart sdk/lib/_internal/pub/lib/src/version.dart sdk/lib/_internal/pub/lib/src/git.dart sdk/lib/_internal/pub/lib/src/io.dart sdk/lib/_internal/pub/lib/src/system_cache.dart sdk/lib/_internal/pub/lib/src/safe_http_server.dart sdk/lib/_internal/pub/lib/src/command_update.dart sdk/lib/_internal/pub/lib/src/command_version.dart sdk/lib/_internal/pub/lib/src/validator.dart sdk/lib/_internal/pub/lib/src/command_cache.dart sdk/lib/_internal/pub/lib/src/source.dart sdk/lib/_internal/pub/lib/src/command_lish.dart sdk/lib/_internal/pub/lib/src/package.dart sdk/lib/_internal/pub/lib/src/log.dart sdk/lib/_internal/pub/lib/src/entrypoint.dart sdk/lib/_internal/pub/lib/src/lock_file.dart sdk/lib/_internal/pub/lib/src/path_source.dart sdk/lib/_internal/pub/lib/src/validator/name.dart sdk/lib/_internal/pub/lib/src/validator/size.dart sdk/lib/_internal/pub/lib/src/validator/pubspec_field.dart sdk/lib/_internal/pub/lib/src/validator/compiled_dartdoc.dart sdk/lib/_internal/pub/lib/src/validator/directory.dart sdk/lib/_internal/pub/lib/src/validator/utf8_readme.dart sdk/lib/_internal/pub/lib/src/validator/dependency.dart sdk/lib/_internal/pub/lib/src/validator/license.dart sdk/lib/_internal/pub/lib/src/validator/lib.dart sdk/lib/_internal/pub/lib/src/solver/version_solver.dart sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart sdk/lib/_internal/pub/test/command_line_config.dart sdk/lib/_internal/pub/test/version_test.dart sdk/lib/_internal/pub/test/io_test.dart sdk/lib/_internal/pub/test/pub_cache_test.dart sdk/lib/_internal/pub/test/test_pub.dart sdk/lib/_internal/pub/test/lock_file_test.dart sdk/lib/_internal/pub/test/real_version_test.dart sdk/lib/_internal/pub/test/utils_test.dart sdk/lib/_internal/pub/test/directory_tree_test.dart sdk/lib/_internal/pub/test/unknown_source_test.dart sdk/lib/_internal/pub/test/dev_dependency_test.dart sdk/lib/_internal/pub/test/package_files_test.dart sdk/lib/_internal/pub/test/pubspec_test.dart sdk/lib/_internal/pub/test/pub_test.dart sdk/lib/_internal/pub/test/pub_install_and_update_test.dart sdk/lib/_internal/pub/test/version_solver_test.dart sdk/lib/_internal/pub/test/descriptor.dart sdk/lib/_internal/pub/test/error_group_test.dart sdk/lib/_internal/pub/test/pub_uploader_test.dart sdk/lib/_internal/pub/test/lish/cloud_storage_upload_doesnt_redirect_test.dart sdk/lib/_internal/pub/test/lish/cloud_storage_upload_provides_an_error_test.dart sdk/lib/_internal/pub/test/lish/upload_form_provides_an_error_test.dart sdk/lib/_internal/pub/test/lish/utils.dart sdk/lib/_internal/pub/test/lish/package_creation_provides_a_malformed_error_test.dart sdk/lib/_internal/pub/test/lish/package_validation_has_a_warning_and_is_canceled_test.dart sdk/lib/_internal/pub/test/lish/force_cannot_be_combined_with_dry_run_test.dart sdk/lib/_internal/pub/test/lish/upload_form_fields_is_not_a_map_test.dart sdk/lib/_internal/pub/test/lish/package_creation_provides_invalid_json_test.dart sdk/lib/_internal/pub/test/lish/package_creation_provides_a_malformed_success_test.dart sdk/lib/_internal/pub/test/lish/package_creation_provides_an_error_test.dart sdk/lib/_internal/pub/test/lish/upload_form_is_missing_url_test.dart sdk/lib/_internal/pub/test/lish/force_does_not_publish_if_there_are_errors_test.dart sdk/lib/_internal/pub/test/lish/upload_form_is_missing_fields_test.dart sdk/lib/_internal/pub/test/lish/package_validation_has_an_error_test.dart sdk/lib/_internal/pub/test/lish/preview_package_validation_has_a_warning_test.dart sdk/lib/_internal/pub/test/lish/package_validation_has_a_warning_and_continues_test.dart sdk/lib/_internal/pub/test/lish/force_publishes_if_tests_are_no_warnings_or_errors_test.dart sdk/lib/_internal/pub/test/lish/preview_package_validation_has_no_warnings_test.dart sdk/lib/_internal/pub/test/lish/archives_and_uploads_a_package_test.dart sdk/lib/_internal/pub/test/lish/upload_form_url_is_not_a_string_test.dart sdk/lib/_internal/pub/test/lish/force_publishes_if_there_are_warnings_test.dart sdk/lib/_internal/pub/test/lish/upload_form_fields_has_a_non_string_value_test.dart sdk/lib/_internal/pub/test/lish/upload_form_provides_invalid_json_test.dart sdk/lib/_internal/pub/test/update/git/do_not_update_if_unneeded_test.dart sdk/lib/_internal/pub/test/update/git/update_to_incompatible_pubspec_test.dart sdk/lib/_internal/pub/test/update/git/update_to_nonexistent_pubspec_test.dart sdk/lib/_internal/pub/test/update/git/update_locked_test.dart sdk/lib/_internal/pub/test/update/git/update_one_locked_test.dart sdk/lib/_internal/pub/test/update/hosted/unlock_dependers_test.dart sdk/lib/_internal/pub/test/update/hosted/unlock_if_necessary_test.dart sdk/lib/_internal/pub/test/update/hosted/update_removed_constraints_test.dart sdk/lib/_internal/pub/test/validator/license_test.dart sdk/lib/_internal/pub/test/validator/utils.dart sdk/lib/_internal/pub/test/validator/pubspec_field_test.dart sdk/lib/_internal/pub/test/validator/dependency_test.dart sdk/lib/_internal/pub/test/validator/directory_test.dart sdk/lib/_internal/pub/test/validator/name_test.dart sdk/lib/_internal/pub/test/validator/lib_test.dart sdk/lib/_internal/pub/test/validator/size_test.dart sdk/lib/_internal/pub/test/validator/utf8_readme_test.dart sdk/lib/_internal/pub/test/validator/compiled_dartdoc_test.dart sdk/lib/_internal/pub/test/oauth2/utils.dart sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart sdk/lib/_internal/pub/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart sdk/lib/_internal/pub/test/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart sdk/lib/_internal/pub/test/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart sdk/lib/_internal/pub/test/oauth2/with_a_malformed_credentials_authenticates_again_test.dart sdk/lib/_internal/pub/test/descriptor/tar.dart sdk/lib/_internal/pub/test/descriptor/git.dart sdk/lib/_internal/pub/test/hosted/fail_gracefully_on_missing_package_test.dart sdk/lib/_internal/pub/test/hosted/offline_test.dart sdk/lib/_internal/pub/test/hosted/fail_gracefully_on_url_resolve_test.dart sdk/lib/_internal/pub/test/hosted/remove_removed_transitive_dependency_test.dart sdk/lib/_internal/pub/test/hosted/remove_removed_dependency_test.dart sdk/lib/_internal/pub/test/install/relative_symlink_test.dart sdk/lib/_internal/pub/test/install/broken_symlink_test.dart sdk/lib/_internal/pub/test/install/switch_source_test.dart sdk/lib/_internal/pub/test/install/git/check_out_transitive_test.dart sdk/lib/_internal/pub/test/install/git/unlock_if_incompatible_test.dart sdk/lib/_internal/pub/test/install/git/require_pubspec_test.dart sdk/lib/_internal/pub/test/install/git/check_out_with_trailing_slash_test.dart sdk/lib/_internal/pub/test/install/git/dependency_name_match_pubspec_test.dart sdk/lib/_internal/pub/test/install/git/check_out_branch_test.dart sdk/lib/_internal/pub/test/install/git/stay_locked_if_compatible_test.dart sdk/lib/_internal/pub/test/install/git/check_out_and_update_test.dart sdk/lib/_internal/pub/test/install/git/check_out_twice_test.dart sdk/lib/_internal/pub/test/install/git/check_out_test.dart sdk/lib/_internal/pub/test/install/git/lock_version_test.dart sdk/lib/_internal/pub/test/install/git/require_pubspec_name_test.dart sdk/lib/_internal/pub/test/install/git/check_out_revision_test.dart sdk/lib/_internal/pub/test/install/git/different_repo_name_test.dart sdk/lib/_internal/pub/test/install/hosted/unlock_if_incompatible_test.dart sdk/lib/_internal/pub/test/install/hosted/do_not_update_on_removed_constraints_test.dart sdk/lib/_internal/pub/test/install/hosted/stay_locked_test.dart sdk/lib/_internal/pub/test/install/hosted/install_test.dart sdk/lib/_internal/pub/test/install/hosted/stay_locked_if_compatible_test.dart sdk/lib/_internal/pub/test/install/hosted/install_transitive_test.dart sdk/lib/_internal/pub/test/install/hosted/unlock_if_new_is_unsatisfied_test.dart sdk/lib/_internal/pub/test/install/hosted/stay_locked_if_new_is_satisfied_test.dart sdk/lib/_internal/pub/test/install/hosted/cached_pubspec_test.dart sdk/lib/_internal/pub/test/install/hosted/resolve_constraints_test.dart sdk/lib/_internal/pub/test/install/hosted/repair_cache_test.dart sdk/lib/_internal/pub/test/install/path/nonexistent_dir_test.dart sdk/lib/_internal/pub/test/install/path/absolute_path_test.dart sdk/lib/_internal/pub/test/install/path/relative_symlink_test.dart sdk/lib/_internal/pub/test/install/path/shared_dependency_test.dart sdk/lib/_internal/pub/test/install/path/shared_dependency_symlink_test.dart sdk/lib/_internal/pub/test/install/path/absolute_symlink_test.dart sdk/lib/_internal/pub/test/install/path/no_pubspec_test.dart sdk/lib/_internal/pub/test/install/path/relative_path_test.dart sdk/lib/_internal/pub/test/install/path/path_is_file_test.dart sdk/lib/_internal/pub/test/deploy/copies_non_dart_files_to_deploy_test.dart sdk/lib/_internal/pub/test/deploy/ignores_non_entrypoint_dart_files_test.dart sdk/lib/_internal/pub/test/deploy/compiles_dart_entrypoints_to_dart_and_js_test.dart sdk/lib/_internal/pub/test/deploy/reports_dart_parse_errors_test.dart sdk/lib/_internal/pub/test/deploy/copies_dart_js_next_to_entrypoints_test.dart sdk/lib/_internal/pub/test/deploy/with_no_web_directory_test.dart sdk/lib/_internal/libraries.dart sdk/lib/_internal/compiler/compiler.dart sdk/lib/_internal/compiler/implementation/dart_types.dart sdk/lib/_internal/compiler/implementation/string_validator.dart sdk/lib/_internal/compiler/implementation/world.dart sdk/lib/_internal/compiler/implementation/typechecker.dart sdk/lib/_internal/compiler/implementation/filenames.dart sdk/lib/_internal/compiler/implementation/dart2js.dart sdk/lib/_internal/compiler/implementation/patch_parser.dart sdk/lib/_internal/compiler/implementation/constants.dart sdk/lib/_internal/compiler/implementation/script.dart sdk/lib/_internal/compiler/implementation/library_loader.dart sdk/lib/_internal/compiler/implementation/enqueue.dart sdk/lib/_internal/compiler/implementation/compiler.dart sdk/lib/_internal/compiler/implementation/diagnostic_listener.dart sdk/lib/_internal/compiler/implementation/warnings.dart sdk/lib/_internal/compiler/implementation/source_file_provider.dart sdk/lib/_internal/compiler/implementation/tree_validator.dart sdk/lib/_internal/compiler/implementation/apiimpl.dart sdk/lib/_internal/compiler/implementation/native_handler.dart sdk/lib/_internal/compiler/implementation/constant_system_dart.dart sdk/lib/_internal/compiler/implementation/dart2jslib.dart sdk/lib/_internal/compiler/implementation/compile_time_constants.dart sdk/lib/_internal/compiler/implementation/closure.dart sdk/lib/_internal/compiler/implementation/code_buffer.dart sdk/lib/_internal/compiler/implementation/source_file.dart sdk/lib/_internal/compiler/implementation/deferred_load.dart sdk/lib/_internal/compiler/implementation/resolved_visitor.dart sdk/lib/_internal/compiler/implementation/colors.dart sdk/lib/_internal/compiler/implementation/source_map_builder.dart sdk/lib/_internal/compiler/implementation/constant_system.dart sdk/lib/_internal/compiler/implementation/util/characters.dart sdk/lib/_internal/compiler/implementation/util/util.dart sdk/lib/_internal/compiler/implementation/util/uri_extras.dart sdk/lib/_internal/compiler/implementation/util/link_implementation.dart sdk/lib/_internal/compiler/implementation/util/link.dart sdk/lib/_internal/compiler/implementation/util/util_implementation.dart sdk/lib/_internal/compiler/implementation/tools/mini_parser.dart sdk/lib/_internal/compiler/implementation/dart_backend/utils.dart sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart sdk/lib/_internal/compiler/implementation/dart_backend/emitter.dart sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart sdk/lib/_internal/compiler/implementation/js_backend/minify_namer.dart sdk/lib/_internal/compiler/implementation/js_backend/namer.dart sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart sdk/lib/_internal/compiler/implementation/js_backend/emitter_no_eval.dart sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart sdk/lib/_internal/compiler/implementation/js_backend/backend.dart sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart sdk/lib/_internal/compiler/implementation/lib/string_helper.dart sdk/lib/_internal/compiler/implementation/lib/collection_patch.dart sdk/lib/_internal/compiler/implementation/lib/js_rti.dart sdk/lib/_internal/compiler/implementation/lib/core_patch.dart sdk/lib/_internal/compiler/implementation/lib/js_array.dart sdk/lib/_internal/compiler/implementation/lib/mirrors_patch.dart sdk/lib/_internal/compiler/implementation/lib/isolate_patch.dart sdk/lib/_internal/compiler/implementation/lib/async_patch.dart sdk/lib/_internal/compiler/implementation/lib/collection_dev_patch.dart sdk/lib/_internal/compiler/implementation/lib/js_helper.dart sdk/lib/_internal/compiler/implementation/lib/scalarlist_patch.dart sdk/lib/_internal/compiler/implementation/lib/native_helper.dart sdk/lib/_internal/compiler/implementation/lib/io_patch.dart sdk/lib/_internal/compiler/implementation/lib/js_number.dart sdk/lib/_internal/compiler/implementation/lib/regexp_helper.dart sdk/lib/_internal/compiler/implementation/lib/isolate_helper.dart sdk/lib/_internal/compiler/implementation/lib/js_mirrors.dart sdk/lib/_internal/compiler/implementation/lib/constant_map.dart sdk/lib/_internal/compiler/implementation/lib/typed_data_patch.dart sdk/lib/_internal/compiler/implementation/lib/math_patch.dart sdk/lib/_internal/compiler/implementation/lib/js_string.dart sdk/lib/_internal/compiler/implementation/lib/json_patch.dart sdk/lib/_internal/compiler/implementation/lib/foreign_helper.dart sdk/lib/_internal/compiler/implementation/lib/interceptors.dart sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart sdk/lib/_internal/compiler/implementation/mirrors/util.dart sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart sdk/lib/_internal/compiler/implementation/resolution/scope.dart sdk/lib/_internal/compiler/implementation/resolution/resolution.dart sdk/lib/_internal/compiler/implementation/resolution/secret_tree_element.dart sdk/lib/_internal/compiler/implementation/resolution/members.dart sdk/lib/_internal/compiler/implementation/ssa/ssa.dart sdk/lib/_internal/compiler/implementation/ssa/bailout.dart sdk/lib/_internal/compiler/implementation/ssa/codegen.dart sdk/lib/_internal/compiler/implementation/ssa/types.dart sdk/lib/_internal/compiler/implementation/ssa/validate.dart sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart sdk/lib/_internal/compiler/implementation/ssa/optimize.dart sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart sdk/lib/_internal/compiler/implementation/ssa/nodes.dart sdk/lib/_internal/compiler/implementation/ssa/value_set.dart sdk/lib/_internal/compiler/implementation/ssa/builder.dart sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart sdk/lib/_internal/compiler/implementation/ssa/tracer.dart sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart sdk/lib/_internal/compiler/implementation/js/precedence.dart sdk/lib/_internal/compiler/implementation/js/nodes.dart sdk/lib/_internal/compiler/implementation/js/builder.dart sdk/lib/_internal/compiler/implementation/js/printer.dart sdk/lib/_internal/compiler/implementation/js/js.dart sdk/lib/_internal/compiler/implementation/types/types.dart sdk/lib/_internal/compiler/implementation/types/union_type_mask.dart sdk/lib/_internal/compiler/implementation/types/type_mask.dart sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart sdk/lib/_internal/compiler/implementation/types/flat_type_mask.dart sdk/lib/_internal/compiler/implementation/elements/elements.dart sdk/lib/_internal/compiler/implementation/elements/modelx.dart sdk/lib/_internal/compiler/implementation/universe/side_effects.dart sdk/lib/_internal/compiler/implementation/universe/selector_map.dart sdk/lib/_internal/compiler/implementation/universe/universe.dart sdk/lib/_internal/compiler/implementation/universe/function_set.dart sdk/lib/_internal/compiler/implementation/scanner/byte_array_scanner.dart sdk/lib/_internal/compiler/implementation/scanner/byte_strings.dart sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart sdk/lib/_internal/compiler/implementation/scanner/scanner_implementation.dart sdk/lib/_internal/compiler/implementation/scanner/listener.dart sdk/lib/_internal/compiler/implementation/scanner/class_element_parser.dart sdk/lib/_internal/compiler/implementation/scanner/parser_task.dart sdk/lib/_internal/compiler/implementation/scanner/scanner.dart sdk/lib/_internal/compiler/implementation/scanner/keyword.dart sdk/lib/_internal/compiler/implementation/scanner/scanner_task.dart sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart sdk/lib/_internal/compiler/implementation/scanner/token.dart sdk/lib/_internal/compiler/implementation/scanner/parser.dart sdk/lib/_internal/compiler/implementation/scanner/array_based_scanner.dart sdk/lib/_internal/compiler/implementation/scanner/string_scanner.dart sdk/lib/_internal/compiler/implementation/tree/visitors.dart sdk/lib/_internal/compiler/implementation/tree/prettyprint.dart sdk/lib/_internal/compiler/implementation/tree/unparser.dart sdk/lib/_internal/compiler/implementation/tree/tree.dart sdk/lib/_internal/compiler/implementation/tree/nodes.dart sdk/lib/_internal/compiler/implementation/tree/dartstring.dart sdk/lib/_internal/compiler/samples/jsonify/jsonify.dart sdk/lib/_internal/compiler/samples/compile_loop/compile_loop.dart sdk/lib/_internal/compiler/samples/leap/leap_leg.dart sdk/lib/_internal/compiler/samples/leap/request_cache.dart sdk/lib/_internal/compiler/samples/leap/leap_script.dart sdk/lib/_internal/compiler/samples/leap/leap_server.dart sdk/lib/_internal/compiler/samples/leap/leap.dart sdk/lib/_internal/compiler/samples/darttags/darttags.dart pkg/intl/lib/number_symbols.dart pkg/intl/lib/intl.dart pkg/intl/lib/number_format.dart pkg/intl/lib/date_format.dart pkg/intl/lib/number_symbols_data.dart pkg/intl/lib/date_symbol_data_http_request.dart pkg/intl/lib/intl_browser.dart pkg/intl/lib/bidi_utils.dart pkg/intl/lib/date_symbol_data_local.dart pkg/intl/lib/date_time_patterns.dart pkg/intl/lib/message_lookup_by_library.dart pkg/intl/lib/date_symbol_data_file.dart pkg/intl/lib/extract_messages.dart pkg/intl/lib/generate_localized.dart pkg/intl/lib/bidi_formatter.dart pkg/intl/lib/date_symbols.dart pkg/intl/lib/intl_standalone.dart pkg/intl/lib/src/date_format_helpers.dart pkg/intl/lib/src/http_request_data_reader.dart pkg/intl/lib/src/file_data_reader.dart pkg/intl/lib/src/date_format_internal.dart pkg/intl/lib/src/intl_message.dart pkg/intl/lib/src/intl_helpers.dart pkg/intl/lib/src/date_format_field.dart pkg/intl/lib/src/lazy_locale_data.dart pkg/intl/lib/src/data/dates/localeList.dart pkg/intl/test/date_time_format_local_odd_test.dart pkg/intl/test/data_directory.dart pkg/intl/test/date_time_format_local_even_test.dart pkg/intl/test/intl_message_basic_example_test.dart pkg/intl/test/number_test_data.dart pkg/intl/test/bidi_utils_test.dart pkg/intl/test/date_time_format_test_data.dart pkg/intl/test/number_closure_test.dart pkg/intl/test/date_time_format_file_even_test.dart pkg/intl/test/number_format_test.dart pkg/intl/test/intl_test.dart pkg/intl/test/find_default_locale_standalone_test.dart pkg/intl/test/date_time_format_test_core.dart pkg/intl/test/date_time_format_http_request_test.dart pkg/intl/test/date_time_format_uninitialized_test.dart pkg/intl/test/date_time_format_test_stub.dart pkg/intl/test/find_default_locale_browser_test.dart pkg/intl/test/bidi_format_test.dart pkg/intl/test/date_time_format_file_odd_test.dart pkg/intl/test/message_extraction/generate_from_json.dart pkg/intl/test/message_extraction/sample_with_messages.dart pkg/intl/test/message_extraction/make_hardcoded_translation.dart pkg/intl/test/message_extraction/part_of_sample_with_messages.dart pkg/intl/test/message_extraction/extract_to_json.dart pkg/intl/test/message_extraction/message_extraction_test.dart pkg/intl/tool/generate_locale_data_files.dart pkg/intl/example/basic/basic_example_runner.dart pkg/intl/example/basic/basic_example.dart pkg/intl/example/basic/messages_de.dart pkg/intl/example/basic/messages_all.dart pkg/intl/example/basic/messages_th_th.dart pkg/serialization/lib/serialization.dart pkg/serialization/lib/src/format.dart pkg/serialization/lib/src/serialization_rule.dart pkg/serialization/lib/src/serialization_helpers.dart pkg/serialization/lib/src/mirrors_helpers.dart pkg/serialization/lib/src/basic_rule.dart pkg/serialization/lib/src/reader_writer.dart pkg/serialization/test/serialization_test.dart pkg/serialization/test/test_models.dart pkg/serialization/test/polyfill_identity_map_test.dart pkg/serialization/test/no_library_test.dart pkg/analyzer_experimental/bin/analyzer.dart pkg/analyzer_experimental/lib/options.dart pkg/analyzer_experimental/lib/analyzer.dart pkg/analyzer_experimental/lib/src/utils.dart pkg/analyzer_experimental/lib/src/error_formatter.dart pkg/analyzer_experimental/lib/src/analyzer_impl.dart pkg/analyzer_experimental/lib/src/error.dart pkg/analyzer_experimental/lib/src/generated/constant.dart pkg/analyzer_experimental/lib/src/generated/utilities_dart.dart pkg/analyzer_experimental/lib/src/generated/instrumentation.dart pkg/analyzer_experimental/lib/src/generated/source_io.dart pkg/analyzer_experimental/lib/src/generated/ast.dart pkg/analyzer_experimental/lib/src/generated/sdk.dart pkg/analyzer_experimental/lib/src/generated/element.dart pkg/analyzer_experimental/lib/src/generated/engine.dart pkg/analyzer_experimental/lib/src/generated/scanner.dart pkg/analyzer_experimental/lib/src/generated/java_core.dart pkg/analyzer_experimental/lib/src/generated/java_engine.dart pkg/analyzer_experimental/lib/src/generated/java_io.dart pkg/analyzer_experimental/lib/src/generated/parser.dart pkg/analyzer_experimental/lib/src/generated/java_junit.dart pkg/analyzer_experimental/lib/src/generated/sdk_io.dart pkg/analyzer_experimental/lib/src/generated/html.dart pkg/analyzer_experimental/lib/src/generated/java_engine_io.dart pkg/analyzer_experimental/lib/src/generated/error.dart pkg/analyzer_experimental/lib/src/generated/source.dart pkg/analyzer_experimental/lib/src/generated/resolver.dart pkg/analyzer_experimental/test/utils.dart pkg/analyzer_experimental/test/error_test.dart pkg/analyzer_experimental/test/options_test.dart pkg/analyzer_experimental/test/generated/resolver_test.dart pkg/analyzer_experimental/test/generated/scanner_test.dart pkg/analyzer_experimental/test/generated/element_test.dart pkg/analyzer_experimental/test/generated/ast_test.dart pkg/analyzer_experimental/test/generated/test_support.dart pkg/analyzer_experimental/test/generated/parser_test.dart pkg/analyzer_experimental/example/scanner_driver.dart pkg/analyzer_experimental/example/resolver_driver.dart pkg/analyzer_experimental/example/parser_driver.dart pkg/webdriver/lib/webdriver.dart pkg/webdriver/lib/src/base64decoder.dart pkg/webdriver/test/webdriver_test.dart pkg/fixnum/lib/fixnum.dart pkg/fixnum/lib/src/int64.dart pkg/fixnum/lib/src/intx.dart pkg/fixnum/lib/src/int32.dart pkg/fixnum/test/int_32_test.dart pkg/fixnum/test/int_64_vm_test.dart pkg/fixnum/test/int_64_test.dart pkg/pathos/lib/path.dart pkg/pathos/test/pathos_test.dart pkg/pathos/test/pathos_windows_test.dart pkg/pathos/test/pathos_posix_test.dart pkg/crypto/lib/crypto.dart pkg/crypto/lib/src/crypto_utils.dart pkg/crypto/lib/src/hmac.dart pkg/crypto/lib/src/sha1.dart pkg/crypto/lib/src/hash_utils.dart pkg/crypto/lib/src/md5.dart pkg/crypto/lib/src/sha256.dart pkg/meta/lib/meta.dart pkg/oauth2/lib/oauth2.dart pkg/oauth2/lib/src/utils.dart pkg/oauth2/lib/src/expiration_exception.dart pkg/oauth2/lib/src/credentials.dart pkg/oauth2/lib/src/authorization_exception.dart pkg/oauth2/lib/src/authorization_code_grant.dart pkg/oauth2/lib/src/handle_access_token_response.dart pkg/oauth2/lib/src/client.dart pkg/oauth2/test/utils.dart pkg/oauth2/test/handle_access_token_response_test.dart pkg/oauth2/test/authorization_code_grant_test.dart pkg/oauth2/test/client_test.dart pkg/oauth2/test/utils_test.dart pkg/oauth2/test/credentials_test.dart pkg/http/lib/http.dart pkg/http/lib/testing.dart pkg/http/lib/src/io_client.dart pkg/http/lib/src/utils.dart pkg/http/lib/src/base_request.dart pkg/http/lib/src/streamed_response.dart pkg/http/lib/src/byte_stream.dart pkg/http/lib/src/base_client.dart pkg/http/lib/src/streamed_request.dart pkg/http/lib/src/base_response.dart pkg/http/lib/src/mock_client.dart pkg/http/lib/src/response.dart pkg/http/lib/src/request.dart pkg/http/lib/src/client.dart pkg/http/lib/src/multipart_file.dart pkg/http/lib/src/multipart_request.dart pkg/http/test/mock_client_test.dart pkg/http/test/utils.dart pkg/http/test/streamed_request_test.dart pkg/http/test/multipart_test.dart pkg/http/test/client_test.dart pkg/http/test/http_test.dart pkg/http/test/request_test.dart pkg/http/test/response_test.dart pkg/http/test/safe_http_server.dart pkg/expect/lib/expect.dart pkg/mdv_observe/lib/mdv_observe.dart pkg/mdv_observe/lib/src/observable_list.dart pkg/mdv_observe/lib/src/observable_map.dart pkg/mdv_observe/lib/src/observable_box.dart pkg/mdv_observe/test/utils.dart pkg/mdv_observe/test/list_change_test.dart pkg/mdv_observe/test/observable_list_test.dart pkg/mdv_observe/test/observe_test.dart pkg/mdv_observe/test/observable_map_test.dart pkg/logging/lib/logging.dart pkg/logging/test/logging_test.dart pkg/stack_trace/lib/stack_trace.dart pkg/stack_trace/lib/src/utils.dart pkg/stack_trace/lib/src/lazy_trace.dart pkg/stack_trace/lib/src/trace.dart pkg/stack_trace/lib/src/frame.dart pkg/stack_trace/test/frame_test.dart pkg/stack_trace/test/trace_test.dart pkg/yaml/lib/yaml.dart pkg/yaml/lib/src/composer.dart pkg/yaml/lib/src/utils.dart pkg/yaml/lib/src/yaml_exception.dart pkg/yaml/lib/src/deep_equals.dart pkg/yaml/lib/src/visitor.dart pkg/yaml/lib/src/yaml_map.dart pkg/yaml/lib/src/parser.dart pkg/yaml/lib/src/model.dart pkg/yaml/lib/src/constructor.dart pkg/yaml/test/yaml_test.dart pkg/scheduled_test/lib/scheduled_test.dart pkg/scheduled_test/lib/scheduled_process.dart pkg/scheduled_test/lib/scheduled_server.dart pkg/scheduled_test/lib/descriptor.dart pkg/scheduled_test/lib/src/utils.dart pkg/scheduled_test/lib/src/schedule_error.dart pkg/scheduled_test/lib/src/task.dart pkg/scheduled_test/lib/src/substitute_future.dart pkg/scheduled_test/lib/src/scheduled_future_matchers.dart pkg/scheduled_test/lib/src/value_future.dart pkg/scheduled_test/lib/src/mock_clock.dart pkg/scheduled_test/lib/src/future_group.dart pkg/scheduled_test/lib/src/schedule.dart pkg/scheduled_test/lib/src/scheduled_server/handler.dart pkg/scheduled_test/lib/src/scheduled_server/safe_http_server.dart pkg/scheduled_test/lib/src/descriptor/directory_descriptor.dart pkg/scheduled_test/lib/src/descriptor/async_descriptor.dart pkg/scheduled_test/lib/src/descriptor/nothing_descriptor.dart pkg/scheduled_test/lib/src/descriptor/descriptor.dart pkg/scheduled_test/lib/src/descriptor/file_descriptor.dart pkg/scheduled_test/lib/src/descriptor/pattern_descriptor.dart pkg/scheduled_test/test/utils.dart pkg/scheduled_test/test/substitute_future_test.dart pkg/scheduled_test/test/scheduled_server_test.dart pkg/scheduled_test/test/scheduled_future_matchers_test.dart pkg/scheduled_test/test/metatest.dart pkg/scheduled_test/test/value_future_test.dart pkg/scheduled_test/test/scheduled_process_test.dart pkg/scheduled_test/test/descriptor/utils.dart pkg/scheduled_test/test/descriptor/file_test.dart pkg/scheduled_test/test/descriptor/nothing_test.dart pkg/scheduled_test/test/descriptor/pattern_test.dart pkg/scheduled_test/test/descriptor/directory_test.dart pkg/scheduled_test/test/descriptor/async_test.dart pkg/scheduled_test/test/scheduled_test/current_schedule_state_test.dart pkg/scheduled_test/test/scheduled_test/current_schedule_current_task_test.dart pkg/scheduled_test/test/scheduled_test/nested_task_test.dart pkg/scheduled_test/test/scheduled_test/on_exception_test.dart pkg/scheduled_test/test/scheduled_test/task_return_value_test.dart pkg/scheduled_test/test/scheduled_test/abort_test.dart pkg/scheduled_test/test/scheduled_test/timeout_test.dart pkg/scheduled_test/test/scheduled_test/out_of_band_task_test.dart pkg/scheduled_test/test/scheduled_test/wrap_async_test.dart pkg/scheduled_test/test/scheduled_test/wrap_future_test.dart pkg/scheduled_test/test/scheduled_test/signal_error_test.dart pkg/scheduled_test/test/scheduled_test/set_up_test.dart pkg/scheduled_test/test/scheduled_test/on_complete_test.dart pkg/scheduled_test/test/scheduled_test/simple_test.dart pkg/scheduled_test/test/scheduled_test/current_schedule_errors_test.dart pkg/unittest/lib/unittest.dart pkg/unittest/lib/html_individual_config.dart pkg/unittest/lib/vm_config.dart pkg/unittest/lib/html_enhanced_config.dart pkg/unittest/lib/matcher.dart pkg/unittest/lib/interactive_html_config.dart pkg/unittest/lib/mock.dart pkg/unittest/lib/html_config.dart pkg/unittest/lib/compact_vm_config.dart pkg/unittest/lib/src/expect.dart pkg/unittest/lib/src/basematcher.dart pkg/unittest/lib/src/utils.dart pkg/unittest/lib/src/string_matchers.dart pkg/unittest/lib/src/pretty_print.dart pkg/unittest/lib/src/core_matchers.dart pkg/unittest/lib/src/interfaces.dart pkg/unittest/lib/src/description.dart pkg/unittest/lib/src/future_matchers.dart pkg/unittest/lib/src/numeric_matchers.dart pkg/unittest/lib/src/iterable_matchers.dart pkg/unittest/lib/src/map_matchers.dart pkg/unittest/lib/src/config.dart pkg/unittest/lib/src/test_case.dart pkg/unittest/lib/src/operator_matchers.dart pkg/unittest/test/mock_regexp_negative_test.dart pkg/unittest/test/matchers_minified_test.dart pkg/unittest/test/matchers_test.dart pkg/unittest/test/unittest_test.dart pkg/unittest/test/matchers_unminified_test.dart pkg/unittest/test/test_common.dart pkg/unittest/test/test_utils.dart pkg/unittest/test/pretty_print_test.dart pkg/unittest/test/pretty_print_minified_test.dart pkg/unittest/test/instance_test.dart pkg/unittest/test/pretty_print_unminified_test.dart pkg/unittest/test/mock_test.dart pkg/unittest/test/mock_stepwise_negative_test.dart pkg/args/lib/args.dart pkg/args/lib/src/parser.dart pkg/args/lib/src/usage.dart pkg/args/test/args_test.dart pkg/args/test/usage_test.dart pkg/args/test/command_test.dart pkg/args/test/parse_test.dart pkg/args/example/test_runner.dart pkg/source_maps/lib/span.dart pkg/source_maps/lib/source_maps.dart pkg/source_maps/lib/parser.dart pkg/source_maps/lib/builder.dart pkg/source_maps/lib/printer.dart pkg/source_maps/lib/src/utils.dart pkg/source_maps/lib/src/vlq.dart pkg/source_maps/test/vlq_test.dart pkg/source_maps/test/run.dart pkg/source_maps/test/builder_test.dart pkg/source_maps/test/utils_test.dart pkg/source_maps/test/common.dart pkg/source_maps/test/parser_test.dart pkg/source_maps/test/printer_test.dart pkg/source_maps/test/span_test.dart pkg/source_maps/test/end2end_test.dart FORCE_DO_CMD
 	$(call do_cmd,dart_utils_pub_pub_gyp_pub_target_generate_pub_snapshot)
 
 all_deps += $(obj)/gen/pub.dart.snapshot