Version 0.4.2.0 .

svn merge -r 19417:20113 https://dart.googlecode.com/svn/branches/bleeding_edge trunk

git-svn-id: http://dart.googlecode.com/svn/trunk@20121 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/README b/README
index 3619ce6..9b18a3f 100644
--- a/README
+++ b/README
@@ -3,7 +3,8 @@
 
 For license information, please see LICENSE.
 
-You can find more about Dart online at dartlang.org or code.google.com/p/dart.
+You can find more about Dart online at http://dartlang.org or
+http://code.google.com/p/dart.
 
 Here's a brief guide to what's in here:
 
diff --git a/compiler/dartium.gyp b/compiler/dartium.gyp
index 3be681b..83a32e9 100644
--- a/compiler/dartium.gyp
+++ b/compiler/dartium.gyp
@@ -6,8 +6,6 @@
 # into the dartium build.
 {
   'includes': [
-    # TODO(iposva): Move shared gyp setup to a shared location.
-    '../tools/gyp/xcode.gypi',
     # TODO(mmendez): Add the appropriate gypi includes here.
   ],
   'targets': [
diff --git a/compiler/java/com/google/dart/compiler/CommandLineOptions.java b/compiler/java/com/google/dart/compiler/CommandLineOptions.java
index 6d11bbc..0e3ed28 100644
--- a/compiler/java/com/google/dart/compiler/CommandLineOptions.java
+++ b/compiler/java/com/google/dart/compiler/CommandLineOptions.java
@@ -36,6 +36,10 @@
         usage = "Format errors as normal or machine")
     private String errorFormat = "";
     
+    @Option(name = "--machine", //
+    usage = "Print errors in a format suitable for parsing")
+    private boolean machineFormat = false;
+    
     @Option(name = "--extended-exit-code",
         usage = "0 - clean; 1 - has warnings; 2 - has errors")
     private boolean extendedExitCode = false;
@@ -262,10 +266,16 @@
      * @return the format to use for printing errors
      */
     public ErrorFormat printErrorFormat() {
+      if (machineFormat) {
+        return ErrorFormat.MACHINE;
+      }
+      
       String lowerError = errorFormat.toLowerCase();
+      
       if ("machine".equals(lowerError)) {
         return ErrorFormat.MACHINE;
       }
+      
       return ErrorFormat.NORMAL;
     }
   }
diff --git a/compiler/java/com/google/dart/compiler/PackageLibraryManager.java b/compiler/java/com/google/dart/compiler/PackageLibraryManager.java
index 9a6dd3e..ddd5d8f 100644
--- a/compiler/java/com/google/dart/compiler/PackageLibraryManager.java
+++ b/compiler/java/com/google/dart/compiler/PackageLibraryManager.java
@@ -207,7 +207,12 @@
     shortUri = getRelativeUri(uri);
     if (shortUri != null){
       try {
-        return new URI(null, null, shortUri.getScheme() + ":" +  shortUri.getHost() + shortUri.getPath(),null, null);
+        if (shortUri.getHost() != null){
+          return new URI(null, null, shortUri.getScheme() + ":" +  shortUri.getHost() + shortUri.getPath(),null, null);
+        }
+        else {
+          return new URI(null, null, shortUri.getScheme() + ":" +  shortUri.getSchemeSpecificPart(), null, null);
+        }
       } catch (URISyntaxException e) {
       }
     }
diff --git a/compiler/java/com/google/dart/compiler/UrlLibrarySource.java b/compiler/java/com/google/dart/compiler/UrlLibrarySource.java
index e762294..27fce70 100644
--- a/compiler/java/com/google/dart/compiler/UrlLibrarySource.java
+++ b/compiler/java/com/google/dart/compiler/UrlLibrarySource.java
@@ -35,7 +35,7 @@
     }
     try {
       // Force the creation of an escaped relative URI to deal with spaces, etc.
-      URI uri = getImportBaseUri().resolve(new URI(null, null, relPath, null, null)).normalize();
+      URI uri = getUri().resolve(new URI(null, null, relPath, null, null)).normalize();
       String path = uri.getPath();
       // Resolve relative reference out of one system library into another
       if (PackageLibraryManager.isDartUri(uri)) {
@@ -69,7 +69,7 @@
     }
     try {
       // Force the creation of an escaped relative URI to deal with spaces, etc.
-      URI uri = getImportBaseUri().resolve(new URI(null, null, relPath, null, null)).normalize();
+      URI uri = getUri().resolve(new URI(null, null, relPath, null, null)).normalize();
       if (PackageLibraryManager.isPackageUri(uri)) {
         URI fileUri = packageLibraryManager.resolveDartUri(uri);
         if (fileUri != null) {
@@ -121,13 +121,4 @@
     String path = uri.getPath();
     return path == null || new File(path).exists();
   }
-
-  /**
-   * @return the {@link URI} to use as a base for resolving imports. Usually same as {@link #getUri()},
-   * but in case of Dart code in HTML may be mapped {@link URI}.
-   */
-  protected URI getImportBaseUri() {
-    return getUri();
-  }
-
 }
diff --git a/compiler/java/com/google/dart/compiler/ast/ASTNodes.java b/compiler/java/com/google/dart/compiler/ast/ASTNodes.java
index 88a322f..2e3b87f 100644
--- a/compiler/java/com/google/dart/compiler/ast/ASTNodes.java
+++ b/compiler/java/com/google/dart/compiler/ast/ASTNodes.java
@@ -21,7 +21,6 @@
 import com.google.dart.compiler.resolver.ElementKind;
 import com.google.dart.compiler.resolver.FieldElement;
 import com.google.dart.compiler.resolver.MethodElement;
-import com.google.dart.compiler.resolver.NodeElement;
 import com.google.dart.compiler.resolver.VariableElement;
 import com.google.dart.compiler.type.InterfaceType;
 import com.google.dart.compiler.type.Type;
@@ -196,7 +195,7 @@
    *         {@link DartIdentifier} is the field reference, or <code>null</code> in the other case.
    */
   public static FieldElement getFieldElement(DartIdentifier node) {
-    NodeElement element = node.getElement();
+    Element element = node.getElement();
     if (ElementKind.of(element) == ElementKind.FIELD) {
       return (FieldElement) element;
     }
@@ -867,7 +866,7 @@
    *         other case.
    */
   public static VariableElement getVariableElement(DartIdentifier node) {
-    NodeElement element = node.getElement();
+    Element element = node.getElement();
     if (ElementKind.of(element) == ElementKind.VARIABLE) {
       return (VariableElement) element;
     }
@@ -880,7 +879,7 @@
    *         local variable or parameter, or <code>null</code> in the other case.
    */
   public static VariableElement getVariableOrParameterElement(DartIdentifier node) {
-    NodeElement element = node.getElement();
+    Element element = node.getElement();
     if (element instanceof VariableElement) {
       return (VariableElement) element;
     }
diff --git a/compiler/java/com/google/dart/compiler/ast/DartCommentNewName.java b/compiler/java/com/google/dart/compiler/ast/DartCommentNewName.java
index 1ab676f..e1ef173 100644
--- a/compiler/java/com/google/dart/compiler/ast/DartCommentNewName.java
+++ b/compiler/java/com/google/dart/compiler/ast/DartCommentNewName.java
@@ -6,6 +6,7 @@
 
 import com.google.dart.compiler.resolver.ClassElement;
 import com.google.dart.compiler.resolver.ConstructorElement;
+import com.google.dart.compiler.util.StringInterner;
 
 /**
  * <code>[new Class.name]</code> in {@link DartComment}.
@@ -22,9 +23,9 @@
       int constructorOffset) {
     assert className != null;
     assert constructorName != null;
-    this.className = className;
+    this.className = StringInterner.intern(className);
     this.classOffset = classOffset;
-    this.constructorName = constructorName;
+    this.constructorName = StringInterner.intern(constructorName);
     this.constructorOffset = constructorOffset;
   }
 
diff --git a/compiler/java/com/google/dart/compiler/ast/DartCommentRefName.java b/compiler/java/com/google/dart/compiler/ast/DartCommentRefName.java
index 52c133e..95a1bbd 100644
--- a/compiler/java/com/google/dart/compiler/ast/DartCommentRefName.java
+++ b/compiler/java/com/google/dart/compiler/ast/DartCommentRefName.java
@@ -5,6 +5,7 @@
 package com.google.dart.compiler.ast;
 
 import com.google.dart.compiler.resolver.Element;
+import com.google.dart.compiler.util.StringInterner;
 
 /**
  * <code>[name]</code> in {@link DartComment}.
@@ -15,7 +16,7 @@
 
   public DartCommentRefName(String name) {
     assert name != null;
-    this.name = name;
+    this.name = StringInterner.intern(name);
   }
 
   @Override
diff --git a/compiler/java/com/google/dart/compiler/ast/DartIdentifier.java b/compiler/java/com/google/dart/compiler/ast/DartIdentifier.java
index 09eadc2..46ff36f 100644
--- a/compiler/java/com/google/dart/compiler/ast/DartIdentifier.java
+++ b/compiler/java/com/google/dart/compiler/ast/DartIdentifier.java
@@ -5,7 +5,7 @@
 package com.google.dart.compiler.ast;
 
 import com.google.dart.compiler.resolver.Element;
-import com.google.dart.compiler.resolver.NodeElement;
+import com.google.dart.compiler.util.StringInterner;
 
 /**
  * Represents a Dart identifier expression.
@@ -13,20 +13,20 @@
 public class DartIdentifier extends DartExpression {
 
   private final String name;
-  private NodeElement element;
+  private Element element;
   private boolean resolutionAlreadyReportedThatTheMethodCouldNotBeFound;
 
   public DartIdentifier(String name) {
     assert name != null;
-    this.name = name;
+    this.name = StringInterner.intern(name);
   }
 
   public DartIdentifier(DartIdentifier original) {
-    this.name = original.name;
+    this.name = StringInterner.intern(original.name);
   }
 
   @Override
-  public NodeElement getElement() {
+  public Element getElement() {
     return element;
   }
 
@@ -47,7 +47,7 @@
 
   @Override
   public void setElement(Element element) {
-    this.element = (NodeElement) element;
+    this.element = element;
   }
 
   /**
diff --git a/compiler/java/com/google/dart/compiler/ast/DartInvocation.java b/compiler/java/com/google/dart/compiler/ast/DartInvocation.java
index 477c4c3..1a3a0a2 100644
--- a/compiler/java/com/google/dart/compiler/ast/DartInvocation.java
+++ b/compiler/java/com/google/dart/compiler/ast/DartInvocation.java
@@ -5,7 +5,6 @@
 package com.google.dart.compiler.ast;
 
 import com.google.dart.compiler.resolver.Element;
-import com.google.dart.compiler.resolver.NodeElement;
 
 import java.util.List;
 
@@ -36,7 +35,7 @@
 public abstract class DartInvocation extends DartExpression {
 
   private final NodeList<DartExpression> arguments = NodeList.create(this);
-  private NodeElement element;
+  private Element element;
 
   public DartInvocation(List<DartExpression> arguments) {
     if (arguments != null && !arguments.isEmpty()) {
@@ -53,12 +52,12 @@
   }
 
   @Override
-  public NodeElement getElement() {
+  public Element getElement() {
     return element;
   }
 
   @Override
   public void setElement(Element element) {
-    this.element = (NodeElement) element;
+    this.element = element;
   }
 }
diff --git a/compiler/java/com/google/dart/compiler/ast/DartPropertyAccess.java b/compiler/java/com/google/dart/compiler/ast/DartPropertyAccess.java
index 3b7fb9c..9c1c903 100644
--- a/compiler/java/com/google/dart/compiler/ast/DartPropertyAccess.java
+++ b/compiler/java/com/google/dart/compiler/ast/DartPropertyAccess.java
@@ -5,7 +5,6 @@
 package com.google.dart.compiler.ast;
 
 import com.google.dart.compiler.resolver.Element;
-import com.google.dart.compiler.resolver.NodeElement;
 
 /**
  * Represents a Dart property access expression (a.b).
@@ -71,7 +70,7 @@
   }
 
   @Override
-  public NodeElement getElement() {
+  public Element getElement() {
     return name.getElement();
   }
 
diff --git a/compiler/java/com/google/dart/compiler/ast/DartStringLiteral.java b/compiler/java/com/google/dart/compiler/ast/DartStringLiteral.java
index e2a83bf..9aacf4e 100644
--- a/compiler/java/com/google/dart/compiler/ast/DartStringLiteral.java
+++ b/compiler/java/com/google/dart/compiler/ast/DartStringLiteral.java
@@ -6,6 +6,7 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.dart.compiler.resolver.Element;
+import com.google.dart.compiler.util.StringInterner;
 
 import java.util.List;
 
@@ -28,7 +29,7 @@
   private final List<DartStringLiteral> parts;
 
   private DartStringLiteral(String value, List<DartStringLiteral> parts) {
-    this.value = value;
+    this.value = StringInterner.intern(value);
     this.parts = parts;
   }
 
diff --git a/compiler/java/com/google/dart/compiler/resolver/AbstractNodeElement.java b/compiler/java/com/google/dart/compiler/resolver/AbstractNodeElement.java
index 50ec6a1..2c5a703 100644
--- a/compiler/java/com/google/dart/compiler/resolver/AbstractNodeElement.java
+++ b/compiler/java/com/google/dart/compiler/resolver/AbstractNodeElement.java
@@ -10,6 +10,7 @@
 import com.google.dart.compiler.common.SourceInfo;
 import com.google.dart.compiler.type.Type;
 import com.google.dart.compiler.type.Types;
+import com.google.dart.compiler.util.StringInterner;
 
 abstract class AbstractNodeElement implements Element, NodeElement {
   private final DartNode node;
@@ -20,7 +21,7 @@
     // TODO(scheglov) in the future we will not use ASTNode and remove null check
     this.sourceInfo = node != null ? node.getSourceInfo() : SourceInfo.UNKNOWN;
     this.node = node;
-    this.name = name;
+    this.name = StringInterner.intern(name);
   }
 
   @Override
diff --git a/compiler/java/com/google/dart/compiler/resolver/TypeErrorCode.java b/compiler/java/com/google/dart/compiler/resolver/TypeErrorCode.java
index 20c4aa6..c121dbe 100644
--- a/compiler/java/com/google/dart/compiler/resolver/TypeErrorCode.java
+++ b/compiler/java/com/google/dart/compiler/resolver/TypeErrorCode.java
@@ -63,7 +63,6 @@
   OPERATOR_INDEX_ASSIGN_VOID_RETURN_TYPE("operator '[]=' must have a return type of 'void'"),
   OPERATOR_WRONG_OPERAND_TYPE("operand of \"%s\" must be assignable to \"%s\", found \"%s\""),
   OVERRIDING_STATIC_MEMBER("overriding static member \"%s\" of \"%s\""),
-  PLUS_CANNOT_BE_USED_FOR_STRING_CONCAT("'%s' cannot be used for string concatentation, use string interpolation or a StringBuffer instead"),
   REDIRECTION_CONSTRUCTOR_TARGET_MUST_BE_SUBTYPE(
       "Target type of redirecting factory constructor '%s' is not subtype of '%s'"),
   SETTER_RETURN_TYPE("Specified return type of setter '%s' is non-void"),
@@ -128,4 +127,4 @@
   public boolean needsRecompilation() {
     return this.needsRecompilation;
   }
-}
\ No newline at end of file
+}
diff --git a/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java b/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
index 15ee2bb..4a5539b 100644
--- a/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
+++ b/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
@@ -118,7 +118,6 @@
 import com.google.dart.compiler.resolver.FieldElement;
 import com.google.dart.compiler.resolver.FunctionAliasElement;
 import com.google.dart.compiler.resolver.MethodElement;
-import com.google.dart.compiler.resolver.NodeElement;
 import com.google.dart.compiler.resolver.ResolverErrorCode;
 import com.google.dart.compiler.resolver.TypeErrorCode;
 import com.google.dart.compiler.resolver.VariableElement;
@@ -268,7 +267,7 @@
     void setCurrentClass(InterfaceType type) {
       currentClass = type;
     }
-    
+
     @VisibleForTesting
     void pushBasicBlockContext() {
       blockOldTypes.addFirst(new BlockTypeContext());
@@ -379,6 +378,7 @@
         FunctionType methodType = getMethodType(lhsType, member, methodName, diagnosticNode);
         checkDeprecated(problemTarget, element);
         Type returnType = checkInvocation(Collections.<DartExpression> singletonList(rhs),
+            Collections.<Type> singletonList(rhsType),
             diagnosticNode, methodName, methodType, null);
         // tweak return type for int/int and int/double operators
         {
@@ -407,7 +407,7 @@
         return dynamicType;
       }
     }
-    
+
     private Type analyzeTernaryOperator(DartNode node, Type lhsType, Token operator,
         DartNode diagnosticNode, DartExpression arg1, DartExpression arg2) {
       String methodName = methodNameForBinaryOperator(operator);
@@ -460,9 +460,7 @@
           return rhs;
         }
 
-        case ASSIGN_ADD: {
-          checkStringConcatPlus(node, lhs);
-        }
+        case ASSIGN_ADD:
         case ASSIGN_SUB:
         case ASSIGN_MUL:
         case ASSIGN_DIV:
@@ -522,9 +520,7 @@
           }
         }
 
-        case ADD:  {
-          checkStringConcatPlus(node, lhs);
-        }
+        case ADD:
         case SUB:
         case MUL:
         case DIV:
@@ -597,14 +593,6 @@
       }
     }
 
-    private void checkStringConcatPlus(DartBinaryExpression binary, Type lhs) {
-      if (Objects.equal(lhs, stringType)) {
-        Token operator = binary.getOperator();
-        HasSourceInfo errorTarget = getOperatorHasSourceInfo(binary);
-        onError(errorTarget, TypeErrorCode.PLUS_CANNOT_BE_USED_FOR_STRING_CONCAT, operator);
-      }
-    }
-
     /**
      * @return the best guess for operator token location in the given {@link DartNode}.
      */
@@ -1025,7 +1013,7 @@
         setVariableElementType(variable, mergedType, mergedTypeQuality);
       }
     }
-    
+
     private boolean isAssignable(Type t, Type s) {
       t.getClass(); // Null check.
       s.getClass(); // Null check.
@@ -1074,7 +1062,7 @@
       }
       return functionType;
     }
-      
+
     private FunctionType getMethodType0(Type receiver, Member member, String name,
         DartNode diagnosticNode) {
       if (member == null) {
@@ -1204,7 +1192,7 @@
           argumentIndex++;
         }
       }
-      
+
       // Check named parameters.
       {
         Set<String> usedNamedParametersPositional = Sets.newHashSet();
@@ -1311,7 +1299,7 @@
         for (int i = 0; i < arguments.size(); i++) {
           Type t = bounds.get(i);
           Type s = arguments.get(i);
-          if (!types.isAssignable(t, s)) {
+          if (!types.isSubtype(s, t)) {
             onError(diagnosticNodes.get(i),
                 TypeErrorCode.TYPE_NOT_ASSIGNMENT_COMPATIBLE, s, t);
           }
@@ -1414,7 +1402,7 @@
       Type result = analyzeBinaryOperator(node, target, Token.INDEX, node, argKey);
       return Types.makeInferred(result, target.getQuality());
     }
-    
+
     /**
      * Asserts that given {@link DartExpression} is valid for using in "assert" statement.
      */
@@ -1787,7 +1775,7 @@
       } else {
         variableType = typeOf(node.getIdentifier());
         // in most cases variable, but sometimes field
-        NodeElement identifierElement = node.getIdentifier().getElement();
+        Element identifierElement = node.getIdentifier().getElement();
         if (identifierElement instanceof VariableElement) {
           variableElement = (VariableElement) identifierElement;
         }
@@ -1927,7 +1915,7 @@
 
         case CLASS:
           return element.getType();
-          
+
         case FIELD:
           type = typeAsMemberOf(element, currentClass);
           // try to resolve as getter/setter
@@ -2454,7 +2442,7 @@
         case FIELD:
           FieldElement fieldElement = (FieldElement) element;
           Modifiers fieldModifiers = fieldElement.getModifiers();
-          
+
           // Prepare getter/setter members.
           Member getterMember;
           Member setterMember;
@@ -2690,7 +2678,7 @@
       blockOldTypes.addFirst(new BlockTypeContext());
       return typeAsVoid(node);
     }
-    
+
     @Override
     public Type visitAssertStatement(DartAssertStatement node) {
       DartExpression condition = node.getCondition();
@@ -2780,7 +2768,7 @@
      * Report warning if given {@link Element} is deprecated.
      */
     private void checkDeprecated(HasSourceInfo nameNode, Element element) {
-      if (element != null && element.getMetadata().isDeprecated()) {
+      if (element != null && element.getMetadata() != null && element.getMetadata().isDeprecated()) {
         onError(nameNode, TypeErrorCode.DEPRECATED_ELEMENT,
             Elements.getDeprecatedElementTitle(element));
       }
@@ -2807,6 +2795,11 @@
         Type argumentType = getInvocationArgumentType(argumentNode);
         argumentTypes.add(argumentType);
       }
+      return checkInvocation(argumentNodes, argumentTypes, diagnosticNode, name, type, parameters);
+    }
+
+    private Type checkInvocation(List<DartExpression> argumentNodes, List<Type> argumentTypes,
+        DartNode diagnosticNode, String name, Type type, List<VariableElement> parameters) {
       // Check that argument types are compatible with type of invoked object.
       try {
         switch (TypeKind.of(type)) {
@@ -3121,7 +3114,7 @@
     public Type visitImportDirective(DartImportDirective node) {
       return voidType;
     }
-    
+
     @Override
     public Type visitExportDirective(DartExportDirective node) {
       return voidType;
@@ -3232,7 +3225,7 @@
             }
           }
         }
-        
+
         // visit mixins
         for (InterfaceType mixType : currentClass.getElement().getMixins()) {
           ClassElement mixElement = mixType.getElement();
@@ -3240,7 +3233,7 @@
             removeSuperMemberIfNotAbstract(member);
           }
         }
-        
+
         // Remove artificial "setter " members.
         for (String name : artificialNames) {
           superMembers.removeAll(name);
@@ -3258,7 +3251,7 @@
             }
           }
         }
-        
+
         // add abstract members of current class
         for (Element member : currentClass.getElement().getMembers()) {
           if (ElementKind.of(member) == ElementKind.FIELD && member.getModifiers().isAbstractField()) {
@@ -3275,7 +3268,7 @@
             unimplementedElements.add(member);
           }
         }
-        
+
         return null;
       }
 
@@ -3660,7 +3653,7 @@
     return type != null && TypeKind.of(type) != TypeKind.DYNAMIC
         && !TypeQuality.isInferred(type);
   }
-  
+
   /**
    * @return the {@link TypeQuality} of given {@link DartExpression}.
    */
@@ -3709,7 +3702,7 @@
     Type type = expr.getType();
     return isCoreType(type, "bool") || isCoreType(type, "int") || isCoreType(type, "double");
   }
-  
+
   private static boolean isCoreType(Type type, String name) {
     return type != null
         && Elements.isCoreLibrarySource(type.getElement().getSourceInfo().getSource())
diff --git a/compiler/java/com/google/dart/compiler/type/Types.java b/compiler/java/com/google/dart/compiler/type/Types.java
index 44f401e..8e83daf 100644
--- a/compiler/java/com/google/dart/compiler/type/Types.java
+++ b/compiler/java/com/google/dart/compiler/type/Types.java
@@ -344,6 +344,21 @@
         return isSubtype(tBound, sv);
       }
     }
+    // May be concrete InterfaceType.
+    if (t.getKind() == TypeKind.INTERFACE) {
+      InterfaceType ti = (InterfaceType) t;
+      Type sBound = sv.getTypeVariableElement().getBound();
+      if (sBound == null) {
+        return true;
+      }
+      // Prevent cycle.
+      if (sBound.equals(sv)) {
+        return false;
+      }
+      if (sBound.getKind() == TypeKind.INTERFACE) {
+        return isSubtype(ti, sBound);
+      }
+    }
     // no
     return false;
   }
diff --git a/compiler/java/com/google/dart/compiler/util/StringInterner.java b/compiler/java/com/google/dart/compiler/util/StringInterner.java
new file mode 100644
index 0000000..e33118e
--- /dev/null
+++ b/compiler/java/com/google/dart/compiler/util/StringInterner.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2013, the Dart project authors.
+ * 
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ * 
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.google.dart.compiler.util;
+
+import com.google.common.collect.Interner;
+import com.google.common.collect.Interners;
+
+public class StringInterner {
+  private static Interner<String> INTERNER = Interners.newStrongInterner();
+  
+  public static String intern(String s) {
+    if (s == null) {
+      return null;
+    }
+    s = new String(s);
+    return INTERNER.intern(s);
+//    return s;
+  }
+}
diff --git a/compiler/javatests/com/google/dart/compiler/resolver/ResolverTestCase.java b/compiler/javatests/com/google/dart/compiler/resolver/ResolverTestCase.java
index bf2ddf8..7de5552 100644
--- a/compiler/javatests/com/google/dart/compiler/resolver/ResolverTestCase.java
+++ b/compiler/javatests/com/google/dart/compiler/resolver/ResolverTestCase.java
@@ -209,7 +209,7 @@
 
       ClassElement stringElement = Elements.classNamed("String");
       stringType = Types.interfaceType(stringElement, Collections.<Type>emptyList());
-      intElement.setType(intType);
+      stringElement.setType(stringType);
 
       ClassElement functionElement = Elements.classNamed("Function");
       functionType = Types.interfaceType(functionElement, Collections.<Type>emptyList());
@@ -223,7 +223,7 @@
       ClassElement listElement = Elements.classNamed("List");
       defaultListType = Types.interfaceType(listElement, Lists.<Type>newArrayList(dynamicType));
       listElement.setType(defaultListType);
-      
+
       ClassElement typeElement = Elements.classNamed("Type");
       typeType = Types.interfaceType(typeElement, Collections.<Type>emptyList());
       listElement.setType(defaultListType);
diff --git a/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java b/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java
index d84e226..1e4e281 100644
--- a/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java
+++ b/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java
@@ -46,7 +46,6 @@
 import com.google.dart.compiler.resolver.FieldElement;
 import com.google.dart.compiler.resolver.LibraryElement;
 import com.google.dart.compiler.resolver.MethodElement;
-import com.google.dart.compiler.resolver.NodeElement;
 import com.google.dart.compiler.resolver.ResolverErrorCode;
 import com.google.dart.compiler.resolver.TypeErrorCode;
 import com.google.dart.compiler.resolver.VariableElement;
@@ -1553,9 +1552,9 @@
       invocation = (DartUnqualifiedInvocation) stmt.getExpression();
     }
     // Check that unqualified foo() invocation is resolved to the top-level (library) function.
-    NodeElement element = invocation.getTarget().getElement();
+    Element element = invocation.getTarget().getElement();
     assertNotNull(element);
-    assertSame(testUnit, element.getNode().getParent());
+    assertTrue(element.getEnclosingElement() instanceof LibraryElement);
   }
 
   /**
@@ -2013,6 +2012,23 @@
     assertErrors(result.getErrors());
   }
 
+  /**
+   * <p>
+   * https://codereview.chromium.org/12787002/
+   */
+  public void test_typeVariableBounds_12787002() throws Exception {
+    AnalyzeLibraryResult result =
+        analyzeLibrary(
+            "// filler filler filler filler filler filler filler filler filler filler",
+            "class A<T> {",
+            "  m() {",
+            "    B a = this;",
+            "  }",
+            "}",
+            "class B extends A<String> {}");
+    assertErrors(result.getErrors());
+  }
+
   public void test_typeVariableBoundsMismatch() throws Exception {
     AnalyzeLibraryResult result =
         analyzeLibrary(
@@ -5170,7 +5186,7 @@
       assertSame(typeA, type);
       // .named
       DartIdentifier nameNode = findNode(DartIdentifier.class, "named;");
-      NodeElement nameElement = nameNode.getElement();
+      Element nameElement = nameNode.getElement();
       assertNotNull(nameElement);
       assertSame(elementA.lookupConstructor("named"), nameElement);
     }
@@ -6510,4 +6526,16 @@
         errEx(ResolverErrorCode.CANNOT_MIXIN_CLASS_WITH_MIXINS, 2, 25, 1));
   }
 
+  public void test_StringPlus() throws Exception {
+    AnalyzeLibraryResult result = analyzeLibrary(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "main() {",
+        "  var v1 = '1' + '2';",
+        "  var v2 = '1' + 2;",
+        "}",
+        "");
+    assertErrors(
+        result.getErrors(),
+        errEx(TypeErrorCode.TYPE_NOT_ASSIGNMENT_COMPATIBLE, 4, 18, 1));
+  }
 }
diff --git a/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerTest.java b/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerTest.java
index 8f67edc..c2cc676f 100644
--- a/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerTest.java
+++ b/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerTest.java
@@ -1199,23 +1199,4 @@
     analyzeFail("while ('') {}",
       TypeErrorCode.TYPE_NOT_ASSIGNMENT_COMPATIBLE);
   }
-
-  public void testStringConcat() {
-    Map<String, ClassNodeElement> source = loadSource(
-        "class Object {}",
-        "abstract class Foo {",
-        "  operator +(arg1);" +
-        "}",
-        "Foo a = new Foo();",
-        "Foo b = new Foo();",
-        "String s = 'foo';");
-    analyzeClasses(source);
-    analyze("{ var c = a + b; }");
-    analyzeFail("{ var c = s + b; }",
-        TypeErrorCode.PLUS_CANNOT_BE_USED_FOR_STRING_CONCAT);
-    analyzeFail("var c = 'foo' + 1;",
-        TypeErrorCode.PLUS_CANNOT_BE_USED_FOR_STRING_CONCAT);
-    analyzeFail("var c = 'foo' + 'bar';",
-        TypeErrorCode.PLUS_CANNOT_BE_USED_FOR_STRING_CONCAT);
-  }
 }
diff --git a/pkg/analyzer-experimental/lib/src/generated/engine.dart b/pkg/analyzer-experimental/lib/src/generated/engine.dart
deleted file mode 100644
index b1f1265..0000000
--- a/pkg/analyzer-experimental/lib/src/generated/engine.dart
+++ /dev/null
@@ -1,660 +0,0 @@
-// This code was auto-generated, is not intended to be edited, and is subject to
-// significant change. Please see the README file for more information.
-
-library engine;
-
-import 'java_core.dart';
-import 'dart:collection' show HasNextIterator;
-import 'error.dart';
-import 'source.dart';
-import 'scanner.dart' show Token, CharBufferScanner, StringScanner;
-import 'ast.dart' show CompilationUnit;
-import 'parser.dart' show Parser;
-import 'element.dart';
-import 'resolver.dart' show Namespace, NamespaceBuilder, LibraryResolver;
-
-/**
- * The unique instance of the class {@code AnalysisEngine} serves as the entry point for the
- * functionality provided by the analysis engine.
- */
-class AnalysisEngine {
-  /**
-   * 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;
-  /**
-   * 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
-   */
-  AnalysisContext createAnalysisContext() => new AnalysisContextImpl();
-  /**
-   * Return the logger that should receive information about errors within the analysis engine.
-   * @return the logger that should receive information about errors within the analysis engine
-   */
-  Logger get logger => _logger;
-  /**
-   * Set the logger that should receive information about errors within the analysis engine to the
-   * given logger.
-   * @param logger the logger that should receive information about errors within the analysis
-   * engine
-   */
-  void set logger(Logger logger2) {
-    this._logger = logger2 == null ? Logger.NULL : logger2;
-  }
-}
-/**
- * The interface {@code AnalysisContext} defines the behavior of objects that represent a context in
- * which analysis can be performed. The context includes such information as the version of the SDK
- * being analyzed against as well as the package-root used to resolve 'package:' URI's. This
- * information is included indirectly through the {@link SourceFactory source factory}.
- * <p>
- * Analysis engine allows for having more than one context. This can be used, for example, to
- * perform one analysis based on the state of files on disk and a separate analysis based on the
- * state of those files in open editors. It can also be used to perform an analysis based on a
- * proposed future state, such as after a refactoring.
- */
-abstract class AnalysisContext {
-  /**
-   * Clear any cached information that is dependent on resolution. This method should be invoked if
-   * the assumptions used by resolution have changed but the contents of the file have not changed.
-   * Use {@link #sourceChanged(Source)} and {@link #sourcesDeleted(SourceContainer)} to indicate
-   * when the contents of a file or files have changed.
-   */
-  void clearResolution();
-  /**
-   * Call this method when this context is no longer going to be used. At this point, the receiver
-   * may choose to push some of its information back into the global cache for consumption by
-   * another context for performance.
-   */
-  void discard();
-  /**
-   * Create a new context in which analysis can be performed. Any sources in the specified directory
-   * in the receiver will be removed from the receiver and added to the newly created context.
-   * @param directory the directory (not {@code null}) containing sources that should be removed
-   * from the receiver and added to the returned context
-   * @return the analysis context that was created (not {@code null})
-   */
-  AnalysisContext extractAnalysisContext(SourceContainer container);
-  /**
-   * Answer the collection of sources that have been added to the receiver via{@link #sourceAvailable(Source)} and not removed from the receiver via{@link #sourceDeleted(Source)} or {@link #sourcesDeleted(SourceContainer)}.
-   * @return a collection of sources (not {@code null}, contains no {@code null}s)
-   */
-  Collection<Source> get availableSources;
-  /**
-   * Return the element referenced by the given location.
-   * @param location the reference describing the element to be returned
-   * @return the element referenced by the given location
-   */
-  Element getElement(ElementLocation location);
-  /**
-   * Return an array containing all of the errors associated with the given source.
-   * @param source the source whose errors are to be returned
-   * @return all of the errors associated with the given source
-   * @throws AnalysisException if the errors could not be determined because the analysis could not
-   * be performed
-   */
-  List<AnalysisError> getErrors(Source source);
-  /**
-   * Parse and build an element model for the HTML file defined by the given source.
-   * @param source the source defining the HTML file whose element model is to be returned
-   * @return the element model corresponding to the HTML file defined by the given source
-   */
-  HtmlElement getHtmlElement(Source source);
-  /**
-   * Return the kind of the given source if it is already known, or {@code null} if the kind is not
-   * already known.
-   * @param source the source whose kind is to be returned
-   * @return the kind of the given source
-   * @see #getOrComputeKindOf(Source)
-   */
-  SourceKind getKnownKindOf(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
-   * for a library can long-running, depending on the size of the library and the number of
-   * libraries that are imported into it that also need to have a model built for them.
-   * @param source the source defining the library whose element model is to be returned
-   * @return the element model corresponding to the library defined by the given source or{@code null} if the element model could not be determined because the analysis could
-   * not be performed
-   */
-  LibraryElement getLibraryElement(Source source);
-  /**
-   * Return the element model corresponding to the library defined by the given source, or{@code null} if the element model does not yet exist.
-   * @param source the source defining the library whose element model is to be returned
-   * @return the element model corresponding to the library defined by the given source
-   */
-  LibraryElement getLibraryElementOrNull(Source source);
-  /**
-   * Return the kind of the given source, computing it's kind if it is not already known.
-   * @param source the source whose kind is to be returned
-   * @return the kind of the given source
-   * @see #getKnownKindOf(Source)
-   */
-  SourceKind getOrComputeKindOf(Source source);
-  /**
-   * Return an array containing all of the parsing errors associated with the given source.
-   * @param source the source whose errors are to be returned
-   * @return all of the parsing errors associated with the given source
-   * @throws AnalysisException if the errors could not be determined because the analysis could not
-   * be performed
-   */
-  List<AnalysisError> getParsingErrors(Source source);
-  /**
-   * Return an array containing all of the resolution errors associated with the given source.
-   * @param source the source whose errors are to be returned
-   * @return all of the resolution errors associated with the given source
-   * @throws AnalysisException if the errors could not be determined because the analysis could not
-   * be performed
-   */
-  List<AnalysisError> getResolutionErrors(Source source);
-  /**
-   * 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;
-  /**
-   * Add the sources contained in the specified context to the receiver's collection of sources.
-   * This method is called when an existing context's pubspec has been removed, and the contained
-   * sources should be reanalyzed as part of the receiver.
-   * @param context the context being merged (not {@code null})
-   */
-  void mergeAnalysisContext(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.
-   * @param source the source to be parsed
-   * @return the AST structure representing the content of the source
-   * @throws AnalysisException if the analysis could not be performed
-   */
-  CompilationUnit parse(Source source);
-  /**
-   * Parse and resolve a single source within the given context to produce a fully resolved AST.
-   * @param source the source to be parsed and resolved
-   * @param library the library defining the context in which the source file is to be resolved
-   * @return the result of resolving the AST structure representing the content of the source
-   * @throws AnalysisException if the analysis could not be performed
-   */
-  CompilationUnit resolve(Source source, LibraryElement library);
-  /**
-   * Scan a single source to produce a token stream.
-   * @param source the source to be scanned
-   * @param errorListener the listener to which errors should be reported
-   * @return the head of the token stream representing the content of the source
-   * @throws AnalysisException if the analysis could not be performed
-   */
-  Token scan(Source source, AnalysisErrorListener errorListener);
-  /**
-   * Set the source factory used to create the sources that can be analyzed in this context to the
-   * given source factory.
-   * @param sourceFactory the source factory used to create the sources that can be analyzed in this
-   * context
-   */
-  void set sourceFactory(SourceFactory sourceFactory4);
-  /**
-   * Cache the fact that content for the given source is now available, is of interest to the
-   * client, and should be analyzed. Do not modify or discard any information about this source that
-   * is already cached.
-   * @param source the source that is now available
-   */
-  void sourceAvailable(Source source);
-  /**
-   * Respond to the fact that the content of the given source has changed by removing any cached
-   * information that might now be out-of-date.
-   * @param source the source whose content has changed
-   */
-  void sourceChanged(Source source);
-  /**
-   * Respond to the fact that the given source has been deleted and should no longer be analyzed by
-   * removing any cached information that might now be out-of-date.
-   * @param source the source that was deleted
-   */
-  void sourceDeleted(Source source);
-  /**
-   * Discard cached information for all files in the specified source container.
-   * @param container the source container that was deleted (not {@code null})
-   */
-  void sourcesDeleted(SourceContainer container);
-  /**
-   * 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)
-   * @return An iterable returning the sources to be resolved
-   */
-  Iterable<Source> sourcesToResolve(List<Source> changedSources);
-}
-/**
- * Instances of the class {@code AnalysisException} represent an exception that occurred during the
- * analysis of one or more sources.
- */
-class AnalysisException extends JavaException {
-  /**
-   * Initialize a newly created exception.
-   */
-  AnalysisException() : super() {
-    _jtd_constructor_117_impl();
-  }
-  _jtd_constructor_117_impl() {
-  }
-  /**
-   * Initialize a newly created exception to have the given message.
-   * @param message the message associated with the exception
-   */
-  AnalysisException.con1(String message) : super(message) {
-    _jtd_constructor_118_impl(message);
-  }
-  _jtd_constructor_118_impl(String message) {
-  }
-  /**
-   * Initialize a newly created exception to have the given message and cause.
-   * @param message the message associated with the exception
-   * @param cause the underlying exception that caused this exception
-   */
-  AnalysisException.con2(String message, Exception cause) : super(message, cause) {
-    _jtd_constructor_119_impl(message, cause);
-  }
-  _jtd_constructor_119_impl(String message, Exception cause) {
-  }
-  /**
-   * Initialize a newly created exception to have the given cause.
-   * @param cause the underlying exception that caused this exception
-   */
-  AnalysisException.con3(Exception cause) : super.withCause(cause) {
-    _jtd_constructor_120_impl(cause);
-  }
-  _jtd_constructor_120_impl(Exception cause) {
-  }
-}
-/**
- * Instances of the class {@code AnalysisContextImpl} implement an {@link AnalysisContext analysis
- * context}.
- */
-class AnalysisContextImpl implements AnalysisContext {
-  /**
-   * The source factory used to create the sources that can be analyzed in this context.
-   */
-  SourceFactory _sourceFactory;
-  /**
-   * A cache mapping sources to the compilation units that were produced for the contents of the
-   * source.
-   */
-  Map<Source, CompilationUnit> _parseCache = new Map<Source, CompilationUnit>();
-  /**
-   * A cache mapping sources (of the defining compilation units of libraries) to the library
-   * elements for those libraries.
-   */
-  Map<Source, LibraryElement> _libraryElementCache = new Map<Source, LibraryElement>();
-  /**
-   * A cache mapping sources (of the defining compilation units of libraries) to the public
-   * namespace for that library.
-   */
-  Map<Source, Namespace> _publicNamespaceCache = new Map<Source, Namespace>();
-  /**
-   * A cache of the available sources of interest to the client. Sources are added to this
-   * collection via {@link #sourceAvailable(Source)} and removed from this collection via{@link #sourceDeleted(Source)} and {@link #directoryDeleted(File)}
-   */
-  Set<Source> _availableSources = new Set<Source>();
-  /**
-   * The object used to synchronize access to all of the caches.
-   */
-  Object _cacheLock = new Object();
-  /**
-   * The suffix used by sources that contain Dart.
-   */
-  static String _DART_SUFFIX = ".dart";
-  /**
-   * The suffix used by sources that contain HTML.
-   */
-  static String _HTML_SUFFIX = ".html";
-  /**
-   * Initialize a newly created analysis context.
-   */
-  AnalysisContextImpl() : super() {
-  }
-  void clearResolution() {
-    {
-      _parseCache.clear();
-      _libraryElementCache.clear();
-      _publicNamespaceCache.clear();
-    }
-  }
-  void discard() {
-    {
-      _parseCache.clear();
-      _libraryElementCache.clear();
-      _publicNamespaceCache.clear();
-      _availableSources.clear();
-    }
-  }
-  AnalysisContext extractAnalysisContext(SourceContainer container) {
-    AnalysisContext newContext = AnalysisEngine.instance.createAnalysisContext();
-    {
-      JavaIterator<Source> iter = new JavaIterator(_availableSources);
-      while (iter.hasNext) {
-        Source source = iter.next();
-        if (container.contains(source)) {
-          iter.remove();
-          newContext.sourceAvailable(source);
-        }
-      }
-    }
-    return newContext;
-  }
-  Collection<Source> get availableSources {
-    {
-      return new List<Source>.from(_availableSources);
-    }
-  }
-  Element getElement(ElementLocation location) {
-    throw new UnsupportedOperationException();
-  }
-  List<AnalysisError> getErrors(Source source) {
-    throw new UnsupportedOperationException();
-  }
-  HtmlElement getHtmlElement(Source source) {
-    throw new UnsupportedOperationException();
-  }
-  SourceKind getKnownKindOf(Source source) {
-    if (source.fullName.endsWith(_HTML_SUFFIX)) {
-      return SourceKind.HTML;
-    }
-    if (!source.fullName.endsWith(_DART_SUFFIX)) {
-      return SourceKind.UNKNOWN;
-    }
-    {
-      if (_libraryElementCache.containsKey(source)) {
-        return SourceKind.LIBRARY;
-      }
-      CompilationUnit unit = _parseCache[source];
-      if (unit != null && hasPartOfDirective(unit)) {
-        return SourceKind.PART;
-      }
-    }
-    return null;
-  }
-  LibraryElement getLibraryElement(Source source) {
-    {
-      LibraryElement element = _libraryElementCache[source];
-      if (element == null) {
-        RecordingErrorListener listener = new RecordingErrorListener();
-        LibraryResolver resolver = new LibraryResolver(this, listener);
-        try {
-          element = resolver.resolveLibrary(source, true);
-        } on AnalysisException catch (exception) {
-          AnalysisEngine.instance.logger.logError2("Could not resolve the library ${source.fullName}", exception);
-        }
-      }
-      return element;
-    }
-  }
-  /**
-   * Return the element model corresponding to the library defined by the given source, or{@code null} if the element model does not yet exist.
-   * @param source the source defining the library whose element model is to be returned
-   * @return the element model corresponding to the library defined by the given source
-   */
-  LibraryElement getLibraryElementOrNull(Source source) {
-    {
-      return _libraryElementCache[source];
-    }
-  }
-  SourceKind getOrComputeKindOf(Source source) {
-    SourceKind kind = getKnownKindOf(source);
-    if (kind != null) {
-      return kind;
-    }
-    try {
-      if (hasPartOfDirective(parse(source))) {
-        return SourceKind.PART;
-      }
-    } on AnalysisException catch (exception) {
-      return SourceKind.UNKNOWN;
-    }
-    return SourceKind.LIBRARY;
-  }
-  List<AnalysisError> getParsingErrors(Source source) {
-    throw new UnsupportedOperationException();
-  }
-  /**
-   * Return a namespace containing mappings for all of the public names defined by the given
-   * library.
-   * @param library the library whose public namespace is to be returned
-   * @return the public namespace of the given library
-   */
-  Namespace getPublicNamespace(LibraryElement library) {
-    Source source7 = library.definingCompilationUnit.source;
-    {
-      Namespace namespace = _publicNamespaceCache[source7];
-      if (namespace == null) {
-        NamespaceBuilder builder = new NamespaceBuilder();
-        namespace = builder.createPublicNamespace(library);
-        _publicNamespaceCache[source7] = namespace;
-      }
-      return namespace;
-    }
-  }
-  /**
-   * Return a namespace containing mappings for all of the public names defined by the library
-   * defined by the given source.
-   * @param source the source defining the library whose public namespace is to be returned
-   * @return the public namespace corresponding to the library defined by the given source
-   */
-  Namespace getPublicNamespace2(Source source) {
-    {
-      Namespace namespace = _publicNamespaceCache[source];
-      if (namespace == null) {
-        LibraryElement library = getLibraryElement(source);
-        if (library == null) {
-          return null;
-        }
-        NamespaceBuilder builder = new NamespaceBuilder();
-        namespace = builder.createPublicNamespace(library);
-        _publicNamespaceCache[source] = namespace;
-      }
-      return namespace;
-    }
-  }
-  List<AnalysisError> getResolutionErrors(Source source) {
-    throw new UnsupportedOperationException();
-  }
-  SourceFactory get sourceFactory => _sourceFactory;
-  void mergeAnalysisContext(AnalysisContext context) {
-    {
-      _availableSources.addAll(context.availableSources);
-    }
-  }
-  CompilationUnit parse(Source source) {
-    {
-      CompilationUnit unit = _parseCache[source];
-      if (unit == null) {
-        RecordingErrorListener errorListener = new RecordingErrorListener();
-        Token token = scan(source, errorListener);
-        Parser parser = new Parser(source, errorListener);
-        unit = parser.parseCompilationUnit(token);
-        unit.parsingErrors = errorListener.errors;
-        _parseCache[source] = unit;
-      }
-      return unit;
-    }
-  }
-  CompilationUnit parse2(Source source, AnalysisErrorListener errorListener) {
-    {
-      CompilationUnit unit = _parseCache[source];
-      if (unit == null) {
-        Token token = scan(source, errorListener);
-        Parser parser = new Parser(source, errorListener);
-        unit = parser.parseCompilationUnit(token);
-        _parseCache[source] = unit;
-      }
-      return unit;
-    }
-  }
-  /**
-   * Given a table mapping the source for the libraries represented by the corresponding elements to
-   * the elements representing the libraries, record those mappings.
-   * @param elementMap a table mapping the source for the libraries represented by the elements to
-   * the elements representing the libraries
-   */
-  void recordLibraryElements(Map<Source, LibraryElement> elementMap) {
-    {
-      javaMapPutAll(_libraryElementCache, elementMap);
-    }
-  }
-  CompilationUnit resolve(Source source, LibraryElement library) => parse(source);
-  Token scan(Source source, AnalysisErrorListener errorListener) {
-    List<Token> tokens = new List<Token>(1);
-    Source_ContentReceiver receiver = new Source_ContentReceiver_1(source, errorListener, tokens);
-    try {
-      source.getContents(receiver);
-    } on JavaException catch (exception) {
-    }
-    return tokens[0];
-  }
-  void set sourceFactory(SourceFactory sourceFactory2) {
-    this._sourceFactory = sourceFactory2;
-  }
-  void sourceAvailable(Source source) {
-    {
-      javaSetAdd(_availableSources, source);
-    }
-  }
-  void sourceChanged(Source source) {
-    {
-      _parseCache.remove(source);
-      _libraryElementCache.remove(source);
-      _publicNamespaceCache.remove(source);
-    }
-  }
-  void sourceDeleted(Source source) {
-    {
-      _availableSources.remove(source);
-      sourceChanged(source);
-    }
-  }
-  void sourcesDeleted(SourceContainer container) {
-    {
-      _parseCache.clear();
-      _libraryElementCache.clear();
-      _publicNamespaceCache.clear();
-      JavaIterator<Source> iter = new JavaIterator(_availableSources);
-      while (iter.hasNext) {
-        if (container.contains(iter.next())) {
-          iter.remove();
-        }
-      }
-    }
-  }
-  Iterable<Source> sourcesToResolve(List<Source> changedSources) => JavaArrays.asList(changedSources);
-  /**
-   * Return {@code true} if the given compilation unit has a part-of directive.
-   * @param unit the compilation unit being tested
-   * @return {@code true} if the compilation unit has a part-of directive
-   */
-  bool hasPartOfDirective(CompilationUnit unit) {
-    for (Directive directive in unit.directives) {
-      if (directive is PartOfDirective) {
-        return true;
-      }
-    }
-    return false;
-  }
-}
-class Source_ContentReceiver_1 implements Source_ContentReceiver {
-  Source source;
-  AnalysisErrorListener errorListener;
-  List<Token> tokens;
-  Source_ContentReceiver_1(this.source, this.errorListener, this.tokens);
-  accept(CharBuffer contents) {
-    CharBufferScanner scanner = new CharBufferScanner(source, contents, errorListener);
-    tokens[0] = scanner.tokenize();
-  }
-  void accept2(String contents) {
-    StringScanner scanner = new StringScanner(source, contents, errorListener);
-    tokens[0] = scanner.tokenize();
-  }
-}
-/**
- * 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
- * within an analysis context.
- */
-class RecordingErrorListener implements AnalysisErrorListener {
-  /**
-   * A list containing the errors that were collected.
-   */
-  List<AnalysisError> _errors = null;
-  /**
-   * Answer the errors collected by the listener.
-   * @return an array of errors (not {@code null}, contains no {@code null}s)
-   */
-  List<AnalysisError> get errors => _errors != null ? new List.from(_errors) : AnalysisError.NO_ERRORS;
-  void onError(AnalysisError event) {
-    if (_errors == null) {
-      _errors = new List<AnalysisError>();
-    }
-    _errors.add(event);
-  }
-}
-/**
- * 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
- * information to a file, but can also record the information for later use (such as during testing)
- * or even ignore the information.
- */
-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
-   * @param exception the exception being logged
-   */
-  void logInformation2(String message, Exception exception);
-}
-/**
- * Implementation of {@link Logger} that does nothing.
- */
-class Logger_NullLogger implements Logger {
-  void logError(String message) {
-  }
-  void logError2(String message, Exception exception) {
-  }
-  void logError3(Exception exception) {
-  }
-  void logInformation(String message) {
-  }
-  void logInformation2(String message, Exception exception) {
-  }
-}
diff --git a/pkg/analyzer-experimental/lib/src/generated/error.dart b/pkg/analyzer-experimental/lib/src/generated/error.dart
deleted file mode 100644
index d107954..0000000
--- a/pkg/analyzer-experimental/lib/src/generated/error.dart
+++ /dev/null
@@ -1,229 +0,0 @@
-// This code was auto-generated, is not intended to be edited, and is subject to
-// significant change. Please see the README file for more information.
-
-library engine.error;
-
-import 'java_core.dart';
-import 'source.dart';
-
-/**
- * Instances of the enumeration {@code ErrorType} represent the type of an {@link ErrorCode}.
- */
-class 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;
-  /**
-   * 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) {
-    this._severity = severity;
-  }
-  /**
-   * Return the severity of this type of error.
-   * @return the severity of this type of error
-   */
-  ErrorSeverity get severity => _severity;
-  String toString() => __name;
-}
-/**
- * The interface {@code ErrorCode} defines the behavior common to objects representing error codes
- * associated with {@link AnalysisError analysis errors}.
- */
-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 ErrorSeverity} represent the severity of an {@link ErrorCode}.
- */
-class ErrorSeverity {
-  /**
-   * The severity representing an error.
-   */
-  static final ErrorSeverity ERROR = new ErrorSeverity('ERROR', 0, "E");
-  /**
-   * 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");
-  static final List<ErrorSeverity> values = [ERROR, WARNING];
-  final String __name;
-  final int __ordinal;
-  String _name;
-  ErrorSeverity(this.__name, this.__ordinal, String name) {
-    this._name = name;
-  }
-  String get name => _name;
-  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.
- */
-abstract class AnalysisErrorListener {
-  /**
-   * 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);
-}
-/**
- * Instances of the class {@code AnalysisError} represent an error discovered during the analysis of
- * some Dart code.
- * @see AnalysisErrorListener
- */
-class AnalysisError {
-  /**
-   * An empty array of errors used when no errors are expected.
-   */
-  static List<AnalysisError> NO_ERRORS = new List<AnalysisError>(0);
-  /**
-   * 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.
-   * @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
-   */
-  AnalysisError.con1(Source source2, ErrorCode errorCode2, List<Object> arguments) {
-    _jtd_constructor_122_impl(source2, errorCode2, arguments);
-  }
-  _jtd_constructor_122_impl(Source source2, ErrorCode errorCode2, List<Object> arguments) {
-    this._source = source2;
-    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
-   * @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
-   */
-  AnalysisError.con2(Source source3, int offset2, int length11, ErrorCode errorCode3, List<Object> arguments) {
-    _jtd_constructor_123_impl(source3, offset2, length11, errorCode3, arguments);
-  }
-  _jtd_constructor_123_impl(Source source3, int offset2, int length11, ErrorCode errorCode3, List<Object> arguments) {
-    this._source = source3;
-    this._offset = offset2;
-    this._length = length11;
-    this._errorCode = errorCode3;
-    this._message = JavaString.format(errorCode3.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 source in which the error occurred, or {@code null} if unknown.
-   * @return the source in which the error occurred
-   */
-  Source get source => _source;
-  int get hashCode {
-    int hashCode = _offset;
-    hashCode ^= (_message != null) ? _message.hashCode : 0;
-    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
-   */
-  void set source(Source source4) {
-    this._source = source4;
-  }
-  String toString() {
-    StringBuffer builder = new StringBuffer();
-    builder.add((_source != null) ? _source.fullName : "<unknown source>");
-    builder.add("(");
-    builder.add(_offset);
-    builder.add("..");
-    builder.add(_offset + _length - 1);
-    builder.add("): ");
-    builder.add(_message);
-    return builder.toString();
-  }
-}
diff --git a/pkg/analyzer-experimental/lib/src/generated/instrumentation.dart b/pkg/analyzer-experimental/lib/src/generated/instrumentation.dart
deleted file mode 100644
index fbf9994..0000000
--- a/pkg/analyzer-experimental/lib/src/generated/instrumentation.dart
+++ /dev/null
@@ -1,189 +0,0 @@
-// This code was auto-generated, is not intended to be edited, and is subject to
-// significant change. Please see the README file for more information.
-
-library engine.instrumentation;
-
-import 'java_core.dart';
-
-/**
- * The interface {@code OperationBuilder} defines the behavior of objects used to collect data about
- * an operation that has occurred and record that data through an instrumentation logger.
- * <p>
- * For an example of using objects that implement this interface, see {@link Instrumentation}.
- */
-abstract class OperationBuilder {
-  /**
-   * Log the data that has been collected. The operation 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();
-  /**
-   * Lazily compute and append the given data to the data being collected by this builder.
-   * @param name the name used to identify the data
-   * @param a function that will be executed in the background to return the value of the data to be
-   * collected
-   * @return this builder
-   */
-  OperationBuilder with2(String name, AsyncValue valueGenerator);
-  /**
-   * Append the given data to the data being collected by this builder.
-   * @param name the name used to identify the data
-   * @param value the value of the data to be collected
-   * @return this builder
-   */
-  OperationBuilder with3(String name, int value);
-  /**
-   * Append the given data to the data being collected by this builder.
-   * @param name the name used to identify the data
-   * @param value the value of the data to be collected
-   * @return this builder
-   */
-  OperationBuilder with4(String name, String value);
-  /**
-   * Append the given data to the data being collected by this builder.
-   * @param name the name used to identify the data
-   * @param value the value of the data to be collected
-   * @return this builder
-   */
-  OperationBuilder with5(String name, List<String> value);
-}
-/**
- * The interface {@code InstrumentationLogger} defines the behavior of objects that are used to log
- * instrumentation data.
- * <p>
- * For an example of using objects that implement this interface, see {@link Instrumentation}.
- */
-abstract class InstrumentationLogger {
-  /**
-   * Create an operation builder that can collect the data associated with an operation. The
-   * operation is identified by the given name, is declared to contain only metrics data (data that
-   * is not user identifiable and does not contain user intellectual property), and took the given
-   * amount of time to complete.
-   * @param name the name used to uniquely identify the operation
-   * @param time the number of milliseconds required to perform the operation, or {@code -1} if the
-   * time is not available or not applicable to this kind of operation
-   * @return the operation builder that was created
-   */
-  OperationBuilder createMetric(String name, int time);
-  /**
-   * Create an operation builder that can collect the data associated with an operation. The
-   * operation is identified by the given name, is declared to potentially contain data that is
-   * either user identifiable or contains user intellectual property (but is not guaranteed to
-   * contain either), and took the given amount of time to complete.
-   * @param name the name used to uniquely identify the operation
-   * @param time the number of milliseconds required to perform the operation, or {@code -1} if the
-   * time is not available or not applicable to this kind of operation
-   * @return the operation builder that was created
-   */
-  OperationBuilder createOperation(String name, int time);
-}
-abstract class AsyncValue {
-  /**
-   * Returns a String to be logged This would typically be used with an anonymous implementation
-   * closing over some variables with an expensive operation to be performed in the background
-   * @return The data to be logged
-   */
-  String compute();
-}
-/**
- * The class {@code Instrumentation} implements support for logging instrumentation information.
- * <p>
- * Instrumentation information consists of information about specific operations. Those operations
- * can range from user-facing operations, such as saving the changes to a file, to internal
- * operations, such as tokenizing source code. The information to be logged is gathered by an{@link OperationBuilder operation builder}, created by one of the static methods on this class.
- * <p>
- * Note, however, that until an instrumentation logger is installed using the method{@link #setLogger(InstrumentationLogger)}, all instrumentation data will be lost.
- * <p>
- * <b>Example</b>
- * <p>
- * To collect metrics about how long it took to save a file, you would write something like the
- * following:
- * <pre>
- * long startTime = System.currentTimeMillis();
- * // save the file
- * long endTime = System.currentTimeMillis();
- * metric("Save", endTime - startTime).with("chars", fileLength).log();
- * </pre>
- * The {@code metric} method creates an operation builder for an operation named {@code "Save"} that
- * took {@code endTime - startTime} milliseconds to run. The {@code with} method attaches additional
- * data to the operation; in this case recording that the file was {@code fileLength} characters
- * long. The {@code log} method tells the builder that all of the data has been collected and that
- * the resulting information should be logged.
- */
-class Instrumentation {
-  /**
-   * 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_5();
-  /**
-   * The current instrumentation logger.
-   */
-  static InstrumentationLogger _CURRENT_LOGGER = _NULL_LOGGER;
-  /**
-   * Create an operation builder that can collect the data associated with an operation. The
-   * operation is identified by the given name and is declared to contain only metrics data (data
-   * that is not user identifiable and does not contain user intellectual property).
-   * @param name the name used to uniquely identify the operation
-   * @return the operation builder that was created
-   */
-  static OperationBuilder metric(String name) => _CURRENT_LOGGER.createMetric(name, -1);
-  /**
-   * Create an operation builder that can collect the data associated with an operation. The
-   * operation is identified by the given name, is declared to contain only metrics data (data that
-   * is not user identifiable and does not contain user intellectual property), and took the given
-   * amount of time to complete.
-   * @param name the name used to uniquely identify the operation
-   * @param time the number of milliseconds required to perform the operation
-   * @return the operation builder that was created
-   */
-  static OperationBuilder metric2(String name, int time) => _CURRENT_LOGGER.createMetric(name, time);
-  /**
-   * Create an operation builder that can collect the data associated with an operation. The
-   * operation is identified by the given name and is declared to potentially contain data that is
-   * either user identifiable or contains user intellectual property (but is not guaranteed to
-   * contain either).
-   * @param name the name used to uniquely identify the operation
-   * @return the operation builder that was created
-   */
-  static OperationBuilder operation(String name) => _CURRENT_LOGGER.createOperation(name, -1);
-  /**
-   * Create an operation builder that can collect the data associated with an operation. The
-   * operation is identified by the given name, is declared to potentially contain data that is
-   * either user identifiable or contains user intellectual property (but is not guaranteed to
-   * contain either), and took the given amount of time to complete.
-   * @param name the name used to uniquely identify the operation
-   * @param time the number of milliseconds required to perform the operation
-   * @return the operation builder that was created
-   */
-  static OperationBuilder operation2(String name, int time) => _CURRENT_LOGGER.createOperation(name, time);
-  /**
-   * Set the logger that should receive instrumentation information to the given logger.
-   * @param logger the logger that should receive instrumentation information
-   */
-  static void set logger(InstrumentationLogger logger3) {
-    _CURRENT_LOGGER = logger3 == null ? _NULL_LOGGER : logger3;
-  }
-  /**
-   * Prevent the creation of instances of this class
-   */
-  Instrumentation() {
-  }
-}
-class InstrumentationLogger_5 implements InstrumentationLogger {
-  /**
-   * An operation builder that will silently ignore all data and logging requests.
-   */
-  OperationBuilder _NULL_BUILDER = new OperationBuilder_6();
-  OperationBuilder createMetric(String name, int time) => _NULL_BUILDER;
-  OperationBuilder createOperation(String name, int time) => _NULL_BUILDER;
-}
-class OperationBuilder_6 implements OperationBuilder {
-  void log() {
-  }
-  OperationBuilder with2(String name, AsyncValue valueGenerator) => this;
-  OperationBuilder with3(String name, int value) => this;
-  OperationBuilder with4(String name, String value) => this;
-  OperationBuilder with5(String name, List<String> value) => this;
-}
\ No newline at end of file
diff --git a/pkg/analyzer-experimental/lib/src/generated/java_engine.dart b/pkg/analyzer-experimental/lib/src/generated/java_engine.dart
deleted file mode 100644
index b1c131a4..0000000
--- a/pkg/analyzer-experimental/lib/src/generated/java_engine.dart
+++ /dev/null
@@ -1,56 +0,0 @@
-library java.engine;
-
-import "dart:io";
-import "java_core.dart";
-import "source.dart";
-import "error.dart";
-import "ast.dart";
-import "element.dart";
-
-//class AnalysisException implements Exception {
-//  String toString() => "AnalysisException";
-//}
-
-//class AnalysisEngine {
-//  static getInstance() {
-//    throw new UnsupportedOperationException();
-//  }
-//}
-
-//class AnalysisContext {
-//  Element getElement(ElementLocation location) {
-//    throw new UnsupportedOperationException();
-//  }
-//}
-
-//class AnalysisContextImpl extends AnalysisContext {
-//  getSourceFactory() {
-//    throw new UnsupportedOperationException();
-//  }
-//  LibraryElement getLibraryElementOrNull(Source source) {
-//    return null;
-//  }
-//  LibraryElement getLibraryElement(Source source) {
-//    throw new UnsupportedOperationException();
-//  }
-//  void recordLibraryElements(Map<Source, LibraryElement> elementMap) {
-//    throw new UnsupportedOperationException();
-//  }
-//  getPublicNamespace(LibraryElement library) {
-//    throw new UnsupportedOperationException();
-//  }
-//  CompilationUnit parse(Source source, AnalysisErrorListener errorListener) {
-//    throw new UnsupportedOperationException();
-//  }
-//}
-
-class StringUtilities {
-  static List<String> EMPTY_ARRAY = new List(0);
-}
-
-File createFile(String path) => new File(path);
-
-class OSUtilities {
-  static bool isWindows() => Platform.operatingSystem == 'windows';
-  static bool isMac() => Platform.operatingSystem == 'macos';
-}
diff --git a/pkg/analyzer-experimental/lib/src/generated/source.dart b/pkg/analyzer-experimental/lib/src/generated/source.dart
deleted file mode 100644
index 811dce2..0000000
--- a/pkg/analyzer-experimental/lib/src/generated/source.dart
+++ /dev/null
@@ -1,624 +0,0 @@
-// This code was auto-generated, is not intended to be edited, and is subject to
-// significant change. Please see the README file for more information.
-
-library engine.source;
-
-import 'dart:io';
-import 'dart:uri';
-import 'java_core.dart';
-import 'package:analyzer-experimental/src/generated/sdk.dart' show DartSdk;
-
-/**
- * Instances of the class {@code FileUriResolver} resolve {@code file} URI's.
- */
-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 resolveAbsolute(SourceFactory factory, Uri uri) {
-    if (!isFileUri(uri)) {
-      return null;
-    }
-    return new FileBasedSource.con1(factory, newFileFromUri(uri));
-  }
-}
-/**
- * Instances of the class {@code DartUriResolver} resolve {@code dart} URI's.
- */
-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;
-  /**
-   * Initialize a newly created resolver to resolve Dart URI's against the given platform within the
-   * given Dart SDK.
-   * @param sdk the Dart SDK against which URI's are to be resolved
-   */
-  DartUriResolver(DartSdk sdk) {
-    this._sdk = sdk;
-  }
-  Source resolveAbsolute(SourceFactory factory, Uri uri) {
-    if (!isDartUri(uri)) {
-      return null;
-    }
-    File resolvedFile = _sdk.mapDartUri(uri.toString());
-    return new FileBasedSource.con2(factory, resolvedFile, true);
-  }
-}
-/**
- * Instances of the class {@code FileBasedSource} implement a source that represents a file.
- */
-class FileBasedSource implements Source {
-  /**
-   * The source factory that created this source and that should be used to resolve URI's against
-   * this source.
-   */
-  SourceFactory _factory;
-  /**
-   * The file represented by this source.
-   */
-  File _file;
-  /**
-   * A flag indicating whether this source is in one of the system libraries.
-   */
-  bool _inSystemLibrary = false;
-  /**
-   * Initialize a newly created source object. The source object is assumed to not be in a system
-   * library.
-   * @param factory the source factory that created this source
-   * @param file the file represented by this source
-   */
-  FileBasedSource.con1(SourceFactory factory, File file) {
-    _jtd_constructor_243_impl(factory, file);
-  }
-  _jtd_constructor_243_impl(SourceFactory factory, File file) {
-    _jtd_constructor_244_impl(factory, file, false);
-  }
-  /**
-   * Initialize a newly created source object.
-   * @param factory the source factory that created this source
-   * @param file the file represented by this source
-   * @param inSystemLibrary {@code true} if this source is in one of the system libraries
-   */
-  FileBasedSource.con2(SourceFactory factory2, File file3, bool inSystemLibrary2) {
-    _jtd_constructor_244_impl(factory2, file3, inSystemLibrary2);
-  }
-  _jtd_constructor_244_impl(SourceFactory factory2, File file3, bool inSystemLibrary2) {
-    this._factory = factory2;
-    this._file = file3;
-    this._inSystemLibrary = inSystemLibrary2;
-  }
-  bool operator ==(Object object) => object != null && identical(this.runtimeType, object.runtimeType) && _file == ((object as FileBasedSource))._file;
-  void getContents(Source_ContentReceiver receiver) {
-    receiver.accept2(_file.readAsStringSync());
-  }
-  String get fullName => _file.fullPathSync();
-  String get shortName => _file.name;
-  int get hashCode => _file.hashCode;
-  bool isInSystemLibrary() => _inSystemLibrary;
-  Source resolve(String uri) => _factory.resolveUri(this, uri);
-  String toString() {
-    if (_file == null) {
-      return "<unknown source>";
-    }
-    return _file.fullPathSync();
-  }
-  /**
-   * Return the file represented by this source. This is an internal method that is only intended to
-   * be used by {@link UriResolver}.
-   * @return the file represented by this source
-   */
-  File get file => _file;
-}
-/**
- * Instances of the class {@link DirectoryBasedSourceContainer} represent a source container that
- * contains all sources within a given directory.
- */
-class DirectoryBasedSourceContainer implements SourceContainer {
-  /**
-   * Append the system file separator to the given path unless the path already ends with a
-   * separator.
-   * @param path the path to which the file separator is to be added
-   * @return a path that ends with the system file separator
-   */
-  static String appendFileSeparator(String path) {
-    if (path == null || path.length <= 0 || path.codeUnitAt(path.length - 1) == System.pathSeparatorChar) {
-      return path;
-    }
-    return "${path}${System.pathSeparator}";
-  }
-  /**
-   * 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(File directory) {
-    _jtd_constructor_241_impl(directory);
-  }
-  _jtd_constructor_241_impl(File directory) {
-    _jtd_constructor_242_impl(directory.fullPathSync());
-  }
-  /**
-   * 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 path3) {
-    _jtd_constructor_242_impl(path3);
-  }
-  _jtd_constructor_242_impl(String path3) {
-    this._path = appendFileSeparator(path3);
-  }
-  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)
-   */
-  String get path => _path;
-  int get hashCode => _path.hashCode;
-}
-/**
- * Instances of the class {@code PackageUriResolver} resolve {@code package} URI's in the context of
- * an application.
- */
-class PackageUriResolver extends UriResolver {
-  /**
-   * The package directories that {@code package} URI's are assumed to be relative to.
-   */
-  List<File> _packagesDirectories;
-  /**
-   * The name of the {@code package} scheme.
-   */
-  static String _PACKAGE_SCHEME = "package";
-  /**
-   * 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;
-  /**
-   * Initialize a newly created resolver to resolve {@code package} URI's relative to the given
-   * package directories.
-   * @param packagesDirectories the package directories that {@code package} URI's are assumed to be
-   * relative to
-   */
-  PackageUriResolver(List<File> packagesDirectories) {
-    if (packagesDirectories.length < 1) {
-      throw new IllegalArgumentException("At least one package directory must be provided");
-    }
-    this._packagesDirectories = packagesDirectories;
-  }
-  Source resolveAbsolute(SourceFactory factory, Uri uri) {
-    if (!isPackageUri(uri)) {
-      return null;
-    }
-    String path4 = uri.path;
-    if (path4 == null) {
-      path4 = uri.path;
-      if (path4 == null) {
-        return null;
-      }
-    }
-    for (File packagesDirectory in _packagesDirectories) {
-      File resolvedFile = newRelativeFile(packagesDirectory, path4);
-      if (resolvedFile.existsSync()) {
-        return new FileBasedSource.con1(factory, resolvedFile);
-      }
-    }
-    return new FileBasedSource.con1(factory, newRelativeFile(_packagesDirectories[0], path4));
-  }
-}
-/**
- * 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
- * absolute URI.
- */
-abstract class UriResolver {
-  /**
-   * Initialize a newly created resolver.
-   */
-  UriResolver() : super() {
-  }
-  /**
-   * Working on behalf of the given source factory, resolve the (possibly relative) contained URI
-   * against the URI associated with the containing source object. Return a {@link Source source}representing the file to which it was resolved, or {@code null} if it could not be resolved.
-   * @param factory the source factory requesting the resolution of the URI
-   * @param containingSource the source containing the given URI
-   * @param containedUri the (possibly relative) URI to be resolved against the containing source
-   * @return a {@link Source source} representing the URI to which given URI was resolved
-   */
-  Source resolve(SourceFactory factory, Source containingSource, Uri containedUri) {
-    if (containedUri.isAbsolute()) {
-      return resolveAbsolute(factory, containedUri);
-    } else {
-      return resolveRelative(factory, containingSource, containedUri);
-    }
-  }
-  /**
-   * 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.
-   * @param uri the URI to be resolved
-   * @return a {@link Source source} representing the URI to which given URI was resolved
-   */
-  Source resolveAbsolute(SourceFactory factory, Uri uri);
-  /**
-   * Resolve the relative (contained) URI against the URI associated with the containing source
-   * object. Return a {@link Source source} representing the file to which it was resolved, or{@code null} if it could not be resolved.
-   * @param containingSource the source containing the given URI
-   * @param containedUri the (possibly relative) URI to be resolved against the containing source
-   * @return a {@link Source source} representing the URI to which given URI was resolved
-   */
-  Source resolveRelative(SourceFactory factory, Source containingSource, Uri containedUri) {
-    if (containingSource is FileBasedSource) {
-      try {
-        Uri resolvedUri = newUriFromFile(((containingSource as FileBasedSource)).file).resolveUri(containedUri);
-        return new FileBasedSource.con1(factory, newFileFromUri(resolvedUri));
-      } on JavaException catch (exception) {
-      }
-    }
-    return null;
-  }
-}
-/**
- * Instances of the class {@code SourceFactory} resolve possibly relative URI's against an existing{@link Source source}.
- */
-class SourceFactory {
-  /**
-   * 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_247_impl(contentCache2, resolvers2);
-  }
-  _jtd_constructor_247_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_248_impl(resolvers);
-  }
-  _jtd_constructor_248_impl(List<UriResolver> resolvers) {
-    _jtd_constructor_247_impl(new ContentCache(), [resolvers]);
-  }
-  /**
-   * Return a source container representing the given directory
-   * @param directory the directory (not {@code null})
-   * @return the source container representing the directory (not {@code null})
-   */
-  SourceContainer forDirectory(File directory) => new DirectoryBasedSourceContainer.con1(directory);
-  /**
-   * Return a source object representing the given file.
-   * @param file the file to be represented by the returned source object
-   * @return a source object representing the given file
-   */
-  Source forFile(File file) => new FileBasedSource.con1(this, file);
-  /**
-   * 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.
-   * @param absoluteUri the absolute URI to be resolved
-   * @return a source object representing the absolute URI
-   */
-  Source forUri(String absoluteUri) {
-    try {
-      Uri uri = new Uri.fromComponents(path: absoluteUri);
-      if (uri.isAbsolute()) {
-        return resolveUri2(null, uri);
-      }
-    } on URISyntaxException catch (exception) {
-    }
-    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
-   * source object's URI.
-   * @param containingSource the source containing the given URI
-   * @param containedUri the (possibly relative) URI to be resolved against the containing source
-   * @return the source representing the contained URI
-   */
-  Source resolveUri(Source containingSource, String containedUri) {
-    try {
-      return resolveUri2(containingSource, new Uri.fromComponents(path: containedUri));
-    } on URISyntaxException catch (exception) {
-      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
-   * that the default contents will be returned.
-   * @param source the source whose contents are being overridden
-   * @param contents the new contents of the source
-   */
-  void setContents(Source source, String contents) {
-    _contentCache.setContents(source, contents);
-  }
-  /**
-   * Return the contents of the given source, or {@code null} if this factory does not override the
-   * contents of the source.
-   * <p>
-   * <b>Note:</b> This method is not intended to be used except by{@link FileBasedSource#getContents(com.google.dart.engine.source.Source.ContentReceiver)}.
-   * @param source the source whose content is to be returned
-   * @return the contents of the given source
-   */
-  String getContents(Source source) => _contentCache.getContents(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
-   * source object's URI.
-   * @param containingSource the source containing the given URI
-   * @param containedUri the (possibly relative) URI to be resolved against the containing source
-   * @return the source representing the contained URI
-   */
-  Source resolveUri2(Source containingSource, Uri containedUri) {
-    for (UriResolver resolver in _resolvers) {
-      Source result = resolver.resolve(this, containingSource, containedUri);
-      if (result != null) {
-        return result;
-      }
-    }
-    return null;
-  }
-}
-/**
- * The interface {@code Source} defines the behavior of objects representing source code that can be
- * compiled.
- */
-abstract class Source {
-  /**
-   * Return {@code true} if the given object is a source that represents the same source code as
-   * this source.
-   * @param object the object to be compared with this object
-   * @return {@code true} if the given object is a source that represents the same source code as
-   * this source
-   * @see Object#equals(Object)
-   */
-  bool operator ==(Object object);
-  /**
-   * 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
-   * invoked depends on which of the possible representations of the contents is the most efficient.
-   * Whichever method is invoked, it will be invoked before this method returns.
-   * @param receiver the content receiver to which the content of this source will be passed
-   * @throws Exception if the contents of this source could not be accessed
-   */
-  void getContents(Source_ContentReceiver receiver);
-  /**
-   * Return the full (long) version of the name that can be displayed to the user to denote this
-   * source. For example, for a source representing a file this would typically be the absolute path
-   * of the file.
-   * @return a name that can be displayed to the user to denote this source
-   */
-  String get fullName;
-  /**
-   * Return 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 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 given URI relative to the location of this source.
-   * @param uri the URI to be resolved against this source
-   * @return a source representing the resolved URI
-   */
-  Source resolve(String uri);
-}
-/**
- * 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
-   */
-  accept(CharBuffer contents);
-  /**
-   * Accept the contents of a source represented as a string.
-   * @param contents the contents of the source
-   */
-  void accept2(String contents);
-}
-/**
- * Instances of class {@code ContentCache} hold content used to override the default content of a{@link 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>();
-  /**
-   * Return the contents of the given source, or {@code null} if this cache does not override the
-   * contents of the source.
-   * <p>
-   * <b>Note:</b> This method is not intended to be used except by{@link SourceFactory#getContents(com.google.dart.engine.source.Source.ContentReceiver)}.
-   * @param source the source whose content is to be returned
-   * @return the contents of the given source
-   */
-  String getContents(Source source) => _contentMap[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
-   * that the default contents will be returned.
-   * @param source the source whose contents are being overridden
-   * @param contents the new contents of the source
-   */
-  void setContents(Source source, String contents) {
-    if (contents == null) {
-      _contentMap.remove(source);
-    } else {
-      _contentMap[source] = contents;
-    }
-  }
-}
-/**
- * The interface {@code SourceContainer} is used by clients to define a collection of sources
- * <p>
- * Source containers are not used within analysis engine, but can be used by clients to group
- * sources for the purposes of accessing composite dependency information. For example, the Eclipse
- * client uses source containers to represent Eclipse projects, which allows it to easily compute
- * project-level dependencies.
- */
-abstract class SourceContainer {
-  /**
-   * Determine if the specified source is part of the receiver's collection of sources.
-   * @param source the source in question
-   * @return {@code true} if the receiver contains the source, else {@code false}
-   */
-  bool contains(Source source);
-}
-/**
- * Instances of the class {@code LineInfo} encapsulate information about line and column information
- * within a source file.
- */
-class LineInfo {
-  /**
-   * An array containing the offsets of the first character of each line in the source code.
-   */
-  List<int> _lineStarts;
-  /**
-   * Initialize a newly created set of line information to represent the data encoded in the given
-   * array.
-   * @param lineStarts the offsets of the first character of each line in the source code
-   */
-  LineInfo(List<int> lineStarts) {
-    if (lineStarts == null) {
-      throw new IllegalArgumentException("lineStarts must be non-null");
-    } else if (lineStarts.length < 1) {
-      throw new IllegalArgumentException("lineStarts must be non-empty");
-    }
-    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
-   * @return the location information for the character at the given offset
-   */
-  LineInfo_Location getLocation(int offset) {
-    int lineCount = _lineStarts.length;
-    for (int i = 1; i < lineCount; i++) {
-      if (offset < _lineStarts[i]) {
-        return new LineInfo_Location(i, offset - _lineStarts[i - 1] + 1);
-      }
-    }
-    return new LineInfo_Location(lineCount, offset - _lineStarts[lineCount - 1] + 1);
-  }
-}
-/**
- * Instances of the class {@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.
-   * @param lineNumber the one-based index of the line containing the character
-   * @param columnNumber the one-based index of the column containing the character
-   */
-  LineInfo_Location(int lineNumber, int columnNumber) {
-    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;
-}
-/**
- * The enumeration {@code SourceKind} defines the different kinds of sources that are known to the
- * analysis engine.
- */
-class 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
-   * does not want to spend the time to identify the kind.
-   */
-  static final SourceKind UNKNOWN = new SourceKind('UNKNOWN', 3);
-  static final List<SourceKind> values = [HTML, LIBRARY, PART, UNKNOWN];
-  final String __name;
-  final int __ordinal;
-  SourceKind(this.__name, this.__ordinal) {
-  }
-  String toString() => __name;
-}
\ No newline at end of file
diff --git a/pkg/analyzer-experimental/README.md b/pkg/analyzer_experimental/README.md
similarity index 100%
rename from pkg/analyzer-experimental/README.md
rename to pkg/analyzer_experimental/README.md
diff --git a/pkg/analyzer-experimental/bin/analyzer.dart b/pkg/analyzer_experimental/bin/analyzer.dart
similarity index 95%
rename from pkg/analyzer-experimental/bin/analyzer.dart
rename to pkg/analyzer_experimental/bin/analyzer.dart
index 2214490..cb730cd 100644
--- a/pkg/analyzer-experimental/bin/analyzer.dart
+++ b/pkg/analyzer_experimental/bin/analyzer.dart
@@ -10,7 +10,7 @@
 import 'dart:async';
 import 'dart:io';
 
-import 'package:analyzer-experimental/options.dart';
+import 'package:analyzer_experimental/options.dart';
 
 // Exit status codes.
 const OK_EXIT = 0;
diff --git a/pkg/analyzer-experimental/example/parser_driver.dart b/pkg/analyzer_experimental/example/parser_driver.dart
similarity index 79%
rename from pkg/analyzer-experimental/example/parser_driver.dart
rename to pkg/analyzer_experimental/example/parser_driver.dart
index 061a055..8501552 100644
--- a/pkg/analyzer-experimental/example/parser_driver.dart
+++ b/pkg/analyzer_experimental/example/parser_driver.dart
@@ -4,29 +4,29 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer-experimental/src/generated/ast.dart';
-import 'package:analyzer-experimental/src/generated/error.dart';
-import 'package:analyzer-experimental/src/generated/java_core.dart';
-import 'package:analyzer-experimental/src/generated/parser.dart';
-import 'package:analyzer-experimental/src/generated/scanner.dart';
+import 'package:analyzer_experimental/src/generated/ast.dart';
+import 'package:analyzer_experimental/src/generated/error.dart';
+import 'package:analyzer_experimental/src/generated/java_core.dart';
+import 'package:analyzer_experimental/src/generated/parser.dart';
+import 'package:analyzer_experimental/src/generated/scanner.dart';
 
 import 'dart:io';
 
 
 main() {
-  
+
   print('working dir ${new File('.').fullPathSync()}');
-  
+
   var args = new Options().arguments;
   if (args.length == 0) {
     print('Usage: parser_driver [files_to_parse]');
     exit(0);
   }
-  
+
   for (var arg in args) {
     _parse(new File(arg));
   }
-  
+
 }
 
 _parse(File file) {
@@ -36,10 +36,10 @@
   var token = scanner.tokenize();
   var parser = new Parser(null, errorListener);
   var unit = parser.parseCompilationUnit(token);
-  
+
   var visitor = new _ASTVisitor();
   unit.accept(visitor);
-  
+
   for (var error in errorListener.errors) {
     print(error);
   }
diff --git a/pkg/analyzer-experimental/example/scanner_driver.dart b/pkg/analyzer_experimental/example/scanner_driver.dart
similarity index 84%
rename from pkg/analyzer-experimental/example/scanner_driver.dart
rename to pkg/analyzer_experimental/example/scanner_driver.dart
index ab5a46c..0455cbe 100644
--- a/pkg/analyzer-experimental/example/scanner_driver.dart
+++ b/pkg/analyzer_experimental/example/scanner_driver.dart
@@ -4,25 +4,25 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer-experimental/src/generated/java_core.dart';
-import 'package:analyzer-experimental/src/generated/scanner.dart';
+import 'package:analyzer_experimental/src/generated/java_core.dart';
+import 'package:analyzer_experimental/src/generated/scanner.dart';
 
 import 'dart:io';
 
 main() {
-  
+
   print('working dir ${new File('.').fullPathSync()}');
-  
+
   var args = new Options().arguments;
   if (args.length == 0) {
     print('Usage: scanner_driver [files_to_scan]');
     exit(0);
   }
-  
+
   for (var arg in args) {
     _scan(new File(arg));
   }
-  
+
 }
 
 _scan(File file) {
diff --git a/pkg/analyzer-experimental/lib/analyzer.dart b/pkg/analyzer_experimental/lib/analyzer.dart
similarity index 100%
rename from pkg/analyzer-experimental/lib/analyzer.dart
rename to pkg/analyzer_experimental/lib/analyzer.dart
diff --git a/pkg/analyzer-experimental/lib/options.dart b/pkg/analyzer_experimental/lib/options.dart
similarity index 100%
rename from pkg/analyzer-experimental/lib/options.dart
rename to pkg/analyzer_experimental/lib/options.dart
diff --git a/pkg/analyzer-experimental/lib/src/generated/ast.dart b/pkg/analyzer_experimental/lib/src/generated/ast.dart
similarity index 92%
rename from pkg/analyzer-experimental/lib/src/generated/ast.dart
rename to pkg/analyzer_experimental/lib/src/generated/ast.dart
index 3c842d7..b47c576 100644
--- a/pkg/analyzer-experimental/lib/src/generated/ast.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/ast.dart
@@ -7,6 +7,7 @@
 import 'java_core.dart';
 import 'java_engine.dart';
 import 'error.dart';
+import 'source.dart' show LineInfo;
 import 'scanner.dart';
 import 'engine.dart' show AnalysisEngine;
 import 'utilities_dart.dart';
@@ -15,6 +16,7 @@
 /**
  * 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 {
   /**
@@ -22,6 +24,11 @@
    */
   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.
@@ -43,7 +50,7 @@
       node = node.parent;
     }
     ;
-    return (node as ASTNode);
+    return node as ASTNode;
   }
   /**
    * Return the first token included in this node's source range.
@@ -97,6 +104,17 @@
    */
   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.
+   * @return the value of the property with the given name
+   */
+  Object getProperty(String propertyName) {
+    if (_propertyMap == null) {
+      return null;
+    }
+    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)).
    * @return the node at the root of this node's AST structure
@@ -118,6 +136,26 @@
    */
   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
+   * @param propertyValue the new value of the property
+   */
+  void setProperty(String propertyName, Object propertyValue) {
+    if (propertyValue == null) {
+      if (_propertyMap != null) {
+        _propertyMap.remove(propertyName);
+        if (_propertyMap.isEmpty) {
+          _propertyMap = null;
+        }
+      }
+    } else {
+      if (_propertyMap == null) {
+        _propertyMap = new Map<String, Object>();
+      }
+      _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.
    * @return the source code equivalent of this node
@@ -169,6 +207,7 @@
 /**
  * The interface {@code ASTVisitor} defines the behavior of objects that can be used to visit an AST
  * structure.
+ * @coverage dart.engine.ast
  */
 abstract class ASTVisitor<R> {
   R visitAdjacentStrings(AdjacentStrings node);
@@ -195,6 +234,7 @@
   R visitConstructorFieldInitializer(ConstructorFieldInitializer node);
   R visitConstructorName(ConstructorName node);
   R visitContinueStatement(ContinueStatement node);
+  R visitDeclaredIdentifier(DeclaredIdentifier node);
   R visitDefaultFormalParameter(DefaultFormalParameter node);
   R visitDoStatement(DoStatement node);
   R visitDoubleLiteral(DoubleLiteral node);
@@ -279,6 +319,7 @@
  * <pre>
  * adjacentStrings ::={@link StringLiteral string} {@link StringLiteral string}+
  * </pre>
+ * @coverage dart.engine.ast
  */
 class AdjacentStrings extends StringLiteral {
   /**
@@ -313,6 +354,7 @@
 /**
  * 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 {
   /**
@@ -425,6 +467,7 @@
  * annotation ::=
  * '@' {@link Identifier qualified} (‘.’ {@link SimpleIdentifier identifier})? {@link ArgumentList arguments}?
  * </pre>
+ * @coverage dart.engine.ast
  */
 class Annotation extends ASTNode {
   /**
@@ -569,6 +612,7 @@
  * <pre>
  * argumentDefinitionTest ::=
  * '?' {@link SimpleIdentifier identifier}</pre>
+ * @coverage dart.engine.ast
  */
 class ArgumentDefinitionTest extends Expression {
   /**
@@ -611,8 +655,8 @@
    * Set the identifier representing the argument being tested to the given identifier.
    * @param identifier the identifier representing the argument being tested
    */
-  void set identifier(SimpleIdentifier identifier5) {
-    this._identifier = becomeParentOf(identifier5);
+  void set identifier(SimpleIdentifier identifier7) {
+    this._identifier = becomeParentOf(identifier7);
   }
   /**
    * Set the token representing the question mark to the given token.
@@ -634,6 +678,7 @@
  * arguments ::={@link NamedExpression namedArgument} (',' {@link NamedExpression namedArgument})
  * | {@link Expression expressionList} (',' {@link NamedExpression namedArgument})
  * </pre>
+ * @coverage dart.engine.ast
  */
 class ArgumentList extends ASTNode {
   /**
@@ -649,6 +694,14 @@
    */
   Token _rightParenthesis;
   /**
+   * An array containing the elements representing the parameters corresponding to each of the
+   * arguments in this list, or {@code null} if the AST has not been resolved or if the function or
+   * method being invoked could not be determined. The array must be the same length as the number
+   * of arguments, but can contain {@code null} entries if a given argument does not correspond to a
+   * formal parameter.
+   */
+  List<ParameterElement> _correspondingParameters;
+  /**
    * Initialize a newly created list of arguments.
    * @param leftParenthesis the left parenthesis
    * @param arguments the expressions producing the values of the arguments
@@ -688,6 +741,19 @@
    */
   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
+   * arguments, but can contain {@code null} entries if a given argument does not correspond to a
+   * formal parameter.
+   * @param parameters the parameter elements corresponding to the arguments
+   */
+  void set correspondingParameters(List<ParameterElement> parameters) {
+    if (parameters.length != _arguments.length) {
+      throw new IllegalArgumentException("Expected ${_arguments.length} parameters, not ${parameters.length}");
+    }
+    _correspondingParameters = parameters;
+  }
+  /**
    * Set the left parenthesis to the given token.
    * @param parenthesis the left parenthesis
    */
@@ -704,11 +770,33 @@
   void visitChildren(ASTVisitor<Object> visitor) {
     _arguments.accept(visitor);
   }
+  /**
+   * If the given expression is a child of this list, and the AST structure has been resolved, and
+   * the function being invoked is known, and the expression corresponds to one of the parameters of
+   * the function being invoked, then return the parameter element representing the parameter to
+   * which the value of the given expression will be bound. Otherwise, return {@code null}.
+   * <p>
+   * This method is only intended to be used by {@link Expression#getParameterElement()}.
+   * @param expression the expression corresponding to the parameter to be returned
+   * @return the parameter element representing the parameter to which the value of the expression
+   * will be bound
+   */
+  ParameterElement getParameterElementFor(Expression expression) {
+    if (_correspondingParameters == null) {
+      return null;
+    }
+    int index = _arguments.indexOf(expression);
+    if (index < 0) {
+      return null;
+    }
+    return _correspondingParameters[index];
+  }
 }
 /**
  * Instances of the class {@code AsExpression} represent an 'as' expression.
  * <pre>
  * asExpression ::={@link Expression expression} 'as' {@link TypeName type}</pre>
+ * @coverage dart.engine.ast
  */
 class AsExpression extends Expression {
   /**
@@ -791,6 +879,7 @@
  * assertStatement ::=
  * 'assert' '(' {@link Expression conditionalExpression} ')' ';'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class AssertStatement extends Statement {
   /**
@@ -908,6 +997,7 @@
  * Instances of the class {@code AssignmentExpression} represent an assignment expression.
  * <pre>
  * assignmentExpression ::={@link Expression leftHandSide} {@link Token operator} {@link Expression rightHandSide}</pre>
+ * @coverage dart.engine.ast
  */
 class AssignmentExpression extends Expression {
   /**
@@ -1008,6 +1098,7 @@
  * Instances of the class {@code BinaryExpression} represent a binary (infix) expression.
  * <pre>
  * binaryExpression ::={@link Expression leftOperand} {@link Token operator} {@link Expression rightOperand}</pre>
+ * @coverage dart.engine.ast
  */
 class BinaryExpression extends Expression {
   /**
@@ -1110,6 +1201,7 @@
  * block ::=
  * '{' statement* '}'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class Block extends Statement {
   /**
@@ -1184,6 +1276,7 @@
  * block of statements.
  * <pre>
  * blockFunctionBody ::={@link Block block}</pre>
+ * @coverage dart.engine.ast
  */
 class BlockFunctionBody extends FunctionBody {
   /**
@@ -1227,6 +1320,7 @@
  * booleanLiteral ::=
  * 'false' | 'true'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class BooleanLiteral extends Literal {
   /**
@@ -1289,6 +1383,7 @@
  * breakStatement ::=
  * 'break' {@link SimpleIdentifier label}? ';'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class BreakStatement extends Statement {
   /**
@@ -1376,6 +1471,7 @@
  * '[ ' expression '] '
  * | identifier
  * </pre>
+ * @coverage dart.engine.ast
  */
 class CascadeExpression extends Expression {
   /**
@@ -1434,6 +1530,7 @@
  * catchPart {@link Block block}| 'on' type catchPart? {@link Block block}catchPart ::=
  * 'catch' '(' {@link SimpleIdentifier exceptionParameter} (',' {@link SimpleIdentifier stackTraceParameter})? ')'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class CatchClause extends ASTNode {
   /**
@@ -1644,6 +1741,7 @@
  * ({@link ExtendsClause extendsClause} {@link WithClause withClause}?)?{@link ImplementsClause implementsClause}?
  * '{' {@link ClassMember classMember}* '}'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class ClassDeclaration extends CompilationUnitMember {
   /**
@@ -1743,10 +1841,6 @@
    * @return the token representing the 'class' keyword
    */
   Token get classKeyword => _classKeyword;
-  /**
-   * @return the {@link ClassElement} associated with this identifier, or {@code null} if the AST
-   * structure has not been resolved or if this identifier could not be resolved.
-   */
   ClassElement get element => _name != null ? (_name.element as ClassElement) : null;
   Token get endToken => _rightBracket;
   /**
@@ -1874,6 +1968,7 @@
 /**
  * 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 {
   /**
@@ -1896,6 +1991,7 @@
  * classTypeAlias ::={@link SimpleIdentifier identifier} {@link TypeParameterList typeParameters}? '=' 'abstract'? mixinApplication
  * mixinApplication ::={@link TypeName superclass} {@link WithClause withClause} {@link ImplementsClause implementsClause}? ';'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class ClassTypeAlias extends TypeAlias {
   /**
@@ -1973,11 +2069,6 @@
    * @return the token for the 'abstract' keyword
    */
   Token get abstractKeyword => _abstractKeyword;
-  /**
-   * Return the {@link ClassElement} associated with this type alias, or {@code null} if the AST
-   * structure has not been resolved.
-   * @return the {@link ClassElement} associated with this type alias
-   */
   ClassElement get element => _name != null ? (_name.element as ClassElement) : null;
   /**
    * Return the token for the '=' separating the name from the definition.
@@ -2073,6 +2164,7 @@
  * directive.
  * <pre>
  * combinator ::={@link HideCombinator hideCombinator}| {@link ShowCombinator showCombinator}</pre>
+ * @coverage dart.engine.ast
  */
 abstract class Combinator extends ASTNode {
   /**
@@ -2124,6 +2216,7 @@
  * '/ **' (CHARACTER | {@link CommentReference commentReference})* '&#42;/'
  * | ('///' (CHARACTER - EOL)* EOL)+
  * </pre>
+ * @coverage dart.engine.ast
  */
 class Comment extends ASTNode {
   /**
@@ -2230,6 +2323,7 @@
   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) {
   }
   String toString() => __name;
@@ -2241,6 +2335,7 @@
  * commentReference ::=
  * '[' 'new'? {@link Identifier identifier} ']'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class CommentReference extends ASTNode {
   /**
@@ -2283,8 +2378,8 @@
    * Set the identifier being referenced to the given identifier.
    * @param identifier the identifier being referenced
    */
-  void set identifier(Identifier identifier18) {
-    identifier18 = becomeParentOf(identifier18);
+  void set identifier(Identifier identifier24) {
+    identifier24 = becomeParentOf(identifier24);
   }
   /**
    * Set the token representing the 'new' keyword to the given token.
@@ -2308,6 +2403,7 @@
  * compilationUnit ::=
  * directives declarations
  * directives ::={@link ScriptTag scriptTag}? {@link LibraryDirective libraryDirective}? namespaceDirective* {@link PartDirective partDirective}| {@link PartOfDirective partOfDirective}namespaceDirective ::={@link ImportDirective importDirective}| {@link ExportDirective exportDirective}declarations ::={@link CompilationUnitMember compilationUnitMember}</pre>
+ * @coverage dart.engine.ast
  */
 class CompilationUnit extends ASTNode {
   /**
@@ -2409,8 +2505,8 @@
       return resolverErrors;
     } else {
       List<AnalysisError> allErrors = new List<AnalysisError>(parserErrors.length + resolverErrors.length);
-      System.arraycopy(parserErrors, 0, allErrors, 0, parserErrors.length);
-      System.arraycopy(resolverErrors, 0, allErrors, parserErrors.length, resolverErrors.length);
+      JavaSystem.arraycopy(parserErrors, 0, allErrors, 0, parserErrors.length);
+      JavaSystem.arraycopy(resolverErrors, 0, allErrors, parserErrors.length, resolverErrors.length);
       return allErrors;
     }
   }
@@ -2419,20 +2515,14 @@
     if (endToken3 == null) {
       return 0;
     }
-    return endToken3.offset + endToken3.length - beginToken.offset;
+    return endToken3.offset + endToken3.length;
   }
   /**
    * Get the {@link LineInfo} object for this compilation unit.
    * @return the associated {@link LineInfo}
    */
   LineInfo get lineInfo => _lineInfo;
-  int get offset {
-    Token beginToken4 = beginToken;
-    if (beginToken4 == null) {
-      return 0;
-    }
-    return beginToken4.offset;
-  }
+  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).
@@ -2531,6 +2621,7 @@
  * declare a name within the scope of a compilation unit.
  * <pre>
  * compilationUnitMember ::={@link ClassDeclaration classDeclaration}| {@link TypeAlias typeAlias}| {@link FunctionDeclaration functionDeclaration}| {@link MethodDeclaration getOrSetDeclaration}| {@link VariableDeclaration constantsDeclaration}| {@link VariableDeclaration variablesDeclaration}</pre>
+ * @coverage dart.engine.ast
  */
 abstract class CompilationUnitMember extends Declaration {
   /**
@@ -2551,6 +2642,7 @@
  * Instances of the class {@code ConditionalExpression} represent a conditional expression.
  * <pre>
  * conditionalExpression ::={@link Expression condition} '?' {@link Expression thenExpression} ':' {@link Expression elseExpression}</pre>
+ * @coverage dart.engine.ast
  */
 class ConditionalExpression extends Expression {
   /**
@@ -2684,6 +2776,7 @@
  * initializerList ::=
  * ':' {@link ConstructorInitializer initializer} (',' {@link ConstructorInitializer initializer})
  * </pre>
+ * @coverage dart.engine.ast
  */
 class ConstructorDeclaration extends ClassMember {
   /**
@@ -2691,11 +2784,13 @@
    */
   Token _externalKeyword;
   /**
-   * The token for the 'const' keyword.
+   * 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.
+   * The token for the 'factory' keyword, or {@code null} if the constructor is not a factory
+   * constructor.
    */
   Token _factoryKeyword;
   /**
@@ -2799,11 +2894,6 @@
    * @return the token for the 'const' keyword
    */
   Token get constKeyword => _constKeyword;
-  /**
-   * Return 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.
-   * @return the element associated with this constructor
-   */
   ConstructorElement get element => _element;
   Token get endToken {
     if (_body != null) {
@@ -2948,6 +3038,7 @@
     safelyVisitChild(_name, visitor);
     safelyVisitChild(_parameters, visitor);
     _initializers.accept(visitor);
+    safelyVisitChild(_redirectedConstructor, visitor);
     safelyVisitChild(_body, visitor);
   }
   Token get firstTokenAfterCommentAndMetadata {
@@ -2980,6 +3071,7 @@
  * <pre>
  * fieldInitializer ::=
  * ('this' '.')? {@link SimpleIdentifier fieldName} '=' {@link Expression conditionalExpression cascadeSection*}</pre>
+ * @coverage dart.engine.ast
  */
 class ConstructorFieldInitializer extends ConstructorInitializer {
   /**
@@ -3109,6 +3201,7 @@
  * occur in the initializer list of a constructor declaration.
  * <pre>
  * constructorInitializer ::={@link SuperConstructorInvocation superInvocation}| {@link ConstructorFieldInitializer fieldInitializer}</pre>
+ * @coverage dart.engine.ast
  */
 abstract class ConstructorInitializer extends ASTNode {
 }
@@ -3118,6 +3211,7 @@
  * constructorName:
  * type ('.' identifier)?
  * </pre>
+ * @coverage dart.engine.ast
  */
 class ConstructorName extends ASTNode {
   /**
@@ -3227,6 +3321,7 @@
  * continueStatement ::=
  * 'continue' {@link SimpleIdentifier label}? ';'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class ContinueStatement extends Statement {
   /**
@@ -3305,6 +3400,7 @@
 /**
  * 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 {
   /**
@@ -3320,6 +3416,122 @@
    * @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.
+   * @return the element associated with this declaration
+   */
+  Element get element;
+}
+/**
+ * Instances of the class {@code DeclaredIdentifier} represent the declaration of a single
+ * identifier.
+ * <pre>
+ * declaredIdentifier ::=
+ * ({@link Annotation metadata} finalConstVarOrType {@link SimpleIdentifier identifier}</pre>
+ * @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
+   * @param metadata the annotations associated with this parameter
+   * @param keyword the token representing either the 'final', 'const' or 'var' keyword
+   * @param type the name of the declared type of the parameter
+   * @param identifier the name of the parameter being declared
+   */
+  DeclaredIdentifier.full(Comment comment, List<Annotation> metadata, Token keyword, TypeName type, SimpleIdentifier identifier) : super.full(comment, metadata) {
+    this._keyword = keyword;
+    this._type = becomeParentOf(type);
+    this._identifier = becomeParentOf(identifier);
+  }
+  /**
+   * Initialize a newly created formal parameter.
+   * @param comment the documentation comment associated with this parameter
+   * @param metadata the annotations associated with this parameter
+   * @param keyword the token representing either the 'final', 'const' or 'var' keyword
+   * @param type the name of the declared type of the parameter
+   * @param identifier the name of the parameter being declared
+   */
+  DeclaredIdentifier({Comment comment, List<Annotation> metadata, Token keyword, TypeName type, SimpleIdentifier identifier}) : this.full(comment, metadata, keyword, type, identifier);
+  accept(ASTVisitor visitor) => visitor.visitDeclaredIdentifier(this);
+  LocalVariableElement get element {
+    SimpleIdentifier identifier11 = identifier;
+    if (identifier11 == null) {
+      return null;
+    }
+    return identifier11.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
+   * final.
+   * @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
+   */
+  void set keyword(Token keyword8) {
+    this._keyword = keyword8;
+  }
+  /**
+   * 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
+   */
+  void set type(TypeName typeName) {
+    _type = becomeParentOf(typeName);
+  }
+  void visitChildren(ASTVisitor<Object> visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChild(_type, visitor);
+    safelyVisitChild(_identifier, visitor);
+  }
+  Token get firstTokenAfterCommentAndMetadata {
+    if (_keyword != null) {
+      return _keyword;
+    } else if (_type != null) {
+      return _type.beginToken;
+    }
+    return _identifier.beginToken;
+  }
 }
 /**
  * Instances of the class {@code DefaultFormalParameter} represent a formal parameter with a default
@@ -3329,6 +3541,7 @@
  * defaultFormalParameter ::={@link NormalFormalParameter normalFormalParameter} ('=' {@link Expression defaultValue})?
  * defaultNamedParameter ::={@link NormalFormalParameter normalFormalParameter} (':' {@link Expression defaultValue})?
  * </pre>
+ * @coverage dart.engine.ast
  */
 class DefaultFormalParameter extends FormalParameter {
   /**
@@ -3398,13 +3611,15 @@
    */
   Token get separator => _separator;
   /**
-   * Return {@code true} if this parameter is a const parameter.
-   * @return {@code true} if this parameter is a const parameter
+   * 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 is a final parameter.
-   * @return {@code true} if this parameter is a final parameter
+   * 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
+   * implicitly final.
+   * @return {@code true} if this parameter was declared with the 'final' modifier
    */
   bool isFinal() => _parameter != null && _parameter.isFinal();
   /**
@@ -3445,6 +3660,7 @@
  * directive.
  * <pre>
  * directive ::={@link ExportDirective exportDirective}| {@link ImportDirective importDirective}| {@link LibraryDirective libraryDirective}| {@link PartDirective partDirective}| {@link PartOfDirective partOfDirective}</pre>
+ * @coverage dart.engine.ast
  */
 abstract class Directive extends AnnotatedNode {
   /**
@@ -3492,6 +3708,7 @@
  * doStatement ::=
  * 'do' {@link Statement body} 'while' '(' {@link Expression condition} ')' ';'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class DoStatement extends Statement {
   /**
@@ -3653,6 +3870,7 @@
  * exponent ::=
  * ('e' | 'E') ('+' | '-')? decimalDigit+
  * </pre>
+ * @coverage dart.engine.ast
  */
 class DoubleLiteral extends Literal {
   /**
@@ -3715,6 +3933,7 @@
  * emptyFunctionBody ::=
  * ';'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class EmptyFunctionBody extends FunctionBody {
   /**
@@ -3758,6 +3977,7 @@
  * emptyStatement ::=
  * ';'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class EmptyStatement extends Statement {
   /**
@@ -3795,10 +4015,21 @@
   }
 }
 /**
+ * Ephemeral identifiers are created as needed to mimic the presence of an empty identifier.
+ * @coverage dart.engine.ast
+ */
+class EphemeralIdentifier extends SimpleIdentifier {
+  EphemeralIdentifier.full(ASTNode parent, int location) : super.full(new Token(TokenType.IDENTIFIER, location)) {
+    parent.becomeParentOf(this);
+  }
+  EphemeralIdentifier({ASTNode parent, int location}) : this.full(parent, location);
+}
+/**
  * Instances of the class {@code ExportDirective} represent an export directive.
  * <pre>
  * exportDirective ::={@link Annotation metadata} 'export' {@link StringLiteral libraryUri} {@link Combinator combinator}* ';'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class ExportDirective extends NamespaceDirective {
   /**
@@ -3834,6 +4065,7 @@
  * <pre>
  * expression ::={@link AssignmentExpression assignmentExpression}| {@link ConditionalExpression conditionalExpression} cascadeSection
  * | {@link ThrowExpression throwExpression}</pre>
+ * @coverage dart.engine.ast
  */
 abstract class Expression extends ASTNode {
   /**
@@ -3846,6 +4078,21 @@
    */
   Type2 _propagatedType;
   /**
+   * If this expression is an argument to an invocation, and the AST structure has been resolved,
+   * and the function being invoked is known, and this expression corresponds to one of the
+   * parameters of the function being invoked, then return the parameter element representing the
+   * parameter to which the value of this expression will be bound. Otherwise, return {@code null}.
+   * @return the parameter element representing the parameter to which the value of this expression
+   * will be bound
+   */
+  ParameterElement get parameterElement {
+    ASTNode parent3 = parent;
+    if (parent3 is ArgumentList) {
+      return ((parent3 as ArgumentList)).getParameterElementFor(this);
+    }
+    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
@@ -3884,6 +4131,7 @@
  * expressionFunctionBody ::=
  * '=>' {@link Expression expression} ';'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class ExpressionFunctionBody extends FunctionBody {
   /**
@@ -3972,6 +4220,7 @@
  * <pre>
  * expressionStatement ::={@link Expression expression}? ';'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class ExpressionStatement extends Statement {
   /**
@@ -4041,6 +4290,7 @@
  * <pre>
  * extendsClause ::=
  * 'extends' {@link TypeName superclass}</pre>
+ * @coverage dart.engine.ast
  */
 class ExtendsClause extends ASTNode {
   /**
@@ -4083,8 +4333,8 @@
    * Set the token representing the 'extends' keyword to the given token.
    * @param keyword the token representing the 'extends' keyword
    */
-  void set keyword(Token keyword8) {
-    this._keyword = keyword8;
+  void set keyword(Token keyword9) {
+    this._keyword = keyword9;
   }
   /**
    * Set the name of the class that is being extended to the given name.
@@ -4104,6 +4354,7 @@
  * fieldDeclaration ::=
  * 'static'? {@link VariableDeclarationList fieldList} ';'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class FieldDeclaration extends ClassMember {
   /**
@@ -4141,6 +4392,7 @@
    */
   FieldDeclaration({Comment comment, List<Annotation> metadata, Token keyword, VariableDeclarationList fieldList, Token semicolon}) : this.full(comment, metadata, keyword, fieldList, semicolon);
   accept(ASTVisitor visitor) => visitor.visitFieldDeclaration(this);
+  Element get element => null;
   Token get endToken => _semicolon;
   /**
    * Return the fields being declared.
@@ -4169,8 +4421,8 @@
    * Set the token representing the 'static' keyword to the given token.
    * @param keyword the token representing the 'static' keyword
    */
-  void set keyword(Token keyword9) {
-    this._keyword = keyword9;
+  void set keyword(Token keyword10) {
+    this._keyword = keyword10;
   }
   /**
    * Set the semicolon terminating the declaration to the given token.
@@ -4195,6 +4447,7 @@
  * <pre>
  * fieldFormalParameter ::=
  * ('final' {@link TypeName type} | 'const' {@link TypeName type} | 'var' | {@link TypeName type})? 'this' '.' {@link SimpleIdentifier identifier}</pre>
+ * @coverage dart.engine.ast
  */
 class FieldFormalParameter extends NormalFormalParameter {
   /**
@@ -4279,8 +4532,8 @@
    * 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
    */
-  void set keyword(Token keyword10) {
-    this._keyword = keyword10;
+  void set keyword(Token keyword11) {
+    this._keyword = keyword11;
   }
   /**
    * Set the token representing the period to the given token.
@@ -4314,6 +4567,7 @@
  * <pre>
  * forEachStatement ::=
  * 'for' '(' {@link SimpleFormalParameter loopParameter} 'in' {@link Expression iterator} ')' {@link Block body}</pre>
+ * @coverage dart.engine.ast
  */
 class ForEachStatement extends Statement {
   /**
@@ -4327,7 +4581,7 @@
   /**
    * The declaration of the loop variable.
    */
-  SimpleFormalParameter _loopParameter;
+  DeclaredIdentifier _loopVariable;
   /**
    * The token representing the 'in' keyword.
    */
@@ -4348,15 +4602,15 @@
    * Initialize a newly created for-each statement.
    * @param forKeyword the token representing the 'for' keyword
    * @param leftParenthesis the left parenthesis
-   * @param loopParameter the declaration of the loop variable
+   * @param loopVariable the declaration of the loop variable
    * @param iterator the expression evaluated to produce the iterator
    * @param rightParenthesis the right parenthesis
    * @param body the body of the loop
    */
-  ForEachStatement.full(Token forKeyword, Token leftParenthesis, SimpleFormalParameter loopParameter, Token inKeyword, Expression iterator, Token rightParenthesis, Statement body) {
+  ForEachStatement.full(Token forKeyword, Token leftParenthesis, DeclaredIdentifier loopVariable, Token inKeyword, Expression iterator, Token rightParenthesis, Statement body) {
     this._forKeyword = forKeyword;
     this._leftParenthesis = leftParenthesis;
-    this._loopParameter = becomeParentOf(loopParameter);
+    this._loopVariable = becomeParentOf(loopVariable);
     this._inKeyword = inKeyword;
     this._iterator = becomeParentOf(iterator);
     this._rightParenthesis = rightParenthesis;
@@ -4366,12 +4620,12 @@
    * Initialize a newly created for-each statement.
    * @param forKeyword the token representing the 'for' keyword
    * @param leftParenthesis the left parenthesis
-   * @param loopParameter the declaration of the loop variable
+   * @param loopVariable the declaration of the loop variable
    * @param iterator the expression evaluated to produce the iterator
    * @param rightParenthesis the right parenthesis
    * @param body the body of the loop
    */
-  ForEachStatement({Token forKeyword, Token leftParenthesis, SimpleFormalParameter loopParameter, Token inKeyword, Expression iterator, Token rightParenthesis, Statement body}) : this.full(forKeyword, leftParenthesis, loopParameter, inKeyword, iterator, rightParenthesis, body);
+  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;
   /**
@@ -4404,7 +4658,7 @@
    * Return the declaration of the loop variable.
    * @return the declaration of the loop variable
    */
-  SimpleFormalParameter get loopParameter => _loopParameter;
+  DeclaredIdentifier get loopVariable => _loopVariable;
   /**
    * Return the right parenthesis.
    * @return the right parenthesis
@@ -4446,11 +4700,11 @@
     this._leftParenthesis = leftParenthesis3;
   }
   /**
-   * Set the declaration of the loop variable to the given parameter.
-   * @param parameter the declaration of the loop variable
+   * Set the declaration of the loop variable to the given variable.
+   * @param variable the declaration of the loop variable
    */
-  void set loopParameter(SimpleFormalParameter parameter) {
-    _loopParameter = becomeParentOf(parameter);
+  void set loopVariable(DeclaredIdentifier variable) {
+    _loopVariable = becomeParentOf(variable);
   }
   /**
    * Set the right parenthesis to the given token.
@@ -4460,7 +4714,7 @@
     this._rightParenthesis = rightParenthesis3;
   }
   void visitChildren(ASTVisitor<Object> visitor) {
-    safelyVisitChild(_loopParameter, visitor);
+    safelyVisitChild(_loopVariable, visitor);
     safelyVisitChild(_iterator, visitor);
     safelyVisitChild(_body, visitor);
   }
@@ -4473,6 +4727,7 @@
  * forInitializerStatement ';' {@link Expression expression}? ';' {@link Expression expressionList}?
  * forInitializerStatement ::={@link DefaultFormalParameter initializedVariableDeclaration}| {@link Expression expression}?
  * </pre>
+ * @coverage dart.engine.ast
  */
 class ForStatement extends Statement {
   /**
@@ -4688,6 +4943,7 @@
  * parameter to a function.
  * <pre>
  * formalParameter ::={@link NormalFormalParameter normalFormalParameter}| {@link DefaultFormalParameter namedFormalParameter}| {@link DefaultFormalParameter optionalFormalParameter}</pre>
+ * @coverage dart.engine.ast
  */
 abstract class FormalParameter extends ASTNode {
   /**
@@ -4696,11 +4952,11 @@
    * @return the element representing this parameter
    */
   ParameterElement get element {
-    SimpleIdentifier identifier9 = identifier;
-    if (identifier9 == null) {
+    SimpleIdentifier identifier12 = identifier;
+    if (identifier12 == null) {
       return null;
     }
-    return (identifier9.element as ParameterElement);
+    return identifier12.element as ParameterElement;
   }
   /**
    * Return the name of the parameter being declared.
@@ -4735,6 +4991,7 @@
  * namedFormalParameters ::=
  * '{' {@link DefaultFormalParameter namedFormalParameter} (',' {@link DefaultFormalParameter namedFormalParameter})* '}'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class FormalParameterList extends ASTNode {
   /**
@@ -4866,6 +5123,7 @@
  * body of a function or method.
  * <pre>
  * functionBody ::={@link BlockFunctionBody blockFunctionBody}| {@link EmptyFunctionBody emptyFunctionBody}| {@link ExpressionFunctionBody expressionFunctionBody}</pre>
+ * @coverage dart.engine.ast
  */
 abstract class FunctionBody extends ASTNode {
 }
@@ -4876,6 +5134,7 @@
  * functionDeclaration ::=
  * 'external' functionSignature
  * | functionSignature {@link FunctionBody functionBody}functionSignature ::={@link Type returnType}? ('get' | 'set')? {@link SimpleIdentifier functionName} {@link FormalParameterList formalParameterList}</pre>
+ * @coverage dart.engine.ast
  */
 class FunctionDeclaration extends CompilationUnitMember {
   /**
@@ -4929,12 +5188,7 @@
    */
   FunctionDeclaration({Comment comment, List<Annotation> metadata, Token externalKeyword, TypeName returnType, Token propertyKeyword, SimpleIdentifier name, FunctionExpression functionExpression}) : this.full(comment, metadata, externalKeyword, returnType, propertyKeyword, name, functionExpression);
   accept(ASTVisitor visitor) => visitor.visitFunctionDeclaration(this);
-  /**
-   * Return the {@link FunctionElement} associated with this function, or {@code null} if the AST
-   * structure has not been resolved.
-   * @return the {@link FunctionElement} associated with this function
-   */
-  FunctionElement get element => _name != null ? (_name.element as FunctionElement) : null;
+  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
@@ -5020,6 +5274,7 @@
 }
 /**
  * Instances of the class {@code FunctionDeclarationStatement} wrap a {@link FunctionDeclarationfunction declaration} as a statement.
+ * @coverage dart.engine.ast
  */
 class FunctionDeclarationStatement extends Statement {
   /**
@@ -5061,6 +5316,7 @@
  * Instances of the class {@code FunctionExpression} represent a function expression.
  * <pre>
  * functionExpression ::={@link FormalParameterList formalParameterList} {@link FunctionBody functionBody}</pre>
+ * @coverage dart.engine.ast
  */
 class FunctionExpression extends Expression {
   /**
@@ -5157,6 +5413,7 @@
  * getters and setters are represented by either {@link PrefixedIdentifier prefixed identifier} or{@link PropertyAccess property access} nodes.
  * <pre>
  * functionExpressionInvoction ::={@link Expression function} {@link ArgumentList argumentList}</pre>
+ * @coverage dart.engine.ast
  */
 class FunctionExpressionInvocation extends Expression {
   /**
@@ -5239,6 +5496,7 @@
  * functionTypeAlias ::=
  * functionPrefix {@link TypeParameterList typeParameterList}? {@link FormalParameterList formalParameterList} ';'
  * functionPrefix ::={@link TypeName returnType}? {@link SimpleIdentifier name}</pre>
+ * @coverage dart.engine.ast
  */
 class FunctionTypeAlias extends TypeAlias {
   /**
@@ -5289,12 +5547,7 @@
    */
   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);
-  /**
-   * Return the {@link TypeAliasElement} associated with this type alias, or {@code null} if the AST
-   * structure has not been resolved.
-   * @return the {@link TypeAliasElement} associated with this type alias
-   */
-  TypeAliasElement get element => _name != null ? (_name.element as TypeAliasElement) : null;
+  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
@@ -5358,6 +5611,7 @@
  * parameter.
  * <pre>
  * functionSignature ::={@link TypeName returnType}? {@link SimpleIdentifier identifier} {@link FormalParameterList formalParameterList}</pre>
+ * @coverage dart.engine.ast
  */
 class FunctionTypedFormalParameter extends NormalFormalParameter {
   /**
@@ -5440,6 +5694,7 @@
  * hideCombinator ::=
  * 'hide' {@link SimpleIdentifier identifier} (',' {@link SimpleIdentifier identifier})
  * </pre>
+ * @coverage dart.engine.ast
  */
 class HideCombinator extends Combinator {
   /**
@@ -5477,6 +5732,7 @@
  * identifier.
  * <pre>
  * identifier ::={@link SimpleIdentifier simpleIdentifier}| {@link PrefixedIdentifier prefixedIdentifier}</pre>
+ * @coverage dart.engine.ast
  */
 abstract class Identifier extends Expression {
   /**
@@ -5487,30 +5743,18 @@
    */
   static bool isPrivateName(String name) => name.startsWith("_");
   /**
-   * 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.
-   */
-  Element _element;
-  /**
    * 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
    */
-  Element get element => _element;
+  Element get element;
   /**
    * Return the lexical representation of the identifier.
    * @return the lexical representation of the identifier
    */
   String get name;
   bool isAssignable() => true;
-  /**
-   * Set the element associated with this identifier to the given element.
-   * @param element the element associated with this identifier
-   */
-  void set element(Element element11) {
-    this._element = element11;
-  }
 }
 /**
  * Instances of the class {@code IfStatement} represent an if statement.
@@ -5518,6 +5762,7 @@
  * ifStatement ::=
  * 'if' '(' {@link Expression expression} ')' {@link Statement thenStatement} ('else' {@link Statement elseStatement})?
  * </pre>
+ * @coverage dart.engine.ast
  */
 class IfStatement extends Statement {
   /**
@@ -5687,6 +5932,7 @@
  * implementsClause ::=
  * 'implements' {@link TypeName superclass} (',' {@link TypeName superclass})
  * </pre>
+ * @coverage dart.engine.ast
  */
 class ImplementsClause extends ASTNode {
   /**
@@ -5730,8 +5976,8 @@
    * Set the token representing the 'implements' keyword to the given token.
    * @param keyword the token representing the 'implements' keyword
    */
-  void set keyword(Token keyword11) {
-    this._keyword = keyword11;
+  void set keyword(Token keyword12) {
+    this._keyword = keyword12;
   }
   void visitChildren(ASTVisitor<Object> visitor) {
     _interfaces.accept(visitor);
@@ -5742,6 +5988,7 @@
  * <pre>
  * importDirective ::={@link Annotation metadata} 'import' {@link StringLiteral libraryUri} ('as' identifier)? {@link Combinator combinator}* ';'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class ImportDirective extends NamespaceDirective {
   /**
@@ -5818,6 +6065,7 @@
  * <pre>
  * indexExpression ::={@link Expression target} '[' {@link Expression index} ']'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class IndexExpression extends Expression {
   /**
@@ -5855,7 +6103,7 @@
    * @param rightBracket the right square bracket
    */
   IndexExpression.forTarget_full(Expression target3, Token leftBracket4, Expression index2, Token rightBracket4) {
-    _jtd_constructor_56_impl(target3, leftBracket4, index2, rightBracket4);
+    _jtd_constructor_58_impl(target3, leftBracket4, index2, rightBracket4);
   }
   /**
    * Initialize a newly created index expression.
@@ -5865,7 +6113,7 @@
    * @param rightBracket the right square bracket
    */
   IndexExpression.forTarget({Expression target3, Token leftBracket4, Expression index2, Token rightBracket4}) : this.forTarget_full(target3, leftBracket4, index2, rightBracket4);
-  _jtd_constructor_56_impl(Expression target3, Token leftBracket4, Expression index2, Token rightBracket4) {
+  _jtd_constructor_58_impl(Expression target3, Token leftBracket4, Expression index2, Token rightBracket4) {
     this._target = becomeParentOf(target3);
     this._leftBracket = leftBracket4;
     this._index = becomeParentOf(index2);
@@ -5879,7 +6127,7 @@
    * @param rightBracket the right square bracket
    */
   IndexExpression.forCascade_full(Token period7, Token leftBracket5, Expression index3, Token rightBracket5) {
-    _jtd_constructor_57_impl(period7, leftBracket5, index3, rightBracket5);
+    _jtd_constructor_59_impl(period7, leftBracket5, index3, rightBracket5);
   }
   /**
    * Initialize a newly created index expression.
@@ -5889,7 +6137,7 @@
    * @param rightBracket the right square bracket
    */
   IndexExpression.forCascade({Token period7, Token leftBracket5, Expression index3, Token rightBracket5}) : this.forCascade_full(period7, leftBracket5, index3, rightBracket5);
-  _jtd_constructor_57_impl(Token period7, Token leftBracket5, Expression index3, Token rightBracket5) {
+  _jtd_constructor_59_impl(Token period7, Token leftBracket5, Expression index3, Token rightBracket5) {
     this._period = period7;
     this._leftBracket = leftBracket5;
     this._index = becomeParentOf(index3);
@@ -5967,9 +6215,9 @@
    * @return {@code true} if this expression is in a context where the operator '[]' will be invoked
    */
   bool inGetterContext() {
-    ASTNode parent3 = parent;
-    if (parent3 is AssignmentExpression) {
-      AssignmentExpression assignment = (parent3 as AssignmentExpression);
+    ASTNode parent4 = parent;
+    if (parent4 is AssignmentExpression) {
+      AssignmentExpression assignment = parent4 as AssignmentExpression;
       if (identical(assignment.leftHandSide, this) && identical(assignment.operator.type, TokenType.EQ)) {
         return false;
       }
@@ -5985,13 +6233,13 @@
    * invoked
    */
   bool inSetterContext() {
-    ASTNode parent4 = parent;
-    if (parent4 is PrefixExpression) {
-      return ((parent4 as PrefixExpression)).operator.type.isIncrementOperator();
-    } else if (parent4 is PostfixExpression) {
+    ASTNode parent5 = parent;
+    if (parent5 is PrefixExpression) {
+      return ((parent5 as PrefixExpression)).operator.type.isIncrementOperator();
+    } else if (parent5 is PostfixExpression) {
       return true;
-    } else if (parent4 is AssignmentExpression) {
-      return identical(((parent4 as AssignmentExpression)).leftHandSide, this);
+    } else if (parent5 is AssignmentExpression) {
+      return identical(((parent5 as AssignmentExpression)).leftHandSide, this);
     }
     return false;
   }
@@ -6013,8 +6261,8 @@
    * Set the element associated with the operator to the given element.
    * @param element the element associated with this operator
    */
-  void set element(MethodElement element12) {
-    this._element = element12;
+  void set element(MethodElement element11) {
+    this._element = element11;
   }
   /**
    * Set the expression used to compute the index to the given expression.
@@ -6055,6 +6303,7 @@
  * <pre>
  * newExpression ::=
  * ('new' | 'const') {@link TypeName type} ('.' {@link SimpleIdentifier identifier})? {@link ArgumentList argumentList}</pre>
+ * @coverage dart.engine.ast
  */
 class InstanceCreationExpression extends Expression {
   /**
@@ -6117,6 +6366,11 @@
    */
   Token get keyword => _keyword;
   /**
+   * 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
    */
@@ -6134,15 +6388,15 @@
    * Set the element associated with the constructor to the given element.
    * @param element the element associated with the constructor
    */
-  void set element(ConstructorElement element13) {
-    this._element = element13;
+  void set element(ConstructorElement element12) {
+    this._element = element12;
   }
   /**
    * 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
    */
-  void set keyword(Token keyword12) {
-    this._keyword = keyword12;
+  void set keyword(Token keyword13) {
+    this._keyword = keyword13;
   }
   void visitChildren(ASTVisitor<Object> visitor) {
     safelyVisitChild(_constructorName, visitor);
@@ -6161,6 +6415,7 @@
  * '0x' hexidecimalDigit+
  * | '0X' hexidecimalDigit+
  * </pre>
+ * @coverage dart.engine.ast
  */
 class IntegerLiteral extends Literal {
   /**
@@ -6220,6 +6475,7 @@
  * The abstract class {@code InterpolationElement} defines the behavior common to elements within a{@link StringInterpolation string interpolation}.
  * <pre>
  * interpolationElement ::={@link InterpolationExpression interpolationExpression}| {@link InterpolationString interpolationString}</pre>
+ * @coverage dart.engine.ast
  */
 abstract class InterpolationElement extends ASTNode {
 }
@@ -6230,6 +6486,7 @@
  * interpolationExpression ::=
  * '$' {@link SimpleIdentifier identifier}| '$' '{' {@link Expression expression} '}'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class InterpolationExpression extends InterpolationElement {
   /**
@@ -6319,6 +6576,7 @@
  * interpolationString ::=
  * characters
  * </pre>
+ * @coverage dart.engine.ast
  */
 class InterpolationString extends InterpolationElement {
   /**
@@ -6378,6 +6636,7 @@
  * Instances of the class {@code IsExpression} represent an is expression.
  * <pre>
  * isExpression ::={@link Expression expression} 'is' '!'? {@link TypeName type}</pre>
+ * @coverage dart.engine.ast
  */
 class IsExpression extends Expression {
   /**
@@ -6479,6 +6738,7 @@
  * <pre>
  * label ::={@link SimpleIdentifier label} ':'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class Label extends ASTNode {
   /**
@@ -6528,8 +6788,8 @@
    * Set the label being associated with the statement to the given label.
    * @param label the label being associated with the statement
    */
-  void set label(SimpleIdentifier label2) {
-    this._label = becomeParentOf(label2);
+  void set label(SimpleIdentifier label3) {
+    this._label = becomeParentOf(label3);
   }
   void visitChildren(ASTVisitor<Object> visitor) {
     safelyVisitChild(_label, visitor);
@@ -6540,6 +6800,7 @@
  * with them.
  * <pre>
  * labeledStatement ::={@link Label label}+ {@link Statement statement}</pre>
+ * @coverage dart.engine.ast
  */
 class LabeledStatement extends Statement {
   /**
@@ -6601,6 +6862,7 @@
  * <pre>
  * libraryDirective ::={@link Annotation metadata} 'library' {@link Identifier name} ';'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class LibraryDirective extends Directive {
   /**
@@ -6687,6 +6949,7 @@
  * <pre>
  * libraryIdentifier ::={@link SimpleIdentifier component} ('.' {@link SimpleIdentifier component})
  * </pre>
+ * @coverage dart.engine.ast
  */
 class LibraryIdentifier extends Identifier {
   /**
@@ -6713,17 +6976,18 @@
    * @return the components of the identifier
    */
   NodeList<SimpleIdentifier> get components => _components;
+  Element get element => null;
   Token get endToken => _components.endToken;
   String get name {
-    StringBuffer builder = new StringBuffer();
+    JavaStringBuilder builder = new JavaStringBuilder();
     bool needsPeriod = false;
     for (SimpleIdentifier identifier in _components) {
       if (needsPeriod) {
-        builder.add(".");
+        builder.append(".");
       } else {
         needsPeriod = true;
       }
-      builder.add(identifier.name);
+      builder.append(identifier.name);
     }
     return builder.toString();
   }
@@ -6737,6 +7001,7 @@
  * listLiteral ::=
  * 'const'? ('<' {@link TypeName type} '>')? '[' ({@link Expression expressionList} ','?)? ']'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class ListLiteral extends TypedLiteral {
   /**
@@ -6828,6 +7093,7 @@
  * expression.
  * <pre>
  * literal ::={@link BooleanLiteral booleanLiteral}| {@link DoubleLiteral doubleLiteral}| {@link IntegerLiteral integerLiteral}| {@link ListLiteral listLiteral}| {@link MapLiteral mapLiteral}| {@link NullLiteral nullLiteral}| {@link StringLiteral stringLiteral}</pre>
+ * @coverage dart.engine.ast
  */
 abstract class Literal extends Expression {
 }
@@ -6837,6 +7103,7 @@
  * mapLiteral ::=
  * 'const'? ('<' {@link TypeName type} '>')? '{' ({@link MapLiteralEntry entry} (',' {@link MapLiteralEntry entry})* ','?)? '}'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class MapLiteral extends TypedLiteral {
   /**
@@ -6928,6 +7195,7 @@
  * literal.
  * <pre>
  * mapLiteralEntry ::={@link StringLiteral key} ':' {@link Expression value}</pre>
+ * @coverage dart.engine.ast
  */
 class MapLiteralEntry extends ASTNode {
   /**
@@ -7010,8 +7278,8 @@
  * <pre>
  * methodDeclaration ::=
  * methodSignature {@link FunctionBody body}methodSignature ::=
- * 'external'? ('abstract' | 'static')? {@link Type returnType}? ('get' | 'set')? methodName{@link FormalParameterList formalParameterList}methodName ::={@link SimpleIdentifier name} ('.' {@link SimpleIdentifier name})?
- * | 'operator' {@link SimpleIdentifier operator}</pre>
+ * 'external'? ('abstract' | 'static')? {@link Type returnType}? ('get' | 'set')? methodName{@link FormalParameterList formalParameterList}methodName ::={@link SimpleIdentifier name}| 'operator' {@link SimpleIdentifier operator}</pre>
+ * @coverage dart.engine.ast
  */
 class MethodDeclaration extends ClassMember {
   /**
@@ -7040,7 +7308,7 @@
   /**
    * The name of the method.
    */
-  Identifier _name;
+  SimpleIdentifier _name;
   /**
    * The parameters associated with the method, or {@code null} if this method declares a getter.
    */
@@ -7063,7 +7331,7 @@
    * declares a getter
    * @param body the body of the method
    */
-  MethodDeclaration.full(Comment comment, List<Annotation> metadata, Token externalKeyword, Token modifierKeyword, TypeName returnType, Token propertyKeyword, Token operatorKeyword, Identifier name, FormalParameterList parameters, FunctionBody body) : super.full(comment, metadata) {
+  MethodDeclaration.full(Comment comment, List<Annotation> metadata, Token externalKeyword, Token modifierKeyword, TypeName returnType, Token propertyKeyword, Token operatorKeyword, SimpleIdentifier name, FormalParameterList parameters, FunctionBody body) : super.full(comment, metadata) {
     this._externalKeyword = externalKeyword;
     this._modifierKeyword = modifierKeyword;
     this._returnType = becomeParentOf(returnType);
@@ -7087,7 +7355,7 @@
    * declares a getter
    * @param body the body of the method
    */
-  MethodDeclaration({Comment comment, List<Annotation> metadata, Token externalKeyword, Token modifierKeyword, TypeName returnType, Token propertyKeyword, Token operatorKeyword, Identifier name, FormalParameterList parameters, FunctionBody body}) : this.full(comment, metadata, externalKeyword, modifierKeyword, returnType, propertyKeyword, operatorKeyword, name, parameters, body);
+  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.
@@ -7119,7 +7387,7 @@
    * Return the name of the method.
    * @return the name of the method
    */
-  Identifier get name => _name;
+  SimpleIdentifier get name => _name;
   /**
    * Return the token representing the 'operator' keyword, or {@code null} if this method does not
    * declare an operator.
@@ -7144,6 +7412,11 @@
    */
   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() => _modifierKeyword != null && identical(((_modifierKeyword as KeywordToken)).keyword, Keyword.ABSTRACT);
+  /**
    * Return {@code true} if this method declares a getter.
    * @return {@code true} if this method declares a getter
    */
@@ -7159,6 +7432,11 @@
    */
   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
    */
@@ -7183,7 +7461,7 @@
    * Set the name of the method to the given identifier.
    * @param identifier the name of the method
    */
-  void set name(Identifier identifier) {
+  void set name(SimpleIdentifier identifier) {
     _name = becomeParentOf(identifier);
   }
   /**
@@ -7241,6 +7519,7 @@
  * <pre>
  * methodInvoction ::=
  * ({@link Expression target} '.')? {@link SimpleIdentifier methodName} {@link ArgumentList argumentList}</pre>
+ * @coverage dart.engine.ast
  */
 class MethodInvocation extends Expression {
   /**
@@ -7291,6 +7570,8 @@
   Token get beginToken {
     if (_target != null) {
       return _target.beginToken;
+    } else if (_period != null) {
+      return _period;
     }
     return _methodName.beginToken;
   }
@@ -7380,6 +7661,7 @@
  * with it. They are used in method invocations when there are named parameters.
  * <pre>
  * namedExpression ::={@link Label name} {@link Expression expression}</pre>
+ * @coverage dart.engine.ast
  */
 class NamedExpression extends Expression {
   /**
@@ -7407,6 +7689,18 @@
   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.
+   * @return the element representing the parameter being named by this expression
+   */
+  ParameterElement get element {
+    Element element20 = _name.label.element;
+    if (element20 is ParameterElement) {
+      return element20 as ParameterElement;
+    }
+    return null;
+  }
   Token get endToken => _expression.endToken;
   /**
    * Return the expression with which the name is associated.
@@ -7442,6 +7736,7 @@
  * a directive that impacts the namespace of a library.
  * <pre>
  * directive ::={@link ExportDirective exportDirective}| {@link ImportDirective importDirective}</pre>
+ * @coverage dart.engine.ast
  */
 abstract class NamespaceDirective extends UriBasedDirective {
   /**
@@ -7514,6 +7809,7 @@
  * that are required (are not optional).
  * <pre>
  * normalFormalParameter ::={@link FunctionTypedFormalParameter functionSignature}| {@link FieldFormalParameter fieldFormalParameter}| {@link SimpleFormalParameter simpleFormalParameter}</pre>
+ * @coverage dart.engine.ast
  */
 abstract class NormalFormalParameter extends FormalParameter {
   /**
@@ -7556,9 +7852,9 @@
   Comment get documentationComment => _comment;
   SimpleIdentifier get identifier => _identifier;
   ParameterKind get kind {
-    ASTNode parent5 = parent;
-    if (parent5 is DefaultFormalParameter) {
-      return ((parent5 as DefaultFormalParameter)).kind;
+    ASTNode parent6 = parent;
+    if (parent6 is DefaultFormalParameter) {
+      return ((parent6 as DefaultFormalParameter)).kind;
     }
     return ParameterKind.REQUIRED;
   }
@@ -7568,13 +7864,15 @@
    */
   NodeList<Annotation> get metadata => _metadata;
   /**
-   * Return {@code true} if this parameter is a const parameter.
-   * @return {@code true} if this parameter is a const parameter
+   * 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 is a final parameter.
-   * @return {@code true} if this parameter is a final parameter
+   * 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
+   * implicitly final.
+   * @return {@code true} if this parameter was declared with the 'final' modifier
    */
   bool isFinal();
   /**
@@ -7588,8 +7886,8 @@
    * Set the name of the parameter being declared to the given identifier.
    * @param identifier the name of the parameter being declared
    */
-  void set identifier(SimpleIdentifier identifier6) {
-    this._identifier = becomeParentOf(identifier6);
+  void set identifier(SimpleIdentifier identifier8) {
+    this._identifier = becomeParentOf(identifier8);
   }
   void visitChildren(ASTVisitor<Object> visitor) {
     if (commentIsBeforeAnnotations()) {
@@ -7633,6 +7931,7 @@
  * nullLiteral ::=
  * 'null'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class NullLiteral extends Literal {
   /**
@@ -7675,6 +7974,7 @@
  * parenthesizedExpression ::=
  * '(' {@link Expression expression} ')'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class ParenthesizedExpression extends Expression {
   /**
@@ -7755,6 +8055,7 @@
  * <pre>
  * partDirective ::={@link Annotation metadata} 'part' {@link StringLiteral partUri} ';'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class PartDirective extends UriBasedDirective {
   /**
@@ -7820,6 +8121,7 @@
  * <pre>
  * partOfDirective ::={@link Annotation metadata} 'part' 'of' {@link Identifier libraryName} ';'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class PartOfDirective extends Directive {
   /**
@@ -7924,6 +8226,7 @@
  * Instances of the class {@code PostfixExpression} represent a postfix unary expression.
  * <pre>
  * postfixExpression ::={@link Expression operand} {@link Token operator}</pre>
+ * @coverage dart.engine.ast
  */
 class PostfixExpression extends Expression {
   /**
@@ -7978,8 +8281,8 @@
    * Set the element associated with the operator to the given element.
    * @param element the element associated with the operator
    */
-  void set element(MethodElement element14) {
-    this._element = element14;
+  void set element(MethodElement element13) {
+    this._element = element13;
   }
   /**
    * Set the expression computing the operand for the operator to the given expression.
@@ -8003,6 +8306,7 @@
  * Instances of the class {@code PrefixExpression} represent a prefix unary expression.
  * <pre>
  * prefixExpression ::={@link Token operator} {@link Expression operand}</pre>
+ * @coverage dart.engine.ast
  */
 class PrefixExpression extends Expression {
   /**
@@ -8057,8 +8361,8 @@
    * Set the element associated with the operator to the given element.
    * @param element the element associated with the operator
    */
-  void set element(MethodElement element15) {
-    this._element = element15;
+  void set element(MethodElement element14) {
+    this._element = element14;
   }
   /**
    * Set the expression computing the operand for the operator to the given expression.
@@ -8084,6 +8388,7 @@
  * identifier.
  * <pre>
  * prefixedIdentifier ::={@link SimpleIdentifier prefix} '.' {@link SimpleIdentifier identifier}</pre>
+ * @coverage dart.engine.ast
  */
 class PrefixedIdentifier extends Identifier {
   /**
@@ -8118,6 +8423,12 @@
   PrefixedIdentifier({SimpleIdentifier prefix, Token period, SimpleIdentifier identifier}) : this.full(prefix, period, identifier);
   accept(ASTVisitor visitor) => visitor.visitPrefixedIdentifier(this);
   Token get beginToken => _prefix.beginToken;
+  Element get element {
+    if (_identifier == null) {
+      return null;
+    }
+    return _identifier.element;
+  }
   Token get endToken => _identifier.endToken;
   /**
    * Return the identifier being prefixed.
@@ -8139,8 +8450,8 @@
    * Set the identifier being prefixed to the given identifier.
    * @param identifier the identifier being prefixed
    */
-  void set identifier(SimpleIdentifier identifier7) {
-    this._identifier = becomeParentOf(identifier7);
+  void set identifier(SimpleIdentifier identifier9) {
+    this._identifier = becomeParentOf(identifier9);
   }
   /**
    * Set the period used to separate the prefix from the identifier to the given token.
@@ -8169,6 +8480,7 @@
  * identifier.
  * <pre>
  * propertyAccess ::={@link Expression target} '.' {@link SimpleIdentifier propertyName}</pre>
+ * @coverage dart.engine.ast
  */
 class PropertyAccess extends Expression {
   /**
@@ -8287,6 +8599,7 @@
  * redirectingConstructorInvocation ::=
  * 'this' ('.' identifier)? arguments
  * </pre>
+ * @coverage dart.engine.ast
  */
 class RedirectingConstructorInvocation extends ConstructorInitializer {
   /**
@@ -8382,15 +8695,15 @@
    * Set the element associated with the constructor to the given element.
    * @param element the element associated with the constructor
    */
-  void set element(ConstructorElement element16) {
-    this._element = element16;
+  void set element(ConstructorElement element15) {
+    this._element = element15;
   }
   /**
    * Set the token for the 'this' keyword to the given token.
    * @param keyword the token for the 'this' keyword
    */
-  void set keyword(Token keyword13) {
-    this._keyword = keyword13;
+  void set keyword(Token keyword14) {
+    this._keyword = keyword14;
   }
   /**
    * Set the token for the period before the name of the constructor that is being invoked to the
@@ -8411,6 +8724,7 @@
  * returnStatement ::=
  * 'return' {@link Expression expression}? ';'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class ReturnStatement extends Statement {
   /**
@@ -8474,8 +8788,8 @@
    * Set the token representing the 'return' keyword to the given token.
    * @param keyword the token representing the 'return' keyword
    */
-  void set keyword(Token keyword14) {
-    this._keyword = keyword14;
+  void set keyword(Token keyword15) {
+    this._keyword = keyword15;
   }
   /**
    * Set the semicolon terminating the statement to the given token.
@@ -8495,6 +8809,7 @@
  * scriptTag ::=
  * '#!' (~NEWLINE)* NEWLINE
  * </pre>
+ * @coverage dart.engine.ast
  */
 class ScriptTag extends ASTNode {
   /**
@@ -8538,6 +8853,7 @@
  * showCombinator ::=
  * 'show' {@link SimpleIdentifier identifier} (',' {@link SimpleIdentifier identifier})
  * </pre>
+ * @coverage dart.engine.ast
  */
 class ShowCombinator extends Combinator {
   /**
@@ -8575,6 +8891,7 @@
  * <pre>
  * simpleFormalParameter ::=
  * ('final' {@link TypeName type} | 'var' | {@link TypeName type})? {@link SimpleIdentifier identifier}</pre>
+ * @coverage dart.engine.ast
  */
 class SimpleFormalParameter extends NormalFormalParameter {
   /**
@@ -8635,8 +8952,8 @@
    * 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
    */
-  void set keyword(Token keyword15) {
-    this._keyword = keyword15;
+  void set keyword(Token keyword16) {
+    this._keyword = keyword16;
   }
   /**
    * Set the name of the declared type of the parameter to the given type name.
@@ -8659,6 +8976,7 @@
  * initialCharacter ::= '_' | '$' | letter
  * internalCharacter ::= '_' | '$' | letter | digit
  * </pre>
+ * @coverage dart.engine.ast
  */
 class SimpleIdentifier extends Identifier {
   /**
@@ -8666,6 +8984,11 @@
    */
   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.
+   */
+  Element _element;
+  /**
    * Initialize a newly created identifier.
    * @param token the token representing the identifier
    */
@@ -8679,6 +9002,7 @@
   SimpleIdentifier({Token token}) : this.full(token);
   accept(ASTVisitor visitor) => visitor.visitSimpleIdentifier(this);
   Token get beginToken => _token;
+  Element get element => _element;
   Token get endToken => _token;
   String get name => _token.lexeme;
   /**
@@ -8687,6 +9011,38 @@
    */
   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
+   */
+  bool inDeclarationContext() {
+    ASTNode parent7 = parent;
+    if (parent7 is CatchClause) {
+      CatchClause clause = parent7 as CatchClause;
+      return identical(this, clause.exceptionParameter) || identical(this, clause.stackTraceParameter);
+    } else if (parent7 is ClassDeclaration) {
+      return identical(this, ((parent7 as ClassDeclaration)).name);
+    } else if (parent7 is ClassTypeAlias) {
+      return identical(this, ((parent7 as ClassTypeAlias)).name);
+    } else if (parent7 is ConstructorDeclaration) {
+      return identical(this, ((parent7 as ConstructorDeclaration)).name);
+    } else if (parent7 is FunctionDeclaration) {
+      return identical(this, ((parent7 as FunctionDeclaration)).name);
+    } else if (parent7 is FunctionTypeAlias) {
+      return identical(this, ((parent7 as FunctionTypeAlias)).name);
+    } else if (parent7 is Label) {
+      return identical(this, ((parent7 as Label)).label) && (parent7.parent is LabeledStatement);
+    } else if (parent7 is MethodDeclaration) {
+      return identical(this, ((parent7 as MethodDeclaration)).name);
+    } else if (parent7 is NormalFormalParameter) {
+      return identical(this, ((parent7 as NormalFormalParameter)).identifier);
+    } else if (parent7 is TypeParameter) {
+      return identical(this, ((parent7 as TypeParameter)).name);
+    } else if (parent7 is VariableDeclaration) {
+      return identical(this, ((parent7 as VariableDeclaration)).name);
+    }
+    return false;
+  }
+  /**
    * Return {@code true} if this expression is computing a right-hand value.
    * <p>
    * Note that {@link #inGetterContext()} and {@link #inSetterContext()} are not opposites, nor are
@@ -8694,18 +9050,25 @@
    * @return {@code true} if this expression is in a context where a getter will be invoked
    */
   bool inGetterContext() {
-    ASTNode parent6 = parent;
+    ASTNode parent8 = parent;
     ASTNode target = this;
-    if (parent6 is PrefixedIdentifier) {
-      PrefixedIdentifier prefixed = (parent6 as PrefixedIdentifier);
+    if (parent8 is PrefixedIdentifier) {
+      PrefixedIdentifier prefixed = parent8 as PrefixedIdentifier;
       if (identical(prefixed.prefix, this)) {
         return true;
       }
-      parent6 = prefixed.parent;
+      parent8 = prefixed.parent;
       target = prefixed;
+    } else if (parent8 is PropertyAccess) {
+      PropertyAccess access = parent8 as PropertyAccess;
+      if (identical(access.target, this)) {
+        return true;
+      }
+      parent8 = access.parent;
+      target = access;
     }
-    if (parent6 is AssignmentExpression) {
-      AssignmentExpression expr = (parent6 as AssignmentExpression);
+    if (parent8 is AssignmentExpression) {
+      AssignmentExpression expr = parent8 as AssignmentExpression;
       if (identical(expr.leftHandSide, target) && identical(expr.operator.type, TokenType.EQ)) {
         return false;
       }
@@ -8720,27 +9083,41 @@
    * @return {@code true} if this expression is in a context where a setter will be invoked
    */
   bool inSetterContext() {
-    ASTNode parent7 = parent;
+    ASTNode parent9 = parent;
     ASTNode target = this;
-    if (parent7 is PrefixedIdentifier) {
-      PrefixedIdentifier prefixed = (parent7 as PrefixedIdentifier);
+    if (parent9 is PrefixedIdentifier) {
+      PrefixedIdentifier prefixed = parent9 as PrefixedIdentifier;
       if (identical(prefixed.prefix, this)) {
         return false;
       }
-      parent7 = prefixed.parent;
+      parent9 = prefixed.parent;
       target = prefixed;
+    } else if (parent9 is PropertyAccess) {
+      PropertyAccess access = parent9 as PropertyAccess;
+      if (identical(access.target, this)) {
+        return false;
+      }
+      parent9 = access.parent;
+      target = access;
     }
-    if (parent7 is PrefixExpression) {
-      return ((parent7 as PrefixExpression)).operator.type.isIncrementOperator();
-    } else if (parent7 is PostfixExpression) {
+    if (parent9 is PrefixExpression) {
+      return ((parent9 as PrefixExpression)).operator.type.isIncrementOperator();
+    } else if (parent9 is PostfixExpression) {
       return true;
-    } else if (parent7 is AssignmentExpression) {
-      return identical(((parent7 as AssignmentExpression)).leftHandSide, target);
+    } else if (parent9 is AssignmentExpression) {
+      return identical(((parent9 as AssignmentExpression)).leftHandSide, target);
     }
     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
+   */
+  void set element(Element element16) {
+    this._element = element16;
+  }
+  /**
    * Set the token representing the identifier to the given token.
    * @param token the token representing the literal
    */
@@ -8769,6 +9146,7 @@
  * "'" characters "'"
  * '"' characters '"'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class SimpleStringLiteral extends StringLiteral {
   /**
@@ -8845,6 +9223,7 @@
  * statement.
  * <pre>
  * statement ::={@link Block block}| {@link VariableDeclarationStatement initializedVariableDeclaration ';'}| {@link ForStatement forStatement}| {@link ForEachStatement forEachStatement}| {@link WhileStatement whileStatement}| {@link DoStatement doStatement}| {@link SwitchStatement switchStatement}| {@link IfStatement ifStatement}| {@link TryStatement tryStatement}| {@link BreakStatement breakStatement}| {@link ContinueStatement continueStatement}| {@link ReturnStatement returnStatement}| {@link ExpressionStatement expressionStatement}| {@link FunctionDeclarationStatement functionSignature functionBody}</pre>
+ * @coverage dart.engine.ast
  */
 abstract class Statement extends ASTNode {
 }
@@ -8855,6 +9234,7 @@
  * ''' {@link InterpolationElement interpolationElement}* '''
  * | '"' {@link InterpolationElement interpolationElement}* '"'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class StringInterpolation extends StringLiteral {
   /**
@@ -8890,6 +9270,7 @@
  * Instances of the class {@code StringLiteral} represent a string literal expression.
  * <pre>
  * stringLiteral ::={@link SimpleStringLiteral simpleStringLiteral}| {@link AdjacentStrings adjacentStrings}| {@link StringInterpolation stringInterpolation}</pre>
+ * @coverage dart.engine.ast
  */
 abstract class StringLiteral extends Literal {
 }
@@ -8899,6 +9280,7 @@
  * <pre>
  * superInvocation ::=
  * 'super' ('.' {@link SimpleIdentifier name})? {@link ArgumentList argumentList}</pre>
+ * @coverage dart.engine.ast
  */
 class SuperConstructorInvocation extends ConstructorInitializer {
   /**
@@ -9001,8 +9383,8 @@
    * Set the token for the 'super' keyword to the given token.
    * @param keyword the token for the 'super' keyword
    */
-  void set keyword(Token keyword16) {
-    this._keyword = keyword16;
+  void set keyword(Token keyword17) {
+    this._keyword = keyword17;
   }
   /**
    * Set the token for the period before the name of the constructor that is being invoked to the
@@ -9023,6 +9405,7 @@
  * superExpression ::=
  * 'super'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class SuperExpression extends Expression {
   /**
@@ -9053,8 +9436,8 @@
    * Set the token representing the keyword to the given token.
    * @param keyword the token representing the keyword
    */
-  void set keyword(Token keyword17) {
-    this._keyword = keyword17;
+  void set keyword(Token keyword18) {
+    this._keyword = keyword18;
   }
   void visitChildren(ASTVisitor<Object> visitor) {
   }
@@ -9063,6 +9446,7 @@
  * Instances of the class {@code SwitchCase} represent the case in a switch statement.
  * <pre>
  * switchCase ::={@link SimpleIdentifier label}* 'case' {@link Expression expression} ':' {@link Statement statement}</pre>
+ * @coverage dart.engine.ast
  */
 class SwitchCase extends SwitchMember {
   /**
@@ -9112,6 +9496,7 @@
  * Instances of the class {@code SwitchDefault} represent the default case in a switch statement.
  * <pre>
  * switchDefault ::={@link SimpleIdentifier label}* 'default' ':' {@link Statement statement}</pre>
+ * @coverage dart.engine.ast
  */
 class SwitchDefault extends SwitchMember {
   /**
@@ -9145,6 +9530,7 @@
  * switchCase
  * | switchDefault
  * </pre>
+ * @coverage dart.engine.ast
  */
 abstract class SwitchMember extends ASTNode {
   /**
@@ -9229,8 +9615,8 @@
    * Set the token representing the 'case' or 'default' keyword to the given token.
    * @param keyword the token representing the 'case' or 'default' keyword
    */
-  void set keyword(Token keyword18) {
-    this._keyword = keyword18;
+  void set keyword(Token keyword19) {
+    this._keyword = keyword19;
   }
 }
 /**
@@ -9239,6 +9625,7 @@
  * switchStatement ::=
  * 'switch' '(' {@link Expression expression} ')' '{' {@link SwitchCase switchCase}* {@link SwitchDefault defaultCase}? '}'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class SwitchStatement extends Statement {
   /**
@@ -9350,8 +9737,8 @@
    * Set the token representing the 'switch' keyword to the given token.
    * @param keyword the token representing the 'switch' keyword
    */
-  void set keyword(Token keyword19) {
-    this._keyword = keyword19;
+  void set keyword(Token keyword20) {
+    this._keyword = keyword20;
   }
   /**
    * Set the left curly bracket to the given token.
@@ -9392,6 +9779,7 @@
  * thisExpression ::=
  * 'this'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class ThisExpression extends Expression {
   /**
@@ -9422,8 +9810,8 @@
    * Set the token representing the keyword to the given token.
    * @param keyword the token representing the keyword
    */
-  void set keyword(Token keyword20) {
-    this._keyword = keyword20;
+  void set keyword(Token keyword21) {
+    this._keyword = keyword21;
   }
   void visitChildren(ASTVisitor<Object> visitor) {
   }
@@ -9434,6 +9822,7 @@
  * throwExpression ::=
  * 'throw' {@link Expression expression}? ';'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class ThrowExpression extends Expression {
   /**
@@ -9492,8 +9881,8 @@
    * Set the token representing the 'throw' keyword to the given token.
    * @param keyword the token representing the 'throw' keyword
    */
-  void set keyword(Token keyword21) {
-    this._keyword = keyword21;
+  void set keyword(Token keyword22) {
+    this._keyword = keyword22;
   }
   void visitChildren(ASTVisitor<Object> visitor) {
     safelyVisitChild(_expression, visitor);
@@ -9507,6 +9896,7 @@
  * ('final' | 'const') type? staticFinalDeclarationList ';'
  * | variableDeclaration ';'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class TopLevelVariableDeclaration extends CompilationUnitMember {
   /**
@@ -9537,6 +9927,7 @@
    */
   TopLevelVariableDeclaration({Comment comment, List<Annotation> metadata, VariableDeclarationList variableList, Token semicolon}) : this.full(comment, metadata, variableList, semicolon);
   accept(ASTVisitor visitor) => visitor.visitTopLevelVariableDeclaration(this);
+  Element get element => null;
   Token get endToken => _semicolon;
   /**
    * Return the semicolon terminating the declaration.
@@ -9575,6 +9966,7 @@
  * 'try' {@link Block block} ({@link CatchClause catchClause}+ finallyClause? | finallyClause)
  * finallyClause ::=
  * 'finally' {@link Block block}</pre>
+ * @coverage dart.engine.ast
  */
 class TryStatement extends Statement {
   /**
@@ -9706,6 +10098,7 @@
  * classTypeAlias
  * | functionTypeAlias
  * </pre>
+ * @coverage dart.engine.ast
  */
 abstract class TypeAlias extends CompilationUnitMember {
   /**
@@ -9750,8 +10143,8 @@
    * Set the token representing the 'typedef' keyword to the given token.
    * @param keyword the token representing the 'typedef' keyword
    */
-  void set keyword(Token keyword22) {
-    this._keyword = keyword22;
+  void set keyword(Token keyword23) {
+    this._keyword = keyword23;
   }
   /**
    * Set the semicolon terminating the declaration to the given token.
@@ -9768,6 +10161,7 @@
  * typeArguments ::=
  * '<' typeName (',' typeName)* '>'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class TypeArgumentList extends ASTNode {
   /**
@@ -9843,6 +10237,7 @@
  * <pre>
  * typeName ::={@link Identifier identifier} typeArguments?
  * </pre>
+ * @coverage dart.engine.ast
  */
 class TypeName extends ASTNode {
   /**
@@ -9930,6 +10325,7 @@
  * <pre>
  * typeParameter ::={@link SimpleIdentifier name} ('extends' {@link TypeName bound})?
  * </pre>
+ * @coverage dart.engine.ast
  */
 class TypeParameter extends Declaration {
   /**
@@ -9975,6 +10371,7 @@
    * @return the name of the upper bound for legal arguments
    */
   TypeName get bound => _bound;
+  TypeVariableElement get element => _name != null ? (_name.element as TypeVariableElement) : null;
   Token get endToken {
     if (_bound == null) {
       return _name.endToken;
@@ -10002,8 +10399,8 @@
    * Set the token representing the 'assert' keyword to the given token.
    * @param keyword the token representing the 'assert' keyword
    */
-  void set keyword(Token keyword23) {
-    this._keyword = keyword23;
+  void set keyword(Token keyword24) {
+    this._keyword = keyword24;
   }
   /**
    * Set the name of the type parameter to the given identifier.
@@ -10025,6 +10422,7 @@
  * typeParameterList ::=
  * '<' {@link TypeParameter typeParameter} (',' {@link TypeParameter typeParameter})* '>'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class TypeParameterList extends ASTNode {
   /**
@@ -10085,6 +10483,7 @@
  * associated with them.
  * <pre>
  * listLiteral ::={@link ListLiteral listLiteral}| {@link MapLiteral mapLiteral}</pre>
+ * @coverage dart.engine.ast
  */
 abstract class TypedLiteral extends Literal {
   /**
@@ -10148,6 +10547,7 @@
  * a directive that references a URI.
  * <pre>
  * uriBasedDirective ::={@link ExportDirective exportDirective}| {@link ImportDirective importDirective}| {@link PartDirective partDirective}</pre>
+ * @coverage dart.engine.ast
  */
 abstract class UriBasedDirective extends Directive {
   /**
@@ -10193,6 +10593,7 @@
  * <pre>
  * variableDeclaration ::={@link SimpleIdentifier identifier} ('=' {@link Expression initialValue})?
  * </pre>
+ * @coverage dart.engine.ast
  */
 class VariableDeclaration extends Declaration {
   /**
@@ -10232,11 +10633,6 @@
    */
   VariableDeclaration({Comment comment, List<Annotation> metadata, SimpleIdentifier name, Token equals, Expression initializer}) : this.full(comment, metadata, name, equals, initializer);
   accept(ASTVisitor visitor) => visitor.visitVariableDeclaration(this);
-  /**
-   * Return the {@link VariableElement} associated with this variable, or {@code null} if the AST
-   * structure has not been resolved.
-   * @return the {@link VariableElement} associated with this variable
-   */
   VariableElement get element => _name != null ? (_name.element as VariableElement) : null;
   Token get endToken {
     if (_initializer != null) {
@@ -10262,6 +10658,24 @@
    */
   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
+   */
+  bool isConst() {
+    ASTNode parent10 = parent;
+    return parent10 is VariableDeclarationList && ((parent10 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
+   * final.
+   * @return {@code true} if this variable was declared with the 'final' modifier
+   */
+  bool isFinal() {
+    ASTNode parent11 = parent;
+    return parent11 is VariableDeclarationList && ((parent11 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
    */
@@ -10300,6 +10714,7 @@
  * | 'const' {@link TypeName type}?
  * | 'var'
  * | {@link TypeName type}</pre>
+ * @coverage dart.engine.ast
  */
 class VariableDeclarationList extends ASTNode {
   /**
@@ -10361,11 +10776,23 @@
    */
   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
+   * they are implicitly final.
+   * @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
    */
-  void set keyword(Token keyword24) {
-    this._keyword = keyword24;
+  void set keyword(Token keyword25) {
+    this._keyword = keyword25;
   }
   /**
    * Set the type of the variables being declared to the given type name.
@@ -10385,6 +10812,7 @@
  * <pre>
  * variableDeclarationStatement ::={@link VariableDeclarationList variableList} ';'
  * </pre>
+ * @coverage dart.engine.ast
  */
 class VariableDeclarationStatement extends Statement {
   /**
@@ -10446,6 +10874,7 @@
  * <pre>
  * whileStatement ::=
  * 'while' '(' {@link Expression condition} ')' {@link Statement body}</pre>
+ * @coverage dart.engine.ast
  */
 class WhileStatement extends Statement {
   /**
@@ -10539,8 +10968,8 @@
    * Set the token representing the 'while' keyword to the given token.
    * @param keyword the token representing the 'while' keyword
    */
-  void set keyword(Token keyword25) {
-    this._keyword = keyword25;
+  void set keyword(Token keyword26) {
+    this._keyword = keyword26;
   }
   /**
    * Set the left parenthesis to the given token.
@@ -10567,6 +10996,7 @@
  * withClause ::=
  * 'with' {@link TypeName mixin} (',' {@link TypeName mixin})
  * </pre>
+ * @coverage dart.engine.ast
  */
 class WithClause extends ASTNode {
   /**
@@ -10647,6 +11077,7 @@
  * In addition, this class defines several values that can be returned to indicate various
  * conditions encountered during evaluation. These are documented with the static field that define
  * those values.
+ * @coverage dart.engine.ast
  */
 class ConstantEvaluator extends GeneralizingASTVisitor<Object> {
   /**
@@ -10654,14 +11085,25 @@
    * expressions.
    */
   static Object NOT_A_CONSTANT = new Object();
+  /**
+   * The error reporter by which errors will be reported.
+   */
+  ErrorReporter _errorReporter;
+  /**
+   * Initialize a newly created constant evaluator.
+   * @param errorReporter the error reporter by which errors will be reported
+   */
+  ConstantEvaluator(ErrorReporter errorReporter) {
+    this._errorReporter = errorReporter;
+  }
   Object visitAdjacentStrings(AdjacentStrings node) {
-    StringBuffer builder = new StringBuffer();
+    JavaStringBuilder builder = new JavaStringBuilder();
     for (StringLiteral string in node.strings) {
       Object value = string.accept(this);
       if (identical(value, NOT_A_CONSTANT)) {
         return value;
       }
-      builder.add(value);
+      builder.append(value);
     }
     return builder.toString();
   }
@@ -10674,114 +11116,137 @@
     if (identical(rightOperand2, NOT_A_CONSTANT)) {
       return rightOperand2;
     }
-    if (node.operator.type == TokenType.AMPERSAND) {
-      if (leftOperand2 is int && rightOperand2 is int) {
-        return ((leftOperand2 as int)) & (rightOperand2 as int);
+    while (true) {
+      if (node.operator.type == TokenType.AMPERSAND) {
+        if (leftOperand2 is int && rightOperand2 is int) {
+          return ((leftOperand2 as int)) & (rightOperand2 as int);
+        }
+      } else if (node.operator.type == TokenType.AMPERSAND_AMPERSAND) {
+        if (leftOperand2 is bool && rightOperand2 is bool) {
+          return ((leftOperand2 as bool)) && ((rightOperand2 as bool));
+        }
+      } else if (node.operator.type == TokenType.BANG_EQ) {
+        if (leftOperand2 is bool && rightOperand2 is bool) {
+          return ((leftOperand2 as bool)) != ((rightOperand2 as bool));
+        } else if (leftOperand2 is int && rightOperand2 is int) {
+          return ((leftOperand2 as int)) != rightOperand2;
+        } else if (leftOperand2 is double && rightOperand2 is double) {
+          return ((leftOperand2 as double)) != rightOperand2;
+        } else if (leftOperand2 is String && rightOperand2 is String) {
+          return ((leftOperand2 as String)) != rightOperand2;
+        }
+      } else if (node.operator.type == TokenType.BAR) {
+        if (leftOperand2 is int && rightOperand2 is int) {
+          return ((leftOperand2 as int)) | (rightOperand2 as int);
+        }
+      } else if (node.operator.type == TokenType.BAR_BAR) {
+        if (leftOperand2 is bool && rightOperand2 is bool) {
+          return ((leftOperand2 as bool)) || ((rightOperand2 as bool));
+        }
+      } else if (node.operator.type == TokenType.CARET) {
+        if (leftOperand2 is int && rightOperand2 is int) {
+          return ((leftOperand2 as int)) ^ (rightOperand2 as int);
+        }
+      } else if (node.operator.type == TokenType.EQ_EQ) {
+        if (leftOperand2 is bool && rightOperand2 is bool) {
+          return identical(((leftOperand2 as bool)), ((rightOperand2 as bool)));
+        } else if (leftOperand2 is int && rightOperand2 is int) {
+          return ((leftOperand2 as int)) == rightOperand2;
+        } else if (leftOperand2 is double && rightOperand2 is double) {
+          return ((leftOperand2 as double)) == rightOperand2;
+        } else if (leftOperand2 is String && rightOperand2 is String) {
+          return ((leftOperand2 as String)) == rightOperand2;
+        }
+      } else if (node.operator.type == TokenType.GT) {
+        if (leftOperand2 is int && rightOperand2 is int) {
+          return ((leftOperand2 as int)).compareTo((rightOperand2 as int)) > 0;
+        } else if (leftOperand2 is double && rightOperand2 is double) {
+          return ((leftOperand2 as double)).compareTo((rightOperand2 as double)) > 0;
+        }
+      } else if (node.operator.type == TokenType.GT_EQ) {
+        if (leftOperand2 is int && rightOperand2 is int) {
+          return ((leftOperand2 as int)).compareTo((rightOperand2 as int)) >= 0;
+        } else if (leftOperand2 is double && rightOperand2 is double) {
+          return ((leftOperand2 as double)).compareTo((rightOperand2 as double)) >= 0;
+        }
+      } else if (node.operator.type == TokenType.GT_GT) {
+        if (leftOperand2 is int && rightOperand2 is int) {
+          return ((leftOperand2 as int)) >> ((rightOperand2 as int));
+        }
+      } else if (node.operator.type == TokenType.LT) {
+        if (leftOperand2 is int && rightOperand2 is int) {
+          return ((leftOperand2 as int)).compareTo((rightOperand2 as int)) < 0;
+        } else if (leftOperand2 is double && rightOperand2 is double) {
+          return ((leftOperand2 as double)).compareTo((rightOperand2 as double)) < 0;
+        }
+      } else if (node.operator.type == TokenType.LT_EQ) {
+        if (leftOperand2 is int && rightOperand2 is int) {
+          return ((leftOperand2 as int)).compareTo((rightOperand2 as int)) <= 0;
+        } else if (leftOperand2 is double && rightOperand2 is double) {
+          return ((leftOperand2 as double)).compareTo((rightOperand2 as double)) <= 0;
+        }
+      } else if (node.operator.type == TokenType.LT_LT) {
+        if (leftOperand2 is int && rightOperand2 is int) {
+          return ((leftOperand2 as int)) << ((rightOperand2 as int));
+        }
+      } else if (node.operator.type == TokenType.MINUS) {
+        if (leftOperand2 is int && rightOperand2 is int) {
+          return ((leftOperand2 as int)) - (rightOperand2 as int);
+        } else if (leftOperand2 is double && rightOperand2 is double) {
+          return ((leftOperand2 as double)) - ((rightOperand2 as double));
+        }
+      } else if (node.operator.type == TokenType.PERCENT) {
+        if (leftOperand2 is int && rightOperand2 is int) {
+          return ((leftOperand2 as int)).remainder((rightOperand2 as int));
+        } else if (leftOperand2 is double && rightOperand2 is double) {
+          return ((leftOperand2 as double)) % ((rightOperand2 as double));
+        }
+      } else if (node.operator.type == TokenType.PLUS) {
+        if (leftOperand2 is int && rightOperand2 is int) {
+          return ((leftOperand2 as int)) + (rightOperand2 as int);
+        } else if (leftOperand2 is double && rightOperand2 is double) {
+          return ((leftOperand2 as double)) + ((rightOperand2 as double));
+        }
+      } else if (node.operator.type == TokenType.STAR) {
+        if (leftOperand2 is int && rightOperand2 is int) {
+          return ((leftOperand2 as int)) * (rightOperand2 as int);
+        } else if (leftOperand2 is double && rightOperand2 is double) {
+          return ((leftOperand2 as double)) * ((rightOperand2 as double));
+        }
+      } else if (node.operator.type == TokenType.SLASH) {
+        if (leftOperand2 is int && rightOperand2 is int) {
+          if (rightOperand2 != 0) {
+            return ((leftOperand2 as int)) ~/ (rightOperand2 as int);
+          } else {
+            reportDivideByZeroError(node);
+            return 0;
+          }
+        } else if (leftOperand2 is double && rightOperand2 is double) {
+          if (rightOperand2 != 0) {
+            return ((leftOperand2 as double)) / ((rightOperand2 as double));
+          } else {
+            reportDivideByZeroError(node);
+            return 0;
+          }
+        }
+      } else if (node.operator.type == TokenType.TILDE_SLASH) {
+        if (leftOperand2 is int && rightOperand2 is int) {
+          if (rightOperand2 != 0) {
+            return ((leftOperand2 as int)) ~/ (rightOperand2 as int);
+          } else {
+            reportDivideByZeroError(node);
+            return 0;
+          }
+        } else if (leftOperand2 is double && rightOperand2 is double) {
+          if (rightOperand2 != 0) {
+            return ((leftOperand2 as double)) ~/ ((rightOperand2 as double));
+          } else {
+            reportDivideByZeroError(node);
+            return 0;
+          }
+        }
       }
-    } else if (node.operator.type == TokenType.AMPERSAND_AMPERSAND) {
-      if (leftOperand2 is bool && rightOperand2 is bool) {
-        return ((leftOperand2 as bool)) && ((rightOperand2 as bool));
-      }
-    } else if (node.operator.type == TokenType.BANG_EQ) {
-      if (leftOperand2 is bool && rightOperand2 is bool) {
-        return ((leftOperand2 as bool)) != ((rightOperand2 as bool));
-      } else if (leftOperand2 is int && rightOperand2 is int) {
-        return ((leftOperand2 as int)) != rightOperand2;
-      } else if (leftOperand2 is double && rightOperand2 is double) {
-        return ((leftOperand2 as double)) != rightOperand2;
-      } else if (leftOperand2 is String && rightOperand2 is String) {
-        return ((leftOperand2 as String)) != rightOperand2;
-      }
-    } else if (node.operator.type == TokenType.BAR) {
-      if (leftOperand2 is int && rightOperand2 is int) {
-        return ((leftOperand2 as int)) | (rightOperand2 as int);
-      }
-    } else if (node.operator.type == TokenType.BAR_BAR) {
-      if (leftOperand2 is bool && rightOperand2 is bool) {
-        return ((leftOperand2 as bool)) || ((rightOperand2 as bool));
-      }
-    } else if (node.operator.type == TokenType.CARET) {
-      if (leftOperand2 is int && rightOperand2 is int) {
-        return ((leftOperand2 as int)) ^ (rightOperand2 as int);
-      }
-    } else if (node.operator.type == TokenType.EQ_EQ) {
-      if (leftOperand2 is bool && rightOperand2 is bool) {
-        return identical(((leftOperand2 as bool)), ((rightOperand2 as bool)));
-      } else if (leftOperand2 is int && rightOperand2 is int) {
-        return ((leftOperand2 as int)) == rightOperand2;
-      } else if (leftOperand2 is double && rightOperand2 is double) {
-        return ((leftOperand2 as double)) == rightOperand2;
-      } else if (leftOperand2 is String && rightOperand2 is String) {
-        return ((leftOperand2 as String)) == rightOperand2;
-      }
-    } else if (node.operator.type == TokenType.GT) {
-      if (leftOperand2 is int && rightOperand2 is int) {
-        return ((leftOperand2 as int)).compareTo((rightOperand2 as int)) > 0;
-      } else if (leftOperand2 is double && rightOperand2 is double) {
-        return ((leftOperand2 as double)).compareTo((rightOperand2 as double)) > 0;
-      }
-    } else if (node.operator.type == TokenType.GT_EQ) {
-      if (leftOperand2 is int && rightOperand2 is int) {
-        return ((leftOperand2 as int)).compareTo((rightOperand2 as int)) >= 0;
-      } else if (leftOperand2 is double && rightOperand2 is double) {
-        return ((leftOperand2 as double)).compareTo((rightOperand2 as double)) >= 0;
-      }
-    } else if (node.operator.type == TokenType.GT_GT) {
-      if (leftOperand2 is int && rightOperand2 is int) {
-        return ((leftOperand2 as int)) >> ((rightOperand2 as int));
-      }
-    } else if (node.operator.type == TokenType.LT) {
-      if (leftOperand2 is int && rightOperand2 is int) {
-        return ((leftOperand2 as int)).compareTo((rightOperand2 as int)) < 0;
-      } else if (leftOperand2 is double && rightOperand2 is double) {
-        return ((leftOperand2 as double)).compareTo((rightOperand2 as double)) < 0;
-      }
-    } else if (node.operator.type == TokenType.LT_EQ) {
-      if (leftOperand2 is int && rightOperand2 is int) {
-        return ((leftOperand2 as int)).compareTo((rightOperand2 as int)) <= 0;
-      } else if (leftOperand2 is double && rightOperand2 is double) {
-        return ((leftOperand2 as double)).compareTo((rightOperand2 as double)) <= 0;
-      }
-    } else if (node.operator.type == TokenType.LT_LT) {
-      if (leftOperand2 is int && rightOperand2 is int) {
-        return ((leftOperand2 as int)) << ((rightOperand2 as int));
-      }
-    } else if (node.operator.type == TokenType.MINUS) {
-      if (leftOperand2 is int && rightOperand2 is int) {
-        return ((leftOperand2 as int)) - (rightOperand2 as int);
-      } else if (leftOperand2 is double && rightOperand2 is double) {
-        return ((leftOperand2 as double)) - ((rightOperand2 as double));
-      }
-    } else if (node.operator.type == TokenType.PERCENT) {
-      if (leftOperand2 is int && rightOperand2 is int) {
-        return ((leftOperand2 as int)).remainder((rightOperand2 as int));
-      } else if (leftOperand2 is double && rightOperand2 is double) {
-        return ((leftOperand2 as double)) % ((rightOperand2 as double));
-      }
-    } else if (node.operator.type == TokenType.PLUS) {
-      if (leftOperand2 is int && rightOperand2 is int) {
-        return ((leftOperand2 as int)) + (rightOperand2 as int);
-      } else if (leftOperand2 is double && rightOperand2 is double) {
-        return ((leftOperand2 as double)) + ((rightOperand2 as double));
-      }
-    } else if (node.operator.type == TokenType.STAR) {
-      if (leftOperand2 is int && rightOperand2 is int) {
-        return ((leftOperand2 as int)) * (rightOperand2 as int);
-      } else if (leftOperand2 is double && rightOperand2 is double) {
-        return ((leftOperand2 as double)) * ((rightOperand2 as double));
-      }
-    } else if (node.operator.type == TokenType.SLASH) {
-      if (leftOperand2 is int && rightOperand2 is int) {
-        return ((leftOperand2 as int)) ~/ (rightOperand2 as int);
-      } else if (leftOperand2 is double && rightOperand2 is double) {
-        return ((leftOperand2 as double)) / ((rightOperand2 as double));
-      }
-    } else if (node.operator.type == TokenType.TILDE_SLASH) {
-      if (leftOperand2 is int && rightOperand2 is int) {
-        return ((leftOperand2 as int)) ~/ (rightOperand2 as int);
-      } else if (leftOperand2 is double && rightOperand2 is double) {
-        return ((leftOperand2 as double)) ~/ ((rightOperand2 as double));
-      }
+      break;
     }
     return visitExpression(node);
   }
@@ -10811,11 +11276,11 @@
     Map<String, Object> map = new Map<String, Object>();
     for (MapLiteralEntry entry in node.entries) {
       Object key2 = entry.key.accept(this);
-      Object value7 = entry.value.accept(this);
-      if (key2 is! String || identical(value7, NOT_A_CONSTANT)) {
+      Object value8 = entry.value.accept(this);
+      if (key2 is! String || identical(value8, NOT_A_CONSTANT)) {
         return NOT_A_CONSTANT;
       }
-      map[(key2 as String)] = value7;
+      map[(key2 as String)] = value8;
     }
     return map;
   }
@@ -10829,24 +11294,27 @@
     if (identical(operand2, NOT_A_CONSTANT)) {
       return operand2;
     }
-    if (node.operator.type == TokenType.BANG) {
-      if (identical(operand2, true)) {
-        return false;
-      } else if (identical(operand2, false)) {
-        return true;
+    while (true) {
+      if (node.operator.type == TokenType.BANG) {
+        if (identical(operand2, true)) {
+          return false;
+        } else if (identical(operand2, false)) {
+          return true;
+        }
+      } else if (node.operator.type == TokenType.TILDE) {
+        if (operand2 is int) {
+          return ~((operand2 as int));
+        }
+      } else if (node.operator.type == TokenType.MINUS) {
+        if (operand2 == null) {
+          return null;
+        } else if (operand2 is int) {
+          return -((operand2 as int));
+        } else if (operand2 is double) {
+          return -((operand2 as double));
+        }
       }
-    } else if (node.operator.type == TokenType.TILDE) {
-      if (operand2 is int) {
-        return ~((operand2 as int));
-      }
-    } else if (node.operator.type == TokenType.MINUS) {
-      if (operand2 == null) {
-        return null;
-      } else if (operand2 is int) {
-        return -((operand2 as int));
-      } else if (operand2 is double) {
-        return -((operand2 as double));
-      }
+      break;
     }
     return NOT_A_CONSTANT;
   }
@@ -10854,13 +11322,13 @@
   Object visitSimpleIdentifier(SimpleIdentifier node) => getConstantValue(null);
   Object visitSimpleStringLiteral(SimpleStringLiteral node) => node.value;
   Object visitStringInterpolation(StringInterpolation node) {
-    StringBuffer builder = new StringBuffer();
+    JavaStringBuilder builder = new JavaStringBuilder();
     for (InterpolationElement element in node.elements) {
       Object value = element.accept(this);
       if (identical(value, NOT_A_CONSTANT)) {
         return value;
       }
-      builder.add(value);
+      builder.append(value);
     }
     return builder.toString();
   }
@@ -10871,12 +11339,56 @@
    */
   Object getConstantValue(Element element) {
     if (element is FieldElement) {
-      FieldElement field = (element as FieldElement);
+      FieldElement field = element as FieldElement;
       if (field.isStatic() && field.isConst()) {
       }
     }
     return NOT_A_CONSTANT;
   }
+  void reportDivideByZeroError(BinaryExpression node) {
+    _errorReporter.reportError(CompileTimeErrorCode.COMPILE_TIME_CONSTANT_RAISES_EXCEPTION_DIVIDE_BY_ZERO, node, []);
+  }
+}
+/**
+ * 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}.
+   * @param node the node (not {@code null})
+   * @return the associated element, or {@code null} if none is found
+   */
+  static Element locate(ASTNode node) {
+    ElementLocator_ElementMapper mapper = new ElementLocator_ElementMapper();
+    return node.accept(mapper);
+  }
+  /**
+   * Clients should use {@link #locate(ASTNode)}.
+   */
+  ElementLocator() {
+  }
+}
+/**
+ * Visitor that maps nodes to elements.
+ */
+class ElementLocator_ElementMapper extends GeneralizingASTVisitor<Element> {
+  Element visitBinaryExpression(BinaryExpression node) => node.element;
+  Element visitIdentifier(Identifier node) => node.element;
+  Element visitImportDirective(ImportDirective node) => node.element;
+  Element visitIndexExpression(IndexExpression node) => node.element;
+  Element visitLibraryDirective(LibraryDirective node) => node.element;
+  Element visitPostfixExpression(PostfixExpression node) => node.element;
+  Element visitPrefixedIdentifier(PrefixedIdentifier node) => node.element;
+  Element visitPrefixExpression(PrefixExpression node) => node.element;
+  Element visitStringLiteral(StringLiteral node) {
+    ASTNode parent12 = node.parent;
+    if (parent12 is UriBasedDirective) {
+      return ((parent12 as UriBasedDirective)).element;
+    }
+    return null;
+  }
 }
 /**
  * Instances of the class {@code GeneralizingASTVisitor} implement an AST visitor that will
@@ -10892,6 +11404,7 @@
  * explicitly invoke the more general visit method. Failure to do so will cause the visit methods
  * for superclasses of the node to not be invoked and will cause the children of the visited node to
  * not be visited.
+ * @coverage dart.engine.ast
  */
 class GeneralizingASTVisitor<R> implements ASTVisitor<R> {
   R visitAdjacentStrings(AdjacentStrings node) => visitStringLiteral(node);
@@ -10924,6 +11437,7 @@
   R visitConstructorName(ConstructorName node) => visitNode(node);
   R visitContinueStatement(ContinueStatement node) => visitStatement(node);
   R visitDeclaration(Declaration node) => visitAnnotatedNode(node);
+  R visitDeclaredIdentifier(DeclaredIdentifier node) => visitDeclaration(node);
   R visitDefaultFormalParameter(DefaultFormalParameter node) => visitFormalParameter(node);
   R visitDirective(Directive node) => visitAnnotatedNode(node);
   R visitDoStatement(DoStatement node) => visitStatement(node);
@@ -10969,7 +11483,7 @@
   R visitMapLiteral(MapLiteral node) => visitTypedLiteral(node);
   R visitMapLiteralEntry(MapLiteralEntry node) => visitNode(node);
   R visitMethodDeclaration(MethodDeclaration node) => visitClassMember(node);
-  R visitMethodInvocation(MethodInvocation node) => visitNode(node);
+  R visitMethodInvocation(MethodInvocation node) => visitExpression(node);
   R visitNamedExpression(NamedExpression node) => visitExpression(node);
   R visitNamespaceDirective(NamespaceDirective node) => visitUriBasedDirective(node);
   R visitNode(ASTNode node) {
@@ -11023,6 +11537,7 @@
  * source range, given the AST structure built from the source. More specifically, they will return
  * the {@link ASTNode AST node} with the shortest length whose source range completely encompasses
  * the specified range.
+ * @coverage dart.engine.ast
  */
 class NodeLocator extends GeneralizingASTVisitor<Object> {
   /**
@@ -11044,10 +11559,10 @@
    * @param offset the offset used to identify the node
    */
   NodeLocator.con1(int offset) {
-    _jtd_constructor_114_impl(offset);
+    _jtd_constructor_118_impl(offset);
   }
-  _jtd_constructor_114_impl(int offset) {
-    _jtd_constructor_115_impl(offset, offset);
+  _jtd_constructor_118_impl(int offset) {
+    _jtd_constructor_119_impl(offset, offset);
   }
   /**
    * Initialize a newly created locator to locate one or more {@link ASTNode AST nodes} by locating
@@ -11057,9 +11572,9 @@
    * @param end the end offset of the range used to identify the node
    */
   NodeLocator.con2(int start, int end) {
-    _jtd_constructor_115_impl(start, end);
+    _jtd_constructor_119_impl(start, end);
   }
-  _jtd_constructor_115_impl(int start, int end) {
+  _jtd_constructor_119_impl(int start, int end) {
     this._startOffset = start;
     this._endOffset = end;
   }
@@ -11118,6 +11633,7 @@
  * Subclasses that override a visit method must either invoke the overridden visit method or must
  * explicitly ask the visited node to visit its children. Failure to do so will cause the children
  * of the visited node to not be visited.
+ * @coverage dart.engine.ast
  */
 class RecursiveASTVisitor<R> implements ASTVisitor<R> {
   R visitAdjacentStrings(AdjacentStrings node) {
@@ -11216,6 +11732,10 @@
     node.visitChildren(this);
     return null;
   }
+  R visitDeclaredIdentifier(DeclaredIdentifier node) {
+    node.visitChildren(this);
+    return null;
+  }
   R visitDefaultFormalParameter(DefaultFormalParameter node) {
     node.visitChildren(this);
     return null;
@@ -11518,6 +12038,7 @@
  * when visiting an AST node. It is intended to be a superclass for classes that use the visitor
  * pattern primarily as a dispatch mechanism (and hence don't need to recursively visit a whole
  * structure) and that only need to visit a small number of node types.
+ * @coverage dart.engine.ast
  */
 class SimpleASTVisitor<R> implements ASTVisitor<R> {
   R visitAdjacentStrings(AdjacentStrings node) => null;
@@ -11544,6 +12065,7 @@
   R visitConstructorFieldInitializer(ConstructorFieldInitializer node) => null;
   R visitConstructorName(ConstructorName node) => null;
   R visitContinueStatement(ContinueStatement node) => null;
+  R visitDeclaredIdentifier(DeclaredIdentifier node) => null;
   R visitDefaultFormalParameter(DefaultFormalParameter node) => null;
   R visitDoStatement(DoStatement node) => null;
   R visitDoubleLiteral(DoubleLiteral node) => null;
@@ -11622,6 +12144,7 @@
 /**
  * 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> {
   /**
@@ -11804,6 +12327,12 @@
     _writer.print(";");
     return null;
   }
+  Object visitDeclaredIdentifier(DeclaredIdentifier node) {
+    visit5(node.keyword, " ");
+    visit2(node.type, " ");
+    visit(node.identifier);
+    return null;
+  }
   Object visitDefaultFormalParameter(DefaultFormalParameter node) {
     visit(node.parameter);
     if (node.separator != null) {
@@ -11873,7 +12402,7 @@
   }
   Object visitForEachStatement(ForEachStatement node) {
     _writer.print("for (");
-    visit(node.loopParameter);
+    visit(node.loopVariable);
     _writer.print(" in ");
     visit(node.iterator);
     _writer.print(") ");
@@ -12453,7 +12982,9 @@
   }
   bool addAll(Collection<E> nodes) {
     if (nodes != null) {
-      super.addAll(nodes);
+      for (E node in nodes) {
+        add(node);
+      }
       return true;
     }
     return false;
diff --git a/pkg/analyzer_experimental/lib/src/generated/constant.dart b/pkg/analyzer_experimental/lib/src/generated/constant.dart
new file mode 100644
index 0000000..93ddccb
--- /dev/null
+++ b/pkg/analyzer_experimental/lib/src/generated/constant.dart
@@ -0,0 +1,1115 @@
+// This code was auto-generated, is not intended to be edited, and is subject to
+// significant change. Please see the README file for more information.
+
+library engine.constant;
+
+import 'java_core.dart';
+import 'source.dart' show Source;
+import 'error.dart' show AnalysisError, ErrorCode, CompileTimeErrorCode;
+import 'scanner.dart' show TokenType;
+import 'ast.dart';
+import 'element.dart';
+
+/**
+ * Instances of the class {@code ConstantEvaluator} evaluate constant expressions to produce their
+ * compile-time value. According to the Dart Language Specification: <blockquote> A constant
+ * expression is one of the following:
+ * <ul>
+ * <li>A literal number.</li>
+ * <li>A literal boolean.</li>
+ * <li>A literal string where any interpolated expression is a compile-time constant that evaluates
+ * to a numeric, string or boolean value or to {@code null}.</li>
+ * <li>{@code null}.</li>
+ * <li>A reference to a static constant variable.</li>
+ * <li>An identifier expression that denotes a constant variable, a class or a type variable.</li>
+ * <li>A constant constructor invocation.</li>
+ * <li>A constant list literal.</li>
+ * <li>A constant map literal.</li>
+ * <li>A simple or qualified identifier denoting a top-level function or a static method.</li>
+ * <li>A parenthesized expression {@code (e)} where {@code e} is a constant expression.</li>
+ * <li>An expression of one of the forms {@code identical(e1, e2)}, {@code e1 == e2},{@code e1 != e2} where {@code e1} and {@code e2} are constant expressions that evaluate to a
+ * numeric, string or boolean value or to {@code null}.</li>
+ * <li>An expression of one of the forms {@code !e}, {@code e1 && e2} or {@code e1 || e2}, where{@code e}, {@code e1} and {@code e2} are constant expressions that evaluate to a boolean value or
+ * to {@code null}.</li>
+ * <li>An expression of one of the forms {@code ~e}, {@code e1 ^ e2}, {@code e1 & e2},{@code e1 | e2}, {@code e1 >> e2} or {@code e1 << e2}, where {@code e}, {@code e1} and {@code e2}are constant expressions that evaluate to an integer value or to {@code null}.</li>
+ * <li>An expression of one of the forms {@code -e}, {@code e1 + e2}, {@code e1 - e2},{@code e1 * e2}, {@code e1 / e2}, {@code e1 ~/ e2}, {@code e1 > e2}, {@code e1 < e2},{@code e1 >= e2}, {@code e1 <= e2} or {@code e1 % e2}, where {@code e}, {@code e1} and {@code e2}are constant expressions that evaluate to a numeric value or to {@code null}.</li>
+ * </ul>
+ * </blockquote> The values returned by instances of this class are therefore {@code null} and
+ * instances of the classes {@code Boolean}, {@code BigInteger}, {@code Double}, {@code String}, and{@code DartObject}.
+ * <p>
+ * In addition, this class defines several values that can be returned to indicate various
+ * conditions encountered during evaluation. These are documented with the static field that define
+ * those values.
+ */
+class ConstantEvaluator {
+  /**
+   * 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
+   */
+  ConstantEvaluator(Source source) {
+    this._source = source;
+  }
+  EvaluationResult evaluate(Expression expression) {
+    EvaluationResultImpl result = expression.accept(new ConstantVisitor());
+    if (result is ValidResult) {
+      return EvaluationResult.forValue(((result as ValidResult)).value);
+    }
+    List<AnalysisError> errors = new List<AnalysisError>();
+    for (ErrorResult_ErrorData data in ((result as ErrorResult)).errorData) {
+      ASTNode node2 = data.node;
+      errors.add(new AnalysisError.con2(_source, node2.offset, node2.length, data.errorCode, []));
+    }
+    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.
+   * @param errors the errors that should be reported for the expression(s) that were evaluated
+   * @return the result of evaluating an expression that is not a compile-time constant
+   */
+  static EvaluationResult forErrors(List<AnalysisError> errors) => new EvaluationResult(null, errors);
+  /**
+   * Return an evaluation result representing the result of evaluating an expression that is a
+   * compile-time constant that evaluates to the given value.
+   * @param value the value of the expression
+   * @return the result of evaluating an expression that is a compile-time constant
+   */
+  static EvaluationResult forValue(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)}.
+   * @param value the value of the expression
+   * @param errors the errors that should be reported for the expression(s) that were evaluated
+   */
+  EvaluationResult(Object value, List<AnalysisError> errors) {
+    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
+   * the expression is not a valid compile time constant if the errors would have been reported by
+   * other parts of the analysis engine.
+   */
+  List<AnalysisError> get errors => _errors == null ? AnalysisError.NO_ERRORS : _errors;
+  /**
+   * Return 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.
+   * @return {@code true} if the expression is a valid compile-time constant expression
+   */
+  bool isValid() => _errors == null;
+}
+/**
+ * Instances of the class {@code ConstantVisitor} evaluate constant expressions to produce their
+ * compile-time value. According to the Dart Language Specification: <blockquote> A constant
+ * expression is one of the following:
+ * <ul>
+ * <li>A literal number.</li>
+ * <li>A literal boolean.</li>
+ * <li>A literal string where any interpolated expression is a compile-time constant that evaluates
+ * to a numeric, string or boolean value or to {@code null}.</li>
+ * <li>{@code null}.</li>
+ * <li>A reference to a static constant variable.</li>
+ * <li>An identifier expression that denotes a constant variable, a class or a type variable.</li>
+ * <li>A constant constructor invocation.</li>
+ * <li>A constant list literal.</li>
+ * <li>A constant map literal.</li>
+ * <li>A simple or qualified identifier denoting a top-level function or a static method.</li>
+ * <li>A parenthesized expression {@code (e)} where {@code e} is a constant expression.</li>
+ * <li>An expression of one of the forms {@code identical(e1, e2)}, {@code e1 == e2},{@code e1 != e2} where {@code e1} and {@code e2} are constant expressions that evaluate to a
+ * numeric, string or boolean value or to {@code null}.</li>
+ * <li>An expression of one of the forms {@code !e}, {@code e1 && e2} or {@code e1 || e2}, where{@code e}, {@code e1} and {@code e2} are constant expressions that evaluate to a boolean value or
+ * to {@code null}.</li>
+ * <li>An expression of one of the forms {@code ~e}, {@code e1 ^ e2}, {@code e1 & e2},{@code e1 | e2}, {@code e1 >> e2} or {@code e1 << e2}, where {@code e}, {@code e1} and {@code e2}are constant expressions that evaluate to an integer value or to {@code null}.</li>
+ * <li>An expression of one of the forms {@code -e}, {@code e1 + e2}, {@code e1 - e2},{@code e1 * e2}, {@code e1 / e2}, {@code e1 ~/ e2}, {@code e1 > e2}, {@code e1 < e2},{@code e1 >= e2}, {@code e1 <= e2} or {@code e1 % e2}, where {@code e}, {@code e1} and {@code e2}are constant expressions that evaluate to a numeric value or to {@code null}.</li>
+ * </ul>
+ * </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) {
+      if (result == null) {
+        result = string.accept(this);
+      } else {
+        result = result.concatenate(node, string.accept(this));
+      }
+    }
+    return result;
+  }
+  EvaluationResultImpl visitBinaryExpression(BinaryExpression node) {
+    EvaluationResultImpl leftResult = node.leftOperand.accept(this);
+    EvaluationResultImpl rightResult = node.rightOperand.accept(this);
+    while (true) {
+      if (node.operator.type == TokenType.AMPERSAND) {
+        return leftResult.bitAnd(node, rightResult);
+      } else if (node.operator.type == TokenType.AMPERSAND_AMPERSAND) {
+        return leftResult.logicalAnd(node, rightResult);
+      } else if (node.operator.type == TokenType.BANG_EQ) {
+        return leftResult.notEqual(node, rightResult);
+      } else if (node.operator.type == TokenType.BAR) {
+        return leftResult.bitOr(node, rightResult);
+      } else if (node.operator.type == TokenType.BAR_BAR) {
+        return leftResult.logicalOr(node, rightResult);
+      } else if (node.operator.type == TokenType.CARET) {
+        return leftResult.bitXor(node, rightResult);
+      } else if (node.operator.type == TokenType.EQ_EQ) {
+        return leftResult.equalEqual(node, rightResult);
+      } else if (node.operator.type == TokenType.GT) {
+        return leftResult.greaterThan(node, rightResult);
+      } else if (node.operator.type == TokenType.GT_EQ) {
+        return leftResult.greaterThanOrEqual(node, rightResult);
+      } else if (node.operator.type == TokenType.GT_GT) {
+        return leftResult.shiftRight(node, rightResult);
+      } else if (node.operator.type == TokenType.LT) {
+        return leftResult.lessThan(node, rightResult);
+      } else if (node.operator.type == TokenType.LT_EQ) {
+        return leftResult.lessThanOrEqual(node, rightResult);
+      } else if (node.operator.type == TokenType.LT_LT) {
+        return leftResult.shiftLeft(node, rightResult);
+      } else if (node.operator.type == TokenType.MINUS) {
+        return leftResult.minus(node, rightResult);
+      } else if (node.operator.type == TokenType.PERCENT) {
+        return leftResult.remainder(node, rightResult);
+      } else if (node.operator.type == TokenType.PLUS) {
+        return leftResult.add(node, rightResult);
+      } else if (node.operator.type == TokenType.STAR) {
+        return leftResult.times(node, rightResult);
+      } else if (node.operator.type == TokenType.SLASH) {
+        return leftResult.divide(node, rightResult);
+      } else if (node.operator.type == TokenType.TILDE_SLASH) {
+        return leftResult.integerDivide(node, rightResult);
+      }
+      break;
+    }
+    return error(node, null);
+  }
+  EvaluationResultImpl visitBooleanLiteral(BooleanLiteral node) => node.value ? ValidResult.RESULT_TRUE : ValidResult.RESULT_FALSE;
+  EvaluationResultImpl visitDoubleLiteral(DoubleLiteral node) => new ValidResult(node.value);
+  EvaluationResultImpl visitInstanceCreationExpression(InstanceCreationExpression node) {
+    ConstructorElement constructor = node.element;
+    if (constructor != null && constructor.isConst()) {
+      node.argumentList.accept(this);
+      return ValidResult.RESULT_OBJECT;
+    }
+    return error(node, null);
+  }
+  EvaluationResultImpl visitIntegerLiteral(IntegerLiteral node) => new ValidResult(node.value);
+  EvaluationResultImpl visitInterpolationExpression(InterpolationExpression node) {
+    EvaluationResultImpl result = node.expression.accept(this);
+    return result.performToString(node);
+  }
+  EvaluationResultImpl visitInterpolationString(InterpolationString node) => new ValidResult(node.value);
+  EvaluationResultImpl visitListLiteral(ListLiteral node) {
+    ErrorResult result = null;
+    for (Expression element in node.elements) {
+      result = union(result, element.accept(this));
+    }
+    if (result != null) {
+      return result;
+    }
+    return ValidResult.RESULT_OBJECT;
+  }
+  EvaluationResultImpl visitMapLiteral(MapLiteral node) {
+    ErrorResult result = null;
+    for (MapLiteralEntry entry in node.entries) {
+      result = union(result, entry.key.accept(this));
+      result = union(result, entry.value.accept(this));
+    }
+    if (result != null) {
+      return result;
+    }
+    return ValidResult.RESULT_OBJECT;
+  }
+  EvaluationResultImpl visitMethodInvocation(MethodInvocation node) {
+    Element element21 = node.methodName.element;
+    if (element21 is FunctionElement) {
+      FunctionElement function = element21 as FunctionElement;
+      if (function.name == "identical") {
+        NodeList<Expression> arguments3 = node.argumentList.arguments;
+        if (arguments3.length == 2) {
+          Element enclosingElement2 = function.enclosingElement;
+          if (enclosingElement2 is CompilationUnitElement) {
+            LibraryElement library20 = ((enclosingElement2 as CompilationUnitElement)).library;
+            if (library20.isDartCore()) {
+              EvaluationResultImpl leftArgument = arguments3[0].accept(this);
+              EvaluationResultImpl rightArgument = arguments3[1].accept(this);
+              return leftArgument.equalEqual(node, rightArgument);
+            }
+          }
+        }
+      }
+    }
+    return error(node, null);
+  }
+  EvaluationResultImpl visitNode(ASTNode node) => error(node, null);
+  EvaluationResultImpl visitNullLiteral(NullLiteral node) => new ValidResult(null);
+  EvaluationResultImpl visitParenthesizedExpression(ParenthesizedExpression node) => node.expression.accept(this);
+  EvaluationResultImpl visitPrefixedIdentifier(PrefixedIdentifier node) => getConstantValue(node, node.element);
+  EvaluationResultImpl visitPrefixExpression(PrefixExpression node) {
+    EvaluationResultImpl operand3 = node.operand.accept(this);
+    while (true) {
+      if (node.operator.type == TokenType.BANG) {
+        return operand3.logicalNot(node);
+      } else if (node.operator.type == TokenType.TILDE) {
+        return operand3.bitNot(node);
+      } else if (node.operator.type == TokenType.MINUS) {
+        return operand3.negated(node);
+      }
+      break;
+    }
+    return error(node, null);
+  }
+  EvaluationResultImpl visitPropertyAccess(PropertyAccess node) => getConstantValue(node, node.propertyName.element);
+  EvaluationResultImpl visitSimpleIdentifier(SimpleIdentifier node) => getConstantValue(node, node.element);
+  EvaluationResultImpl visitSimpleStringLiteral(SimpleStringLiteral node) => new ValidResult(node.value);
+  EvaluationResultImpl visitStringInterpolation(StringInterpolation node) {
+    EvaluationResultImpl result = null;
+    for (InterpolationElement element in node.elements) {
+      if (result == null) {
+        result = element.accept(this);
+      } else {
+        result = result.concatenate(node, element.accept(this));
+      }
+    }
+    return result;
+  }
+  /**
+   * Return a result object representing an error associated with the given node.
+   * @param node the AST node associated with the error
+   * @param code the error code indicating the nature of the error
+   * @return a result object representing an error associated with the given node
+   */
+  ErrorResult error(ASTNode node, ErrorCode code) => new ErrorResult.con1(node, code == 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
+   * @param element the element whose value is to be returned
+   * @return the constant value of the static constant
+   */
+  EvaluationResultImpl getConstantValue(ASTNode node, Element element) {
+    if (element is PropertyAccessorElementImpl) {
+      element = ((element as PropertyAccessorElementImpl)).variable;
+    }
+    if (element is VariableElementImpl) {
+      EvaluationResultImpl value = ((element as VariableElementImpl)).evaluationResult;
+      if (value != null) {
+        return value;
+      }
+    }
+    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
+   * of errors
+   * @param rightResult the errors to be added to the collection, or a valid result if there are no
+   * errors to be added
+   * @return the union of the errors encoded in the given results
+   */
+  ErrorResult union(ErrorResult leftResult, EvaluationResultImpl rightResult) {
+    if (rightResult is ErrorResult) {
+      if (leftResult != null) {
+        return new ErrorResult.con2(leftResult, (rightResult as ErrorResult));
+      } else {
+        return rightResult as ErrorResult;
+      }
+    }
+    return leftResult;
+  }
+}
+/**
+ * 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.
+   * @param node the node against which the error should be reported
+   * @param errorCode the error code for the error to be generated
+   */
+  ErrorResult.con1(ASTNode node, ErrorCode errorCode) {
+    _jtd_constructor_156_impl(node, errorCode);
+  }
+  _jtd_constructor_156_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.
+   * @param firstResult the first set of results being merged
+   * @param secondResult the second set of results being merged
+   */
+  ErrorResult.con2(ErrorResult firstResult, ErrorResult secondResult) {
+    _jtd_constructor_157_impl(firstResult, secondResult);
+  }
+  _jtd_constructor_157_impl(ErrorResult firstResult, ErrorResult secondResult) {
+    _errors.addAll(firstResult._errors);
+    _errors.addAll(secondResult._errors);
+  }
+  EvaluationResultImpl add(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.addToError(node, this);
+  EvaluationResultImpl bitAnd(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitAndError(node, this);
+  EvaluationResultImpl bitNot(Expression node) => this;
+  EvaluationResultImpl bitOr(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitOrError(node, this);
+  EvaluationResultImpl bitXor(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitXorError(node, this);
+  EvaluationResultImpl concatenate(Expression node, EvaluationResultImpl rightOperand) => rightOperand.concatenateError(node, this);
+  EvaluationResultImpl divide(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.divideError(node, this);
+  EvaluationResultImpl equalEqual(Expression node, EvaluationResultImpl rightOperand) => rightOperand.equalEqualError(node, this);
+  List<ErrorResult_ErrorData> get errorData => _errors;
+  List<AnalysisError> get errors => new List.from(_errors);
+  EvaluationResultImpl greaterThan(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.greaterThanError(node, this);
+  EvaluationResultImpl greaterThanOrEqual(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.greaterThanOrEqualError(node, this);
+  EvaluationResultImpl integerDivide(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.integerDivideError(node, this);
+  EvaluationResultImpl integerDivideValid(BinaryExpression node, ValidResult leftOperand) => this;
+  EvaluationResultImpl lessThan(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.lessThanError(node, this);
+  EvaluationResultImpl lessThanOrEqual(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.lessThanOrEqualError(node, this);
+  EvaluationResultImpl logicalAnd(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.logicalAndError(node, this);
+  EvaluationResultImpl logicalNot(Expression node) => this;
+  EvaluationResultImpl logicalOr(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.logicalOrError(node, this);
+  EvaluationResultImpl minus(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.minusError(node, this);
+  EvaluationResultImpl negated(Expression node) => this;
+  EvaluationResultImpl notEqual(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.notEqualError(node, this);
+  EvaluationResultImpl performToString(ASTNode node) => this;
+  EvaluationResultImpl remainder(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.remainderError(node, this);
+  EvaluationResultImpl shiftLeft(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.shiftLeftError(node, this);
+  EvaluationResultImpl shiftRight(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.shiftRightError(node, this);
+  EvaluationResultImpl times(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.timesError(node, this);
+  EvaluationResultImpl addToError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+  EvaluationResultImpl addToValid(BinaryExpression node, ValidResult leftOperand) => this;
+  EvaluationResultImpl bitAndError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+  EvaluationResultImpl bitAndValid(BinaryExpression node, ValidResult leftOperand) => this;
+  EvaluationResultImpl bitOrError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+  EvaluationResultImpl bitOrValid(BinaryExpression node, ValidResult leftOperand) => this;
+  EvaluationResultImpl bitXorError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+  EvaluationResultImpl bitXorValid(BinaryExpression node, ValidResult leftOperand) => this;
+  EvaluationResultImpl concatenateError(Expression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+  EvaluationResultImpl concatenateValid(Expression node, ValidResult leftOperand) => this;
+  EvaluationResultImpl divideError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+  EvaluationResultImpl divideValid(BinaryExpression node, ValidResult leftOperand) => this;
+  EvaluationResultImpl equalEqualError(Expression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+  EvaluationResultImpl equalEqualValid(Expression node, ValidResult leftOperand) => this;
+  EvaluationResultImpl greaterThanError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+  EvaluationResultImpl greaterThanOrEqualError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+  EvaluationResultImpl greaterThanOrEqualValid(BinaryExpression node, ValidResult leftOperand) => this;
+  EvaluationResultImpl greaterThanValid(BinaryExpression node, ValidResult leftOperand) => this;
+  EvaluationResultImpl integerDivideError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+  EvaluationResultImpl lessThanError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+  EvaluationResultImpl lessThanOrEqualError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+  EvaluationResultImpl lessThanOrEqualValid(BinaryExpression node, ValidResult leftOperand) => this;
+  EvaluationResultImpl lessThanValid(BinaryExpression node, ValidResult leftOperand) => this;
+  EvaluationResultImpl logicalAndError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+  EvaluationResultImpl logicalAndValid(BinaryExpression node, ValidResult leftOperand) => this;
+  EvaluationResultImpl logicalOrError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+  EvaluationResultImpl logicalOrValid(BinaryExpression node, ValidResult leftOperand) => this;
+  EvaluationResultImpl minusError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+  EvaluationResultImpl minusValid(BinaryExpression node, ValidResult leftOperand) => this;
+  EvaluationResultImpl notEqualError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+  EvaluationResultImpl notEqualValid(BinaryExpression node, ValidResult leftOperand) => this;
+  EvaluationResultImpl remainderError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+  EvaluationResultImpl remainderValid(BinaryExpression node, ValidResult leftOperand) => this;
+  EvaluationResultImpl shiftLeftError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+  EvaluationResultImpl shiftLeftValid(BinaryExpression node, ValidResult leftOperand) => this;
+  EvaluationResultImpl shiftRightError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+  EvaluationResultImpl shiftRightValid(BinaryExpression node, ValidResult leftOperand) => this;
+  EvaluationResultImpl timesError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+  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.
+   * @param node the node against which the error should be reported
+   * @param errorCode the error code for the error to be generated
+   */
+  ErrorResult_ErrorData(ASTNode node, ErrorCode errorCode) {
+    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.
+ */
+abstract class EvaluationResultImpl {
+  EvaluationResultImpl add(BinaryExpression node, EvaluationResultImpl rightOperand);
+  EvaluationResultImpl bitAnd(BinaryExpression node, EvaluationResultImpl rightOperand);
+  EvaluationResultImpl bitNot(Expression node);
+  EvaluationResultImpl bitOr(BinaryExpression node, EvaluationResultImpl rightOperand);
+  EvaluationResultImpl bitXor(BinaryExpression node, EvaluationResultImpl rightOperand);
+  EvaluationResultImpl concatenate(Expression node, EvaluationResultImpl rightOperand);
+  EvaluationResultImpl divide(BinaryExpression node, EvaluationResultImpl rightOperand);
+  EvaluationResultImpl equalEqual(Expression node, EvaluationResultImpl rightOperand);
+  EvaluationResultImpl greaterThan(BinaryExpression node, EvaluationResultImpl rightOperand);
+  EvaluationResultImpl greaterThanOrEqual(BinaryExpression node, EvaluationResultImpl rightOperand);
+  EvaluationResultImpl integerDivide(BinaryExpression node, EvaluationResultImpl rightOperand);
+  EvaluationResultImpl lessThan(BinaryExpression node, EvaluationResultImpl rightOperand);
+  EvaluationResultImpl lessThanOrEqual(BinaryExpression node, EvaluationResultImpl rightOperand);
+  EvaluationResultImpl logicalAnd(BinaryExpression node, EvaluationResultImpl rightOperand);
+  EvaluationResultImpl logicalNot(Expression node);
+  EvaluationResultImpl logicalOr(BinaryExpression node, EvaluationResultImpl rightOperand);
+  EvaluationResultImpl minus(BinaryExpression node, EvaluationResultImpl rightOperand);
+  EvaluationResultImpl negated(Expression node);
+  EvaluationResultImpl notEqual(BinaryExpression node, EvaluationResultImpl rightOperand);
+  EvaluationResultImpl performToString(ASTNode node);
+  EvaluationResultImpl remainder(BinaryExpression node, EvaluationResultImpl rightOperand);
+  EvaluationResultImpl shiftLeft(BinaryExpression node, EvaluationResultImpl rightOperand);
+  EvaluationResultImpl shiftRight(BinaryExpression node, EvaluationResultImpl rightOperand);
+  EvaluationResultImpl times(BinaryExpression node, EvaluationResultImpl rightOperand);
+  EvaluationResultImpl addToError(BinaryExpression node, ErrorResult leftOperand);
+  EvaluationResultImpl addToValid(BinaryExpression node, ValidResult leftOperand);
+  EvaluationResultImpl bitAndError(BinaryExpression node, ErrorResult leftOperand);
+  EvaluationResultImpl bitAndValid(BinaryExpression node, ValidResult leftOperand);
+  EvaluationResultImpl bitOrError(BinaryExpression node, ErrorResult leftOperand);
+  EvaluationResultImpl bitOrValid(BinaryExpression node, ValidResult leftOperand);
+  EvaluationResultImpl bitXorError(BinaryExpression node, ErrorResult leftOperand);
+  EvaluationResultImpl bitXorValid(BinaryExpression node, ValidResult leftOperand);
+  EvaluationResultImpl concatenateError(Expression node, ErrorResult leftOperand);
+  EvaluationResultImpl concatenateValid(Expression node, ValidResult leftOperand);
+  EvaluationResultImpl divideError(BinaryExpression node, ErrorResult leftOperand);
+  EvaluationResultImpl divideValid(BinaryExpression node, ValidResult leftOperand);
+  EvaluationResultImpl equalEqualError(Expression node, ErrorResult leftOperand);
+  EvaluationResultImpl equalEqualValid(Expression node, ValidResult leftOperand);
+  EvaluationResultImpl greaterThanError(BinaryExpression node, ErrorResult leftOperand);
+  EvaluationResultImpl greaterThanOrEqualError(BinaryExpression node, ErrorResult leftOperand);
+  EvaluationResultImpl greaterThanOrEqualValid(BinaryExpression node, ValidResult leftOperand);
+  EvaluationResultImpl greaterThanValid(BinaryExpression node, ValidResult leftOperand);
+  EvaluationResultImpl integerDivideError(BinaryExpression node, ErrorResult leftOperand);
+  EvaluationResultImpl integerDivideValid(BinaryExpression node, ValidResult leftOperand);
+  EvaluationResultImpl lessThanError(BinaryExpression node, ErrorResult leftOperand);
+  EvaluationResultImpl lessThanOrEqualError(BinaryExpression node, ErrorResult leftOperand);
+  EvaluationResultImpl lessThanOrEqualValid(BinaryExpression node, ValidResult leftOperand);
+  EvaluationResultImpl lessThanValid(BinaryExpression node, ValidResult leftOperand);
+  EvaluationResultImpl logicalAndError(BinaryExpression node, ErrorResult leftOperand);
+  EvaluationResultImpl logicalAndValid(BinaryExpression node, ValidResult leftOperand);
+  EvaluationResultImpl logicalOrError(BinaryExpression node, ErrorResult leftOperand);
+  EvaluationResultImpl logicalOrValid(BinaryExpression node, ValidResult leftOperand);
+  EvaluationResultImpl minusError(BinaryExpression node, ErrorResult leftOperand);
+  EvaluationResultImpl minusValid(BinaryExpression node, ValidResult leftOperand);
+  EvaluationResultImpl notEqualError(BinaryExpression node, ErrorResult leftOperand);
+  EvaluationResultImpl notEqualValid(BinaryExpression node, ValidResult leftOperand);
+  EvaluationResultImpl remainderError(BinaryExpression node, ErrorResult leftOperand);
+  EvaluationResultImpl remainderValid(BinaryExpression node, ValidResult leftOperand);
+  EvaluationResultImpl shiftLeftError(BinaryExpression node, ErrorResult leftOperand);
+  EvaluationResultImpl shiftLeftValid(BinaryExpression node, ValidResult leftOperand);
+  EvaluationResultImpl shiftRightError(BinaryExpression node, ErrorResult leftOperand);
+  EvaluationResultImpl shiftRightValid(BinaryExpression node, ValidResult leftOperand);
+  EvaluationResultImpl timesError(BinaryExpression node, ErrorResult leftOperand);
+  EvaluationResultImpl timesValid(BinaryExpression node, ValidResult leftOperand);
+}
+/**
+ * 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 arbitrary object on which no further operations can be
+   * performed.
+   */
+  static ValidResult RESULT_OBJECT = new ValidResult(new Object());
+  /**
+   * 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
+   */
+  ValidResult(Object value) {
+    this._value = value;
+  }
+  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 (_value == null) {
+      return error(node);
+    } else if (_value is int) {
+      return valueOf(~((_value as int)));
+    }
+    return error(node);
+  }
+  EvaluationResultImpl bitOr(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitOrValid(node, this);
+  EvaluationResultImpl bitXor(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitXorValid(node, this);
+  EvaluationResultImpl concatenate(Expression node, EvaluationResultImpl rightOperand) => rightOperand.concatenateValid(node, this);
+  EvaluationResultImpl divide(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.divideValid(node, this);
+  EvaluationResultImpl equalEqual(Expression node, EvaluationResultImpl rightOperand) => rightOperand.equalEqualValid(node, this);
+  Object get value => _value;
+  EvaluationResultImpl greaterThan(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.greaterThanValid(node, this);
+  EvaluationResultImpl greaterThanOrEqual(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.greaterThanOrEqualValid(node, this);
+  EvaluationResultImpl integerDivide(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.integerDivideValid(node, this);
+  EvaluationResultImpl lessThan(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.lessThanValid(node, this);
+  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 (_value == null) {
+      return RESULT_TRUE;
+    } else if (_value is bool) {
+      return ((_value as bool)) ? RESULT_FALSE : RESULT_TRUE;
+    }
+    return error(node);
+  }
+  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 (_value == null) {
+      return error(node);
+    } else if (_value is int) {
+      return valueOf(-((_value as int)));
+    } else if (_value is double) {
+      return valueOf3(-((_value as double)));
+    }
+    return error(node);
+  }
+  EvaluationResultImpl notEqual(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.notEqualValid(node, this);
+  EvaluationResultImpl performToString(ASTNode node) {
+    if (_value == null) {
+      return valueOf4("null");
+    } else if (_value is bool) {
+      return valueOf4(((_value as bool)).toString());
+    } else if (_value is int) {
+      return valueOf4(((_value as int)).toString());
+    } else if (_value is double) {
+      return valueOf4(((_value as double)).toString());
+    } else if (_value is String) {
+      return this;
+    }
+    return error(node);
+  }
+  EvaluationResultImpl remainder(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.remainderValid(node, this);
+  EvaluationResultImpl shiftLeft(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.shiftLeftValid(node, this);
+  EvaluationResultImpl shiftRight(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.shiftRightValid(node, this);
+  EvaluationResultImpl times(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.timesValid(node, this);
+  String toString() {
+    if (_value == null) {
+      return "null";
+    }
+    return _value.toString();
+  }
+  EvaluationResultImpl addToError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+  EvaluationResultImpl addToValid(BinaryExpression node, ValidResult leftOperand3) {
+    Object leftValue = leftOperand3.value;
+    if (leftValue == null) {
+      return error(node.leftOperand);
+    } else if (_value == null) {
+      return error(node.rightOperand);
+    } else if (leftValue is int) {
+      if (_value is int) {
+        return valueOf(((leftValue as int)) + (_value as int));
+      } else if (_value is double) {
+        return valueOf3(((leftValue as int)).toDouble() + ((_value as double)));
+      }
+    } else if (leftValue is double) {
+      if (_value is int) {
+        return valueOf3(((leftValue as double)) + ((_value as int)).toDouble());
+      } else if (_value is double) {
+        return valueOf3(((leftValue as double)) + ((_value as double)));
+      }
+    } else if (leftValue is String) {
+      if (_value is String) {
+        return valueOf4("${((leftValue as String))}${((_value as String))}");
+      }
+    }
+    return error(node);
+  }
+  EvaluationResultImpl bitAndError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+  EvaluationResultImpl bitAndValid(BinaryExpression node, ValidResult leftOperand4) {
+    Object leftValue = leftOperand4.value;
+    if (leftValue == null) {
+      return error(node.leftOperand);
+    } else if (_value == null) {
+      return error(node.rightOperand);
+    } else if (leftValue is int) {
+      if (_value is int) {
+        return valueOf(((leftValue as int)) & (_value as int));
+      }
+      return error(node.leftOperand);
+    }
+    if (_value is int) {
+      return error(node.rightOperand);
+    }
+    return union(error(node.leftOperand), error(node.rightOperand));
+  }
+  EvaluationResultImpl bitOrError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+  EvaluationResultImpl bitOrValid(BinaryExpression node, ValidResult leftOperand5) {
+    Object leftValue = leftOperand5.value;
+    if (leftValue == null) {
+      return error(node.leftOperand);
+    } else if (_value == null) {
+      return error(node.rightOperand);
+    } else if (leftValue is int) {
+      if (_value is int) {
+        return valueOf(((leftValue as int)) | (_value as int));
+      }
+      return error(node.leftOperand);
+    }
+    if (_value is int) {
+      return error(node.rightOperand);
+    }
+    return union(error(node.leftOperand), error(node.rightOperand));
+  }
+  EvaluationResultImpl bitXorError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+  EvaluationResultImpl bitXorValid(BinaryExpression node, ValidResult leftOperand6) {
+    Object leftValue = leftOperand6.value;
+    if (leftValue == null) {
+      return error(node.leftOperand);
+    } else if (_value == null) {
+      return error(node.rightOperand);
+    } else if (leftValue is int) {
+      if (_value is int) {
+        return valueOf(((leftValue as int)) ^ (_value as int));
+      }
+      return error(node.leftOperand);
+    }
+    if (_value is int) {
+      return error(node.rightOperand);
+    }
+    return union(error(node.leftOperand), error(node.rightOperand));
+  }
+  EvaluationResultImpl concatenateError(Expression node, ErrorResult leftOperand) => leftOperand;
+  EvaluationResultImpl concatenateValid(Expression node, ValidResult leftOperand) {
+    Object leftValue = leftOperand.value;
+    if (leftValue is String && _value is String) {
+      return valueOf4("${((leftValue as String))}${((_value as String))}");
+    }
+    return error(node);
+  }
+  EvaluationResultImpl divideError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+  EvaluationResultImpl divideValid(BinaryExpression node, ValidResult leftOperand7) {
+    Object leftValue = leftOperand7.value;
+    if (leftValue == null) {
+      return error(node.leftOperand);
+    } else if (_value == null) {
+      return error(node.rightOperand);
+    } else if (leftValue is int) {
+      if (_value is int) {
+        if (((_value as int)) == 0) {
+          return error2(node.rightOperand, CompileTimeErrorCode.COMPILE_TIME_CONSTANT_RAISES_EXCEPTION_DIVIDE_BY_ZERO);
+        }
+        return valueOf(((leftValue as int)) ~/ (_value as int));
+      } else if (_value is double) {
+        return valueOf3(((leftValue as int)).toDouble() / ((_value as double)));
+      }
+    } else if (leftValue is double) {
+      if (_value is int) {
+        return valueOf3(((leftValue as double)) / ((_value as int)).toDouble());
+      } else if (_value is double) {
+        return valueOf3(((leftValue as double)) / ((_value as double)));
+      }
+    }
+    return error(node);
+  }
+  EvaluationResultImpl equalEqualError(Expression node, ErrorResult leftOperand) => leftOperand;
+  EvaluationResultImpl equalEqualValid(Expression node, ValidResult leftOperand) {
+    Object leftValue = leftOperand.value;
+    if (leftValue == null) {
+      return valueOf2(_value == null);
+    } else if (leftValue is bool) {
+      if (_value is bool) {
+        return valueOf2(identical(((leftValue as bool)), ((_value as bool))));
+      }
+      return RESULT_FALSE;
+    } else if (leftValue is int) {
+      if (_value is int) {
+        return valueOf2(((leftValue as int)) == _value);
+      } else if (_value is double) {
+        return valueOf2(toDouble((leftValue as int)) == _value);
+      }
+      return RESULT_FALSE;
+    } else if (leftValue is double) {
+      if (_value is int) {
+        return valueOf2(((leftValue as double)) == toDouble((_value as int)));
+      } else if (_value is double) {
+        return valueOf2(((leftValue as double)) == _value);
+      }
+      return RESULT_FALSE;
+    } else if (leftValue is String) {
+      if (_value is String) {
+        return valueOf2(((leftValue as String)) == _value);
+      }
+      return RESULT_FALSE;
+    }
+    return RESULT_FALSE;
+  }
+  EvaluationResultImpl greaterThanError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+  EvaluationResultImpl greaterThanOrEqualError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+  EvaluationResultImpl greaterThanOrEqualValid(BinaryExpression node, ValidResult leftOperand8) {
+    Object leftValue = leftOperand8.value;
+    if (leftValue == null) {
+      return error(node.leftOperand);
+    } else if (_value == null) {
+      return error(node.rightOperand);
+    } else if (leftValue is int) {
+      if (_value is int) {
+        return valueOf2(((leftValue as int)).compareTo((_value as int)) >= 0);
+      } else if (_value is double) {
+        return valueOf2(((leftValue as int)).toDouble() >= ((_value as double)));
+      }
+    } else if (leftValue is double) {
+      if (_value is int) {
+        return valueOf2(((leftValue as double)) >= ((_value as int)).toDouble());
+      } else if (_value is double) {
+        return valueOf2(((leftValue as double)) >= ((_value as double)));
+      }
+    }
+    return error(node);
+  }
+  EvaluationResultImpl greaterThanValid(BinaryExpression node, ValidResult leftOperand9) {
+    Object leftValue = leftOperand9.value;
+    if (leftValue == null) {
+      return error(node.leftOperand);
+    } else if (_value == null) {
+      return error(node.rightOperand);
+    } else if (leftValue is int) {
+      if (_value is int) {
+        return valueOf2(((leftValue as int)).compareTo((_value as int)) > 0);
+      } else if (_value is double) {
+        return valueOf2(((leftValue as int)).toDouble() > ((_value as double)));
+      }
+    } else if (leftValue is double) {
+      if (_value is int) {
+        return valueOf2(((leftValue as double)) > ((_value as int)).toDouble());
+      } else if (_value is double) {
+        return valueOf2(((leftValue as double)) > ((_value as double)));
+      }
+    }
+    return error(node);
+  }
+  EvaluationResultImpl integerDivideError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+  EvaluationResultImpl integerDivideValid(BinaryExpression node, ValidResult leftOperand10) {
+    Object leftValue = leftOperand10.value;
+    if (leftValue == null) {
+      return error(node.leftOperand);
+    } else if (_value == null) {
+      return error(node.rightOperand);
+    } else if (leftValue is int) {
+      if (_value is int) {
+        if (((_value as int)) == 0) {
+          return error2(node.rightOperand, CompileTimeErrorCode.COMPILE_TIME_CONSTANT_RAISES_EXCEPTION_DIVIDE_BY_ZERO);
+        }
+        return valueOf(((leftValue as int)) ~/ (_value as int));
+      } else if (_value is double) {
+        double result = ((leftValue as int)).toDouble() / ((_value as double));
+        return valueOf((result as int));
+      }
+    } else if (leftValue is double) {
+      if (_value is int) {
+        double result = ((leftValue as double)) / ((_value as int)).toDouble();
+        return valueOf((result as int));
+      } else if (_value is double) {
+        double result = ((leftValue as double)) / ((_value as double));
+        return valueOf((result as int));
+      }
+    }
+    return error(node);
+  }
+  EvaluationResultImpl lessThanError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+  EvaluationResultImpl lessThanOrEqualError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+  EvaluationResultImpl lessThanOrEqualValid(BinaryExpression node, ValidResult leftOperand11) {
+    Object leftValue = leftOperand11.value;
+    if (leftValue == null) {
+      return error(node.leftOperand);
+    } else if (_value == null) {
+      return error(node.rightOperand);
+    } else if (leftValue is int) {
+      if (_value is int) {
+        return valueOf2(((leftValue as int)).compareTo((_value as int)) <= 0);
+      } else if (_value is double) {
+        return valueOf2(((leftValue as int)).toDouble() <= ((_value as double)));
+      }
+    } else if (leftValue is double) {
+      if (_value is int) {
+        return valueOf2(((leftValue as double)) <= ((_value as int)).toDouble());
+      } else if (_value is double) {
+        return valueOf2(((leftValue as double)) <= ((_value as double)));
+      }
+    }
+    return error(node);
+  }
+  EvaluationResultImpl lessThanValid(BinaryExpression node, ValidResult leftOperand12) {
+    Object leftValue = leftOperand12.value;
+    if (leftValue == null) {
+      return error(node.leftOperand);
+    } else if (_value == null) {
+      return error(node.rightOperand);
+    } else if (leftValue is int) {
+      if (_value is int) {
+        return valueOf2(((leftValue as int)).compareTo((_value as int)) < 0);
+      } else if (_value is double) {
+        return valueOf2(((leftValue as int)).toDouble() < ((_value as double)));
+      }
+    } else if (leftValue is double) {
+      if (_value is int) {
+        return valueOf2(((leftValue as double)) < ((_value as int)).toDouble());
+      } else if (_value is double) {
+        return valueOf2(((leftValue as double)) < ((_value as double)));
+      }
+    }
+    return error(node);
+  }
+  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);
+    }
+    return RESULT_FALSE;
+  }
+  EvaluationResultImpl logicalOrError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+  EvaluationResultImpl logicalOrValid(BinaryExpression node, ValidResult leftOperand) {
+    Object leftValue = leftOperand.value;
+    if (leftValue is bool && ((leftValue as bool))) {
+      return RESULT_TRUE;
+    }
+    return booleanConversion(node.rightOperand, _value);
+  }
+  EvaluationResultImpl minusError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+  EvaluationResultImpl minusValid(BinaryExpression node, ValidResult leftOperand13) {
+    Object leftValue = leftOperand13.value;
+    if (leftValue == null) {
+      return error(node.leftOperand);
+    } else if (_value == null) {
+      return error(node.rightOperand);
+    } else if (leftValue is int) {
+      if (_value is int) {
+        return valueOf(((leftValue as int)) - (_value as int));
+      } else if (_value is double) {
+        return valueOf3(((leftValue as int)).toDouble() - ((_value as double)));
+      }
+    } else if (leftValue is double) {
+      if (_value is int) {
+        return valueOf3(((leftValue as double)) - ((_value as int)).toDouble());
+      } else if (_value is double) {
+        return valueOf3(((leftValue as double)) - ((_value as double)));
+      }
+    }
+    return error(node);
+  }
+  EvaluationResultImpl notEqualError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+  EvaluationResultImpl notEqualValid(BinaryExpression node, ValidResult leftOperand) {
+    Object leftValue = leftOperand.value;
+    if (leftValue == null) {
+      return valueOf2(_value != null);
+    } else if (leftValue is bool) {
+      if (_value is bool) {
+        return valueOf2(((leftValue as bool)) != ((_value as bool)));
+      }
+      return RESULT_TRUE;
+    } else if (leftValue is int) {
+      if (_value is int) {
+        return valueOf2(((leftValue as int)) != _value);
+      } else if (_value is double) {
+        return valueOf2(toDouble((leftValue as int)) != _value);
+      }
+      return RESULT_TRUE;
+    } else if (leftValue is double) {
+      if (_value is int) {
+        return valueOf2(((leftValue as double)) != toDouble((_value as int)));
+      } else if (_value is double) {
+        return valueOf2(((leftValue as double)) != _value);
+      }
+      return RESULT_TRUE;
+    } else if (leftValue is String) {
+      if (_value is String) {
+        return valueOf2(((leftValue as String)) != _value);
+      }
+      return RESULT_TRUE;
+    }
+    return RESULT_TRUE;
+  }
+  EvaluationResultImpl remainderError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+  EvaluationResultImpl remainderValid(BinaryExpression node, ValidResult leftOperand14) {
+    Object leftValue = leftOperand14.value;
+    if (leftValue == null) {
+      return error(node.leftOperand);
+    } else if (_value == null) {
+      return error(node.rightOperand);
+    } else if (leftValue is int) {
+      if (((_value as int)) == 0) {
+        return error2(node.rightOperand, CompileTimeErrorCode.COMPILE_TIME_CONSTANT_RAISES_EXCEPTION_DIVIDE_BY_ZERO);
+      }
+      if (_value is int) {
+        return valueOf(((leftValue as int)).remainder((_value as int)));
+      } else if (_value is double) {
+        return valueOf3(((leftValue as int)).toDouble() % ((_value as double)));
+      }
+    } else if (leftValue is double) {
+      if (_value is int) {
+        return valueOf3(((leftValue as double)) % ((_value as int)).toDouble());
+      } else if (_value is double) {
+        return valueOf3(((leftValue as double)) % ((_value as double)));
+      }
+    }
+    return error(node);
+  }
+  EvaluationResultImpl shiftLeftError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+  EvaluationResultImpl shiftLeftValid(BinaryExpression node, ValidResult leftOperand15) {
+    Object leftValue = leftOperand15.value;
+    if (leftValue == null) {
+      return error(node.leftOperand);
+    } else if (_value == null) {
+      return error(node.rightOperand);
+    } else if (leftValue is int) {
+      if (_value is int) {
+        return valueOf(((leftValue as int)) << ((_value as int)));
+      }
+      return error(node.rightOperand);
+    }
+    if (_value is int) {
+      return error(node.leftOperand);
+    }
+    return union(error(node.leftOperand), error(node.rightOperand));
+  }
+  EvaluationResultImpl shiftRightError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+  EvaluationResultImpl shiftRightValid(BinaryExpression node, ValidResult leftOperand16) {
+    Object leftValue = leftOperand16.value;
+    if (leftValue == null) {
+      return error(node.leftOperand);
+    } else if (_value == null) {
+      return error(node.rightOperand);
+    } else if (leftValue is int) {
+      if (_value is int) {
+        return valueOf(((leftValue as int)) >> ((_value as int)));
+      }
+      return error(node.rightOperand);
+    }
+    if (_value is int) {
+      return error(node.leftOperand);
+    }
+    return union(error(node.leftOperand), error(node.rightOperand));
+  }
+  EvaluationResultImpl timesError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+  EvaluationResultImpl timesValid(BinaryExpression node, ValidResult leftOperand17) {
+    Object leftValue = leftOperand17.value;
+    if (leftValue == null) {
+      return error(node.leftOperand);
+    } else if (_value == null) {
+      return error(node.rightOperand);
+    } else if (leftValue is int) {
+      if (_value is int) {
+        return valueOf(((leftValue as int)) * (_value as int));
+      } else if (_value is double) {
+        return valueOf3(((leftValue as int)).toDouble() * ((_value as double)));
+      }
+    } else if (leftValue is double) {
+      if (_value is int) {
+        return valueOf3(((leftValue as double)) * ((_value as int)).toDouble());
+      } else if (_value is double) {
+        return valueOf3(((leftValue as double)) * ((_value as double)));
+      }
+    }
+    return error(node);
+  }
+  /**
+   * Return the result of applying boolean conversion to the given value.
+   * @param node the node against which errors should be reported
+   * @param value the value to be converted to a boolean
+   * @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;
+    }
+    return RESULT_FALSE;
+  }
+  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
+   * @param code the error code indicating the nature of the error
+   * @return a result object representing an error associated with the given node
+   */
+  ErrorResult error2(ASTNode node, ErrorCode code) => new ErrorResult.con1(node, code);
+  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
+   * @param secondError the second error to be combined
+   * @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
+   * @return a result object representing the given value
+   */
+  ValidResult valueOf4(String value) => new ValidResult(value);
+}
\ No newline at end of file
diff --git a/pkg/analyzer-experimental/lib/src/generated/element.dart b/pkg/analyzer_experimental/lib/src/generated/element.dart
similarity index 69%
rename from pkg/analyzer-experimental/lib/src/generated/element.dart
rename to pkg/analyzer_experimental/lib/src/generated/element.dart
index 9be35da..601a3e1 100644
--- a/pkg/analyzer-experimental/lib/src/generated/element.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/element.dart
@@ -8,13 +8,16 @@
 import 'java_engine.dart';
 import 'source.dart';
 import 'scanner.dart' show Keyword;
-import 'ast.dart';
+import 'ast.dart' show Identifier, LibraryIdentifier;
+import 'html.dart' show XmlTagNode;
 import 'engine.dart' show AnalysisContext;
+import 'constant.dart' show EvaluationResultImpl;
 import 'utilities_dart.dart';
 
 /**
  * The interface {@code Annotation} defines the behavior of objects representing a single annotation
  * associated with an element.
+ * @coverage dart.engine.element
  */
 abstract class Annotation {
   /**
@@ -26,6 +29,7 @@
 }
 /**
  * The interface {@code ClassElement} defines the behavior of elements that represent a class.
+ * @coverage dart.engine.element
  */
 abstract class ClassElement implements Element {
   /**
@@ -103,10 +107,25 @@
    */
   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:
+   * <blockquote>It is a compile-time error if a declared or derived mixin refers to super. It is a
+   * compile-time error if a declared or derived mixin explicitly declares a constructor. It is a
+   * compile-time error if a mixin is derived from a class whose superclass is not
+   * Object.</blockquote>
+   * @return {@code true} if this class can validly be used as a mixin
+   */
+  bool isValidMixin();
+  /**
    * Return the element representing the getter that results from looking up the given getter in
    * this class with respect to the given library, or {@code null} if the look up fails. The
    * 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>
+   * <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
@@ -165,6 +184,7 @@
 /**
  * The interface {@code CompilationUnitElement} defines the behavior of elements representing a
  * compilation unit.
+ * @coverage dart.engine.element
  */
 abstract class CompilationUnitElement implements Element {
   /**
@@ -184,24 +204,25 @@
    */
   List<FunctionElement> get functions;
   /**
-   * Return an array containing all of the type aliases contained in this compilation unit.
-   * @return the type aliases contained in this compilation unit
+   * 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<TypeAliasElement> get typeAliases;
+  List<TopLevelVariableElement> get topLevelVariables;
+  /**
+   * 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 classes contained in this compilation unit.
    * @return the classes contained in this compilation unit
    */
   List<ClassElement> get types;
-  /**
-   * Return an array containing all of the variables contained in this compilation unit.
-   * @return the variables contained in this compilation unit
-   */
-  List<VariableElement> get variables;
 }
 /**
  * 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 {
   /**
@@ -239,9 +260,21 @@
  * Second, there are elements in the element model that do not have a name. These correspond to
  * unnamed functions and exist in order to more accurately represent the semantic structure of the
  * program.
+ * @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 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
@@ -314,43 +347,61 @@
    * @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.
+   * @param visitor the visitor that will be used to visit the children of this element
+   */
+  void visitChildren(ElementVisitor<Object> visitor);
 }
 /**
  * The enumeration {@code ElementKind} defines the various kinds of elements in the element model.
+ * @coverage dart.engine.element
  */
 class ElementKind {
-  static final ElementKind CLASS = new ElementKind('CLASS', 0);
-  static final ElementKind COMPILATION_UNIT = new ElementKind('COMPILATION_UNIT', 1);
-  static final ElementKind CONSTRUCTOR = new ElementKind('CONSTRUCTOR', 2);
-  static final ElementKind DYNAMIC = new ElementKind('DYNAMIC', 3);
-  static final ElementKind ERROR = new ElementKind('ERROR', 4);
-  static final ElementKind EXPORT = new ElementKind('EXPORT', 5);
-  static final ElementKind FIELD = new ElementKind('FIELD', 6);
-  static final ElementKind FUNCTION = new ElementKind('FUNCTION', 7);
-  static final ElementKind GETTER = new ElementKind('GETTER', 8);
-  static final ElementKind HTML = new ElementKind('HTML', 9);
-  static final ElementKind IMPORT = new ElementKind('IMPORT', 10);
-  static final ElementKind LABEL = new ElementKind('LABEL', 11);
-  static final ElementKind LIBRARY = new ElementKind('LIBRARY', 12);
-  static final ElementKind METHOD = new ElementKind('METHOD', 13);
-  static final ElementKind NAME = new ElementKind('NAME', 14);
-  static final ElementKind PARAMETER = new ElementKind('PARAMETER', 15);
-  static final ElementKind PREFIX = new ElementKind('PREFIX', 16);
-  static final ElementKind SETTER = new ElementKind('SETTER', 17);
-  static final ElementKind TYPE_ALIAS = new ElementKind('TYPE_ALIAS', 18);
-  static final ElementKind TYPE_VARIABLE = new ElementKind('TYPE_VARIABLE', 19);
-  static final ElementKind UNIVERSE = new ElementKind('UNIVERSE', 20);
-  static final ElementKind VARIABLE = new ElementKind('VARIABLE', 21);
-  static final List<ElementKind> values = [CLASS, COMPILATION_UNIT, CONSTRUCTOR, DYNAMIC, ERROR, EXPORT, FIELD, FUNCTION, GETTER, HTML, IMPORT, LABEL, LIBRARY, METHOD, NAME, PARAMETER, PREFIX, SETTER, TYPE_ALIAS, TYPE_VARIABLE, UNIVERSE, VARIABLE];
+  static final ElementKind CLASS = new ElementKind('CLASS', 0, "class");
+  static final ElementKind COMPILATION_UNIT = new ElementKind('COMPILATION_UNIT', 1, "compilation unit");
+  static final ElementKind CONSTRUCTOR = new ElementKind('CONSTRUCTOR', 2, "constructor");
+  static final ElementKind DYNAMIC = new ElementKind('DYNAMIC', 3, "<dynamic>");
+  static final ElementKind EMBEDDED_HTML_SCRIPT = new ElementKind('EMBEDDED_HTML_SCRIPT', 4, "embedded html script");
+  static final ElementKind ERROR = new ElementKind('ERROR', 5, "<error>");
+  static final ElementKind EXPORT = new ElementKind('EXPORT', 6, "export directive");
+  static final ElementKind EXTERNAL_HTML_SCRIPT = new ElementKind('EXTERNAL_HTML_SCRIPT', 7, "external html script");
+  static final ElementKind FIELD = new ElementKind('FIELD', 8, "field");
+  static final ElementKind FUNCTION = new ElementKind('FUNCTION', 9, "function");
+  static final ElementKind GETTER = new ElementKind('GETTER', 10, "getter");
+  static final ElementKind HTML = new ElementKind('HTML', 11, "html");
+  static final ElementKind IMPORT = new ElementKind('IMPORT', 12, "import directive");
+  static final ElementKind LABEL = new ElementKind('LABEL', 13, "label");
+  static final ElementKind LIBRARY = new ElementKind('LIBRARY', 14, "library");
+  static final ElementKind LOCAL_VARIABLE = new ElementKind('LOCAL_VARIABLE', 15, "local variable");
+  static final ElementKind METHOD = new ElementKind('METHOD', 16, "method");
+  static final ElementKind NAME = new ElementKind('NAME', 17, "<name>");
+  static final ElementKind PARAMETER = new ElementKind('PARAMETER', 18, "parameter");
+  static final ElementKind PREFIX = new ElementKind('PREFIX', 19, "import prefix");
+  static final ElementKind SETTER = new ElementKind('SETTER', 20, "setter");
+  static final ElementKind TOP_LEVEL_VARIABLE = new ElementKind('TOP_LEVEL_VARIABLE', 21, "top level variable");
+  static final ElementKind FUNCTION_TYPE_ALIAS = new ElementKind('FUNCTION_TYPE_ALIAS', 22, "function type alias");
+  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;
-  ElementKind(this.__name, this.__ordinal) {
+  int get ordinal => __ordinal;
+  String _displayName;
+  ElementKind(this.__name, this.__ordinal, String displayName) {
+    this._displayName = displayName;
   }
+  /**
+   * @return the name of this {@link ElementKind} to display in UI.
+   */
+  String get displayName => _displayName;
   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 {
   /**
@@ -361,15 +412,56 @@
   String get encoding;
 }
 /**
+ * The interface {@code ElementVisitor} defines the behavior of objects that can be used to visit an
+ * element structure.
+ * @coverage dart.engine.element
+ */
+abstract class ElementVisitor<R> {
+  R visitClassElement(ClassElement element);
+  R visitCompilationUnitElement(CompilationUnitElement element);
+  R visitConstructorElement(ConstructorElement element);
+  R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element);
+  R visitExportElement(ExportElement element);
+  R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element);
+  R visitFieldElement(FieldElement element);
+  R visitFunctionElement(FunctionElement element);
+  R visitHtmlElement(HtmlElement element);
+  R visitImportElement(ImportElement element);
+  R visitLabelElement(LabelElement element);
+  R visitLibraryElement(LibraryElement element);
+  R visitLocalVariableElement(LocalVariableElement element);
+  R visitMethodElement(MethodElement element);
+  R visitMultiplyDefinedElement(MultiplyDefinedElement element);
+  R visitParameterElement(ParameterElement element);
+  R visitPrefixElement(PrefixElement element);
+  R visitPropertyAccessorElement(PropertyAccessorElement element);
+  R visitTopLevelVariableElement(TopLevelVariableElement element);
+  R visitFunctionTypeAliasElement(FunctionTypeAliasElement 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<ExecutableElement> get functions;
+  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
@@ -379,7 +471,7 @@
    * Return an array containing all of the local variables defined within this executable element.
    * @return the local variables defined within this executable element
    */
-  List<VariableElement> get localVariables;
+  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
@@ -390,10 +482,17 @@
    * @return the type of function defined by this executable element
    */
   FunctionType get type;
+  /**
+   * 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.
+   * @return {@code true} if this executable element is a static element
+   */
+  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 {
   /**
@@ -413,62 +512,68 @@
   LibraryElement get exportedLibrary;
 }
 /**
- * The interface {@code FieldElement} defines the behavior of elements representing a field defined
- * within a type. Note that explicitly defined fields implicitly define a synthetic getter and that
- * non-{@code final} explicitly defined fields implicitly define a synthetic setter. Symmetrically,
- * synthetic fields are implicitly created for explicitly defined getters and setters. The following
- * rules apply:
- * <ul>
- * <li>Every explicit field is represented by a non-synthetic {@link FieldElement}.
- * <li>Every explicit field induces a getter and possibly a setter, both of which are represented by
- * synthetic {@link PropertyAccessorElement}s.
- * <li>Every explicit getter or setter is represented by a non-synthetic{@link PropertyAccessorElement}.
- * <li>Every explicit getter or setter (or pair thereof if they have the same name) induces a field
- * that is represented by a synthetic {@link FieldElement}.
- * </ul>
+ * 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
+ * source file.
+ * @coverage dart.engine.element
  */
-abstract class FieldElement implements VariableElement {
+abstract class ExternalHtmlScriptElement implements HtmlScriptElement {
   /**
-   * Return the getter associated with this field. If this field was explicitly defined (is not
-   * synthetic) then the getter associated with it will be synthetic.
-   * @return the getter associated with this field
+   * Return the source referenced by this element, or {@code null} if this element does not
+   * reference a Dart library source file.
+   * @return the source for the external Dart library
    */
-  PropertyAccessorElement get getter;
+  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 setter associated with this field, or {@code null} if the field is effectively{@code final} and therefore does not have a setter associated with it. (This can happen either
-   * because the field is explicitly defined as being {@code final} or because the field is induced
-   * by an explicit getter that does not have a corresponding setter.) If this field was explicitly
-   * defined (is not synthetic) then the setter associated with it will be synthetic.
-   * @return the setter associated with this field
+   * Return the type in which this field is defined.
+   * @return the type in which this field is defined
    */
-  PropertyAccessorElement get setter;
-  /**
-   * Return {@code true} if this field is a static field.
-   * @return {@code true} if this field is a static field
-   */
-  bool isStatic();
+  ClassElement get enclosingElement;
 }
 /**
  * The interface {@code FunctionElement} defines the behavior of elements representing a function.
+ * @coverage dart.engine.element
  */
-abstract class FunctionElement implements ExecutableElement {
+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 a source range that covers the approximate portion of the source in which the name of
-   * this function is visible, or {@code null} if there is no single range of characters within
-   * which the variable's name is visible.
-   * <ul>
-   * <li>For a local function, this includes everything from the beginning of the function's body to
-   * the end of the block that encloses the function declaration.</li>
-   * <li>For top-level functions, {@code null} will be returned because they are potentially visible
-   * in multiple sources.</li>
-   * </ul>
-   * @return the range of characters in which the name of this function is visible
+   * Return the compilation unit in which this type alias is defined.
+   * @return the compilation unit in which this type alias is defined
    */
-  SourceRange get visibleRange;
+  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 {
   /**
@@ -480,19 +585,30 @@
 }
 /**
  * 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 libraries contained in or referenced from script tags in
-   * the HTML file. This includes libraries that are defined by the content of a script file as well
-   * as libraries that are referenced in the {@core src} attribute of a script tag.
-   * @return the libraries referenced from script tags in the HTML file
+   * Return an array containing all of the script elements contained in the HTML file. This includes
+   * scripts with libraries that are defined by the content of a script tag as well as libraries
+   * that are referenced in the {@core source} attribute of a script tag.
+   * @return the script elements in the HTML file (not {@code null}, contains no {@code null}s)
    */
-  List<LibraryElement> get libraries;
+  List<HtmlScriptElement> get scripts;
+}
+/**
+ * The interface {@code HtmlScriptElement} defines the behavior of elements representing a script
+ * tag in an HTML file.
+ * @see EmbeddedHtmlScriptElement
+ * @see ExternalHtmlScriptElement
+ * @coverage dart.engine.element
+ */
+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 {
   /**
@@ -520,6 +636,7 @@
 /**
  * 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 {
   /**
@@ -530,6 +647,7 @@
 }
 /**
  * The interface {@code LibraryElement} defines the behavior of elements representing a library.
+ * @coverage dart.engine.element
  */
 abstract class LibraryElement implements Element {
   /**
@@ -582,10 +700,54 @@
    * @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.
+   * @param timeStamp the time stamp to compare against
+   * @return {@code true} if this library is up to date with respect to the given time stamp
+   */
+  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
+   * the element name is visible.
+   * <ul>
+   * <li>For a local variable, this includes everything from the end of the variable's initializer
+   * to the end of the block that encloses the variable declaration.</li>
+   * <li>For a parameter, this includes the body of the method or function that declares the
+   * parameter.</li>
+   * <li>For a local function, this includes everything from the beginning of the function's body to
+   * the end of the block that encloses the function declaration.</li>
+   * <li>For top-level functions, {@code null} will be returned because they are potentially visible
+   * in multiple sources.</li>
+   * </ul>
+   * @return the range of characters in which the name of this element is visible
+   */
+  SourceRange get visibleRange;
+}
+/**
+ * The interface {@code LocalVariableElement} defines the behavior common to elements that represent
+ * a local variable.
+ * @coverage dart.engine.element
+ */
+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 {
   /**
@@ -599,12 +761,6 @@
    * @return {@code true} if this method is abstract
    */
   bool isAbstract();
-  /**
-   * Return {@code true} if this method is static. Methods are static if they have been marked as
-   * being static using the {@code static} modifier.
-   * @return {@code true} if this method is static
-   */
-  bool isStatic();
 }
 /**
  * The interface {@code MultiplyDefinedElement} defines the behavior of pseudo-elements that
@@ -612,6 +768,7 @@
  * is not allowed by the language, so objects implementing this interface always represent an error.
  * As a result, most of the normal operations on elements do not make sense and will return useless
  * results.
+ * @coverage dart.engine.element
  */
 abstract class MultiplyDefinedElement implements Element {
   /**
@@ -624,6 +781,7 @@
 /**
  * The interface {@code NamespaceCombinator} defines the behavior common to objects that control how
  * namespaces are combined.
+ * @coverage dart.engine.element
  */
 abstract class NamespaceCombinator {
   /**
@@ -634,8 +792,9 @@
 /**
  * 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 VariableElement {
+abstract class ParameterElement implements LocalElement, VariableElement {
   /**
    * Return the kind of this parameter.
    * @return the kind of this parameter
@@ -650,6 +809,7 @@
 /**
  * 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 {
   /**
@@ -676,14 +836,15 @@
  * <li>Every explicit getter or setter (or pair thereof if they have the same name) induces a field
  * that is represented by a synthetic {@link FieldElement}.
  * </ul>
+ * @coverage dart.engine.element
  */
 abstract class PropertyAccessorElement implements ExecutableElement {
   /**
-   * Return the field associated with this accessor. If this accessor was explicitly defined (is not
-   * synthetic) then the field associated with it will be synthetic.
-   * @return the field associated with this accessor
+   * 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
    */
-  FieldElement get field;
+  PropertyInducingElement get variable;
   /**
    * Return {@code true} if this accessor represents a getter.
    * @return {@code true} if this accessor represents a getter
@@ -696,8 +857,47 @@
   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
+ * variables implicitly define a synthetic getter and that non-{@code final} explicitly defined
+ * variables implicitly define a synthetic setter. Symmetrically, synthetic fields are implicitly
+ * created for explicitly defined getters and setters. The following rules apply:
+ * <ul>
+ * <li>Every explicit variable is represented by a non-synthetic {@link PropertyInducingElement}.
+ * <li>Every explicit variable induces a getter and possibly a setter, both of which are represented
+ * by synthetic {@link PropertyAccessorElement}s.
+ * <li>Every explicit getter or setter is represented by a non-synthetic{@link PropertyAccessorElement}.
+ * <li>Every explicit getter or setter (or pair thereof if they have the same name) induces a
+ * variable that is represented by a synthetic {@link PropertyInducingElement}.
+ * </ul>
+ * @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
+   * induced by an explicit getter that does not have a corresponding setter.) If this variable was
+   * explicitly defined (is not synthetic) then the setter associated with it will be synthetic.
+   * @return the setter associated with this variable
+   */
+  PropertyAccessorElement get setter;
+  /**
+   * Return {@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.
+   * @return {@code true} if this executable element is a static element
+   */
+  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 {
   /**
@@ -708,34 +908,16 @@
   List<String> get shownNames;
 }
 /**
- * The interface {@code TypeAliasElement} defines the behavior of elements representing a type alias
- * ({@code typedef}).
+ * The interface {@code TopLevelVariableElement} defines the behavior of elements representing a
+ * top-level variable.
+ * @coverage dart.engine.element
  */
-abstract class TypeAliasElement 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;
+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 {
   /**
@@ -755,12 +937,14 @@
  * names that are undefined. This situation is not allowed by the language, so objects implementing
  * this interface always represent an error. As a result, most of the normal operations on elements
  * do not make sense and will return useless results.
+ * @coverage dart.engine.element
  */
 abstract class UndefinedElement implements Element {
 }
 /**
  * The interface {@code VariableElement} defines the behavior common to elements that represent a
  * variable.
+ * @coverage dart.engine.element
  */
 abstract class VariableElement implements Element {
   /**
@@ -777,35 +961,239 @@
    */
   Type2 get type;
   /**
-   * Return a source range that covers the approximate portion of the source in which the name of
-   * this variable is visible, or {@code null} if there is no single range of characters within
-   * which the variable's name is visible.
-   * <ul>
-   * <li>For a local variable, this includes everything from the end of the variable's initializer
-   * to the end of the block that encloses the variable declaration.</li>
-   * <li>For a parameter, this includes the body of the method or function that declares the
-   * parameter.</li>
-   * <li>For fields and top-level variables, {@code null} will be returned because they are
-   * potentially visible in multiple sources.</li>
-   * </ul>
-   * @return the range of characters in which the name of this variable is visible
-   */
-  SourceRange get visibleRange;
-  /**
-   * Return {@code true} if this variable is a const variable. Variables are const if they have been
-   * marked as being const using the {@code const} modifier.
-   * @return {@code true} if this variable is a const variable
+   * 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 is a final variable. Variables are final if they have been
-   * marked as being final using either the {@code final} or {@code const} modifiers.
-   * @return {@code true} if this variable is a final variable
+   * 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
+   * final.
+   * @return {@code true} if this variable was declared with the 'final' modifier
    */
   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
+ * only will the visit method for that specific type of element be invoked, but additional methods
+ * for the supertypes of that element will also be invoked. For example, using an instance of this
+ * class to visit a {@link MethodElement} will cause the method{@link #visitMethodElement(MethodElement)} to be invoked but will also cause the methods{@link #visitExecutableElement(ExecutableElement)} and {@link #visitElement(Element)} to be
+ * subsequently invoked. This allows visitors to be written that visit all executable elements
+ * without needing to override the visit method for each of the specific subclasses of{@link ExecutableElement}.
+ * <p>
+ * Note, however, that unlike many visitors, element visitors visit objects based on the interfaces
+ * implemented by those elements. Because interfaces form a graph structure rather than a tree
+ * structure the way classes do, and because it is generally undesirable for an object to be visited
+ * more than once, this class flattens the interface graph into a pseudo-tree. In particular, this
+ * class treats elements as if the element types were structured in the following way:
+ * <p>
+ * <pre>
+ * Element
+ * ClassElement
+ * CompilationUnitElement
+ * ExecutableElement
+ * ConstructorElement
+ * LocalElement
+ * FunctionElement
+ * MethodElement
+ * PropertyAccessorElement
+ * ExportElement
+ * HtmlElement
+ * ImportElement
+ * LabelElement
+ * LibraryElement
+ * MultiplyDefinedElement
+ * PrefixElement
+ * TypeAliasElement
+ * TypeVariableElement
+ * UndefinedElement
+ * VariableElement
+ * PropertyInducingElement
+ * FieldElement
+ * TopLevelVariableElement
+ * LocalElement
+ * LocalVariableElement
+ * ParameterElement
+ * </pre>
+ * <p>
+ * Subclasses that override a visit method must either invoke the overridden visit method or
+ * explicitly invoke the more general visit method. Failure to do so will cause the visit methods
+ * for superclasses of the element to not be invoked and will cause the children of the visited node
+ * to not be visited.
+ * @coverage dart.engine.element
+ */
+class GeneralizingElementVisitor<R> implements ElementVisitor<R> {
+  R visitClassElement(ClassElement element) => visitElement(element);
+  R visitCompilationUnitElement(CompilationUnitElement element) => visitElement(element);
+  R visitConstructorElement(ConstructorElement element) => visitExecutableElement(element);
+  R visitElement(Element element) {
+    element.visitChildren(this);
+    return null;
+  }
+  R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element) => visitHtmlScriptElement(element);
+  R visitExecutableElement(ExecutableElement element) => visitElement(element);
+  R visitExportElement(ExportElement element) => visitElement(element);
+  R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element) => visitHtmlScriptElement(element);
+  R visitFieldElement(FieldElement element) => visitPropertyInducingElement(element);
+  R visitFunctionElement(FunctionElement element) => visitLocalElement(element);
+  R visitHtmlElement(HtmlElement element) => visitElement(element);
+  R visitHtmlScriptElement(HtmlScriptElement element) => visitElement(element);
+  R visitImportElement(ImportElement element) => visitElement(element);
+  R visitLabelElement(LabelElement element) => visitElement(element);
+  R visitLibraryElement(LibraryElement element) => visitElement(element);
+  R visitLocalElement(LocalElement element) {
+    if (element is LocalVariableElement) {
+      return visitVariableElement((element as LocalVariableElement));
+    } else if (element is ParameterElement) {
+      return visitVariableElement((element as ParameterElement));
+    } else if (element is FunctionElement) {
+      return visitExecutableElement((element as FunctionElement));
+    }
+    return null;
+  }
+  R visitLocalVariableElement(LocalVariableElement element) => visitLocalElement(element);
+  R visitMethodElement(MethodElement element) => visitExecutableElement(element);
+  R visitMultiplyDefinedElement(MultiplyDefinedElement element) => visitElement(element);
+  R visitParameterElement(ParameterElement element) => visitLocalElement(element);
+  R visitPrefixElement(PrefixElement element) => visitElement(element);
+  R visitPropertyAccessorElement(PropertyAccessorElement element) => visitExecutableElement(element);
+  R visitPropertyInducingElement(PropertyInducingElement element) => visitVariableElement(element);
+  R visitTopLevelVariableElement(TopLevelVariableElement element) => visitPropertyInducingElement(element);
+  R visitFunctionTypeAliasElement(FunctionTypeAliasElement element) => visitElement(element);
+  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
+ * class to visit a {@link CompilationUnitElement} will also cause all of the types in the
+ * compilation unit to be visited.
+ * <p>
+ * Subclasses that override a visit method must either invoke the overridden visit method or must
+ * explicitly ask the visited element to visit its children. Failure to do so will cause the
+ * children of the visited element to not be visited.
+ * @coverage dart.engine.element
+ */
+class RecursiveElementVisitor<R> implements ElementVisitor<R> {
+  R visitClassElement(ClassElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+  R visitCompilationUnitElement(CompilationUnitElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+  R visitConstructorElement(ConstructorElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+  R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+  R visitExportElement(ExportElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+  R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+  R visitFieldElement(FieldElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+  R visitFunctionElement(FunctionElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+  R visitHtmlElement(HtmlElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+  R visitImportElement(ImportElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+  R visitLabelElement(LabelElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+  R visitLibraryElement(LibraryElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+  R visitLocalVariableElement(LocalVariableElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+  R visitMethodElement(MethodElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+  R visitMultiplyDefinedElement(MultiplyDefinedElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+  R visitParameterElement(ParameterElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+  R visitPrefixElement(PrefixElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+  R visitPropertyAccessorElement(PropertyAccessorElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+  R visitTopLevelVariableElement(TopLevelVariableElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+  R visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+  R visitTypeVariableElement(TypeVariableElement element) {
+    element.visitChildren(this);
+    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
+ * visitor pattern primarily as a dispatch mechanism (and hence don't need to recursively visit a
+ * whole structure) and that only need to visit a small number of element types.
+ * @coverage dart.engine.element
+ */
+class SimpleElementVisitor<R> implements ElementVisitor<R> {
+  R visitClassElement(ClassElement element) => null;
+  R visitCompilationUnitElement(CompilationUnitElement element) => null;
+  R visitConstructorElement(ConstructorElement element) => null;
+  R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element) => null;
+  R visitExportElement(ExportElement element) => null;
+  R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element) => null;
+  R visitFieldElement(FieldElement element) => null;
+  R visitFunctionElement(FunctionElement element) => null;
+  R visitHtmlElement(HtmlElement element) => null;
+  R visitImportElement(ImportElement element) => null;
+  R visitLabelElement(LabelElement element) => null;
+  R visitLibraryElement(LibraryElement element) => null;
+  R visitLocalVariableElement(LocalVariableElement element) => null;
+  R visitMethodElement(MethodElement element) => null;
+  R visitMultiplyDefinedElement(MultiplyDefinedElement element) => null;
+  R visitParameterElement(ParameterElement element) => null;
+  R visitPrefixElement(PrefixElement element) => null;
+  R visitPropertyAccessorElement(PropertyAccessorElement element) => null;
+  R visitTopLevelVariableElement(TopLevelVariableElement element) => null;
+  R visitFunctionTypeAliasElement(FunctionTypeAliasElement 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 {
   /**
@@ -829,6 +1217,7 @@
 }
 /**
  * Instances of the class {@code ClassElementImpl} implement a {@code ClassElement}.
+ * @coverage dart.engine.element
  */
 class ClassElementImpl extends ElementImpl implements ClassElement {
   /**
@@ -878,36 +1267,37 @@
    */
   ClassElementImpl(Identifier name) : super.con1(name) {
   }
+  accept(ElementVisitor visitor) => visitor.visitClassElement(this);
   List<PropertyAccessorElement> get accessors => _accessors;
   List<InterfaceType> get allSupertypes {
     Collection<InterfaceType> list = new Set<InterfaceType>();
     collectAllSupertypes(list);
     return new List.from(list);
   }
-  ElementImpl getChild(String identifier19) {
+  ElementImpl getChild(String identifier25) {
     for (PropertyAccessorElement accessor in _accessors) {
-      if (((accessor as PropertyAccessorElementImpl)).identifier == identifier19) {
-        return (accessor as PropertyAccessorElementImpl);
+      if (((accessor as PropertyAccessorElementImpl)).identifier == identifier25) {
+        return accessor as PropertyAccessorElementImpl;
       }
     }
     for (ConstructorElement constructor in _constructors) {
-      if (((constructor as ConstructorElementImpl)).identifier == identifier19) {
-        return (constructor as ConstructorElementImpl);
+      if (((constructor as ConstructorElementImpl)).identifier == identifier25) {
+        return constructor as ConstructorElementImpl;
       }
     }
     for (FieldElement field in _fields) {
-      if (((field as FieldElementImpl)).identifier == identifier19) {
-        return (field as FieldElementImpl);
+      if (((field as FieldElementImpl)).identifier == identifier25) {
+        return field as FieldElementImpl;
       }
     }
     for (MethodElement method in _methods) {
-      if (((method as MethodElementImpl)).identifier == identifier19) {
-        return (method as MethodElementImpl);
+      if (((method as MethodElementImpl)).identifier == identifier25) {
+        return method as MethodElementImpl;
       }
     }
     for (TypeVariableElement typeVariable in _typeVariables) {
-      if (((typeVariable as TypeVariableElementImpl)).identifier == identifier19) {
-        return (typeVariable as TypeVariableElementImpl);
+      if (((typeVariable as TypeVariableElementImpl)).identifier == identifier25) {
+        return typeVariable as TypeVariableElementImpl;
       }
     }
     return null;
@@ -918,10 +1308,10 @@
   ElementKind get kind => ElementKind.CLASS;
   List<MethodElement> get methods => _methods;
   List<InterfaceType> get mixins => _mixins;
-  ConstructorElement getNamedConstructor(String name21) {
+  ConstructorElement getNamedConstructor(String name23) {
     for (ConstructorElement element in constructors) {
       String elementName = element.name;
-      if (elementName != null && elementName == name21) {
+      if (elementName != null && elementName == name23) {
         return element;
       }
     }
@@ -940,6 +1330,8 @@
     return null;
   }
   bool isAbstract() => hasModifier(Modifier.ABSTRACT);
+  bool isTypedef() => hasModifier(Modifier.TYPEDEF);
+  bool isValidMixin() => hasModifier(Modifier.MIXIN);
   PropertyAccessorElement lookUpGetter(String getterName, LibraryElement library) {
     PropertyAccessorElement element = getGetter(getterName);
     if (element != null && element.isAccessibleIn(library)) {
@@ -1088,8 +1480,15 @@
    * Set the type defined by the class to the given type.
    * @param type the type defined by the class
    */
-  void set type(InterfaceType type4) {
-    this._type = type4;
+  void set type(InterfaceType type5) {
+    this._type = type5;
+  }
+  /**
+   * 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
+   */
+  void set typedef(bool isTypedef) {
+    setModifier(Modifier.TYPEDEF, isTypedef);
   }
   /**
    * Set the type variables defined for this class to the given type variables.
@@ -1101,23 +1500,38 @@
     }
     this._typeVariables = typeVariables2;
   }
-  void appendTo(StringBuffer builder) {
+  /**
+   * 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
+   */
+  void set validMixin(bool isValidMixin) {
+    setModifier(Modifier.MIXIN, isValidMixin);
+  }
+  void visitChildren(ElementVisitor<Object> visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChildren(_accessors, visitor);
+    safelyVisitChildren(_constructors, visitor);
+    safelyVisitChildren(_fields, visitor);
+    safelyVisitChildren(_methods, visitor);
+    safelyVisitChildren(_typeVariables, visitor);
+  }
+  void appendTo(JavaStringBuilder builder) {
     String name11 = name;
     if (name11 == null) {
-      builder.add("{unnamed class}");
+      builder.append("{unnamed class}");
     } else {
-      builder.add(name11);
+      builder.append(name11);
     }
     int variableCount = _typeVariables.length;
     if (variableCount > 0) {
-      builder.add("<");
+      builder.append("<");
       for (int i = 0; i < variableCount; i++) {
         if (i > 0) {
-          builder.add(", ");
+          builder.append(", ");
         }
         ((_typeVariables[i] as TypeVariableElementImpl)).appendTo(builder);
       }
-      builder.add(">");
+      builder.append(">");
     }
   }
   void collectAllSupertypes(Collection<InterfaceType> list) {
@@ -1183,6 +1597,7 @@
 }
 /**
  * Instances of the class {@code CompilationUnitElementImpl} implement a{@link CompilationUnitElement}.
+ * @coverage dart.engine.element
  */
 class CompilationUnitElementImpl extends ElementImpl implements CompilationUnitElement {
   /**
@@ -1197,15 +1612,15 @@
   /**
    * An array containing all of the variables contained in this compilation unit.
    */
-  List<VariableElement> _variables = VariableElementImpl.EMPTY_ARRAY;
+  List<TopLevelVariableElement> _variables = TopLevelVariableElementImpl.EMPTY_ARRAY;
   /**
    * The source that corresponds to this compilation unit.
    */
   Source _source;
   /**
-   * An array containing all of the type aliases contained in this compilation unit.
+   * An array containing all of the function type aliases contained in this compilation unit.
    */
-  List<TypeAliasElement> _typeAliases = TypeAliasElementImpl.EMPTY_ARRAY;
+  List<FunctionTypeAliasElement> _typeAliases = FunctionTypeAliasElementImpl.EMPTY_ARRAY;
   /**
    * An array containing all of the types contained in this compilation unit.
    */
@@ -1220,44 +1635,45 @@
    */
   CompilationUnitElementImpl(String name) : super.con2(name, -1) {
   }
-  bool operator ==(Object object) => identical(this.runtimeType, object.runtimeType) && _source == ((object as CompilationUnitElementImpl)).source;
+  accept(ElementVisitor visitor) => visitor.visitCompilationUnitElement(this);
+  bool operator ==(Object object) => object != null && identical(runtimeType, object.runtimeType) && _source == ((object as CompilationUnitElementImpl)).source;
   List<PropertyAccessorElement> get accessors => _accessors;
-  ElementImpl getChild(String identifier20) {
+  ElementImpl getChild(String identifier26) {
     for (PropertyAccessorElement accessor in _accessors) {
-      if (((accessor as PropertyAccessorElementImpl)).identifier == identifier20) {
-        return (accessor as PropertyAccessorElementImpl);
+      if (((accessor as PropertyAccessorElementImpl)).identifier == identifier26) {
+        return accessor as PropertyAccessorElementImpl;
       }
     }
     for (VariableElement variable in _variables) {
-      if (((variable as VariableElementImpl)).identifier == identifier20) {
-        return (variable as VariableElementImpl);
+      if (((variable as VariableElementImpl)).identifier == identifier26) {
+        return variable as VariableElementImpl;
       }
     }
     for (ExecutableElement function in _functions) {
-      if (((function as ExecutableElementImpl)).identifier == identifier20) {
-        return (function as ExecutableElementImpl);
+      if (((function as ExecutableElementImpl)).identifier == identifier26) {
+        return function as ExecutableElementImpl;
       }
     }
-    for (TypeAliasElement typeAlias in _typeAliases) {
-      if (((typeAlias as TypeAliasElementImpl)).identifier == identifier20) {
-        return (typeAlias as TypeAliasElementImpl);
+    for (FunctionTypeAliasElement typeAlias in _typeAliases) {
+      if (((typeAlias as FunctionTypeAliasElementImpl)).identifier == identifier26) {
+        return typeAlias as FunctionTypeAliasElementImpl;
       }
     }
     for (ClassElement type in _types) {
-      if (((type as ClassElementImpl)).identifier == identifier20) {
-        return (type as ClassElementImpl);
+      if (((type as ClassElementImpl)).identifier == identifier26) {
+        return type as ClassElementImpl;
       }
     }
     return null;
   }
-  LibraryElement get enclosingElement => (super.enclosingElement as LibraryElement);
+  LibraryElement get enclosingElement => super.enclosingElement as LibraryElement;
   List<FunctionElement> get functions => _functions;
+  List<FunctionTypeAliasElement> get functionTypeAliases => _typeAliases;
   String get identifier => source.fullName;
   ElementKind get kind => ElementKind.COMPILATION_UNIT;
   Source get source => _source;
-  List<TypeAliasElement> get typeAliases => _typeAliases;
+  List<TopLevelVariableElement> get topLevelVariables => _variables;
   List<ClassElement> get types => _types;
-  List<VariableElement> get variables => _variables;
   int get hashCode => _source.hashCode;
   /**
    * Set the top-level accessors (getters and setters) contained in this compilation unit to the
@@ -1288,12 +1704,22 @@
     this._source = source5;
   }
   /**
-   * Set the type aliases contained in this compilation unit to the given type aliases.
-   * @param typeAliases the type aliases contained in this compilation unit
+   * 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
    */
-  void set typeAliases(List<TypeAliasElement> typeAliases2) {
-    for (TypeAliasElement typeAlias in typeAliases2) {
-      ((typeAlias as TypeAliasElementImpl)).enclosingElement = this;
+  void set topLevelVariables(List<TopLevelVariableElement> variables2) {
+    for (TopLevelVariableElement field in variables2) {
+      ((field as TopLevelVariableElementImpl)).enclosingElement = this;
+    }
+    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
+   */
+  void set typeAliases(List<FunctionTypeAliasElement> typeAliases2) {
+    for (FunctionTypeAliasElement typeAlias in typeAliases2) {
+      ((typeAlias as FunctionTypeAliasElementImpl)).enclosingElement = this;
     }
     this._typeAliases = typeAliases2;
   }
@@ -1307,26 +1733,105 @@
     }
     this._types = types2;
   }
-  /**
-   * Set the variables contained in this compilation unit to the given variables.
-   * @param variables the variables contained in this compilation unit
-   */
-  void set variables(List<VariableElement> variables2) {
-    for (VariableElement field in variables2) {
-      ((field as VariableElementImpl)).enclosingElement = this;
-    }
-    this._variables = variables2;
+  void visitChildren(ElementVisitor<Object> visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChildren(_accessors, visitor);
+    safelyVisitChildren(_functions, visitor);
+    safelyVisitChildren(_typeAliases, visitor);
+    safelyVisitChildren(_types, visitor);
+    safelyVisitChildren(_variables, visitor);
   }
-  void appendTo(StringBuffer builder) {
+  void appendTo(JavaStringBuilder builder) {
     if (_source == null) {
-      builder.add("{compilation unit}");
+      builder.append("{compilation unit}");
     } else {
-      builder.add(_source.fullName);
+      builder.append(_source.fullName);
     }
   }
 }
 /**
+ * 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
+   */
+  ConstFieldElementImpl(Identifier name) : super.con1(name) {
+  }
+  EvaluationResultImpl get evaluationResult => _result;
+  void set evaluationResult(EvaluationResultImpl result2) {
+    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
+   */
+  ConstLocalVariableElementImpl(Identifier name) : super(name) {
+  }
+  EvaluationResultImpl get evaluationResult => _result;
+  void set evaluationResult(EvaluationResultImpl result3) {
+    this._result = result3;
+  }
+}
+/**
+ * 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
+   */
+  ConstParameterElementImpl(Identifier name) : super(name) {
+  }
+  EvaluationResultImpl get evaluationResult => _result;
+  void set evaluationResult(EvaluationResultImpl result4) {
+    this._result = result4;
+  }
+}
+/**
+ * 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
+   */
+  ConstTopLevelVariableElementImpl(Identifier name) : super.con1(name) {
+  }
+  EvaluationResultImpl get evaluationResult => _result;
+  void set evaluationResult(EvaluationResultImpl result5) {
+    this._result = result5;
+  }
+}
+/**
  * Instances of the class {@code ConstructorElementImpl} implement a {@code ConstructorElement}.
+ * @coverage dart.engine.element
  */
 class ConstructorElementImpl extends ExecutableElementImpl implements ConstructorElement {
   /**
@@ -1339,10 +1844,19 @@
    */
   ConstructorElementImpl(Identifier name) : super.con1(name) {
   }
-  ClassElement get enclosingElement => (super.enclosingElement as ClassElement);
+  accept(ElementVisitor visitor) => visitor.visitConstructorElement(this);
+  ClassElement get enclosingElement => super.enclosingElement as ClassElement;
   ElementKind get kind => ElementKind.CONSTRUCTOR;
   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
+   */
+  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
@@ -1350,12 +1864,12 @@
   void set factory(bool isFactory) {
     setModifier(Modifier.FACTORY, isFactory);
   }
-  void appendTo(StringBuffer builder) {
-    builder.add(enclosingElement.name);
+  void appendTo(JavaStringBuilder builder) {
+    builder.append(enclosingElement.name);
     String name12 = name;
     if (name12 != null && !name12.isEmpty) {
-      builder.add(".");
-      builder.add(name12);
+      builder.append(".");
+      builder.append(name12);
     }
     super.appendTo(builder);
   }
@@ -1363,13 +1877,14 @@
 /**
  * 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);
+  static DynamicElementImpl get instance => DynamicTypeImpl.instance.element as DynamicElementImpl;
   /**
    * The type defined by this element.
    */
@@ -1382,6 +1897,7 @@
   DynamicElementImpl() : super.con2(Keyword.DYNAMIC.syntax, -1) {
     setModifier(Modifier.SYNTHETIC, true);
   }
+  accept(ElementVisitor visitor) => null;
   ElementKind get kind => ElementKind.DYNAMIC;
   /**
    * Return the type defined by this element.
@@ -1392,13 +1908,14 @@
    * Set the type defined by this element to the given type.
    * @param type the type defined by this element
    */
-  void set type(DynamicTypeImpl type5) {
-    this._type = type5;
+  void set type(DynamicTypeImpl type6) {
+    this._type = type6;
   }
 }
 /**
  * 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 {
   /**
@@ -1427,11 +1944,11 @@
    * Initialize a newly created element to have the given name.
    * @param name the name of this element
    */
-  ElementImpl.con1(Identifier name22) {
-    _jtd_constructor_135_impl(name22);
+  ElementImpl.con1(Identifier name24) {
+    _jtd_constructor_172_impl(name24);
   }
-  _jtd_constructor_135_impl(Identifier name22) {
-    _jtd_constructor_136_impl(name22 == null ? "" : name22.name, name22 == null ? -1 : name22.offset);
+  _jtd_constructor_172_impl(Identifier name24) {
+    _jtd_constructor_173_impl(name24 == null ? "" : name24.name, name24 == null ? -1 : name24.offset);
   }
   /**
    * Initialize a newly created element to have the given name.
@@ -1440,20 +1957,20 @@
    * declaration of this element
    */
   ElementImpl.con2(String name8, int nameOffset2) {
-    _jtd_constructor_136_impl(name8, nameOffset2);
+    _jtd_constructor_173_impl(name8, nameOffset2);
   }
-  _jtd_constructor_136_impl(String name8, int nameOffset2) {
+  _jtd_constructor_173_impl(String name8, int nameOffset2) {
     this._name = name8;
     this._nameOffset = nameOffset2;
     this._modifiers = new Set();
   }
-  bool operator ==(Object object) => object is Element && ((object as Element)).location == location;
+  bool operator ==(Object object) => object != null && identical(object.runtimeType, runtimeType) && ((object as Element)).location == location;
   Element getAncestor(Type elementClass) {
     Element ancestor = _enclosingElement;
     while (ancestor != null && !isInstanceOf(ancestor, elementClass)) {
       ancestor = ancestor.enclosingElement;
     }
-    return (ancestor as Element);
+    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.
@@ -1480,9 +1997,9 @@
     return _enclosingElement.source;
   }
   int get hashCode => location.hashCode;
-  bool isAccessibleIn(LibraryElement library18) {
+  bool isAccessibleIn(LibraryElement library21) {
     if (Identifier.isPrivateName(_name)) {
-      return library18 == library;
+      return library21 == library;
     }
     return true;
   }
@@ -1502,21 +2019,23 @@
     setModifier(Modifier.SYNTHETIC, isSynthetic);
   }
   String toString() {
-    StringBuffer builder = new StringBuffer();
+    JavaStringBuilder builder = new JavaStringBuilder();
     appendTo(builder);
     return builder.toString();
   }
+  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
    */
-  void appendTo(StringBuffer builder) {
+  void appendTo(JavaStringBuilder builder) {
     if (_name == null) {
-      builder.add("<unnamed ");
-      builder.add(runtimeType.toString());
-      builder.add(">");
+      builder.append("<unnamed ");
+      builder.append(runtimeType.toString());
+      builder.append(">");
     } else {
-      builder.add(_name);
+      builder.append(_name);
     }
   }
   /**
@@ -1532,6 +2051,28 @@
    */
   bool hasModifier(Modifier modifier) => _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
+   * @param visitor the visitor to be used to visit the child
+   */
+  void safelyVisitChild(Element child, ElementVisitor<Object> visitor) {
+    if (child != null) {
+      child.accept(visitor);
+    }
+  }
+  /**
+   * Use the given visitor to visit all of the children in the given array.
+   * @param children the children to be visited
+   * @param visitor the visitor being used to visit the children
+   */
+  void safelyVisitChildren(List<Element> children, ElementVisitor<Object> visitor) {
+    if (children != null) {
+      for (Element child in children) {
+        child.accept(visitor);
+      }
+    }
+  }
+  /**
    * Set the enclosing element of this element to the given element.
    * @param element the enclosing element of this element
    */
@@ -1554,6 +2095,7 @@
 }
 /**
  * Instances of the class {@code ElementLocationImpl} implement an {@link ElementLocation}.
+ * @coverage dart.engine.element
  */
 class ElementLocationImpl implements ElementLocation {
   /**
@@ -1569,9 +2111,9 @@
    * @param element the element whose location is being represented
    */
   ElementLocationImpl.con1(Element element) {
-    _jtd_constructor_137_impl(element);
+    _jtd_constructor_174_impl(element);
   }
-  _jtd_constructor_137_impl(Element element) {
+  _jtd_constructor_174_impl(Element element) {
     List<String> components = new List<String>();
     Element ancestor = element;
     while (ancestor != null) {
@@ -1585,16 +2127,16 @@
    * @param encoding the encoded form of a location
    */
   ElementLocationImpl.con2(String encoding) {
-    _jtd_constructor_138_impl(encoding);
+    _jtd_constructor_175_impl(encoding);
   }
-  _jtd_constructor_138_impl(String encoding) {
+  _jtd_constructor_175_impl(String encoding) {
     this._components = decode(encoding);
   }
   bool operator ==(Object object) {
     if (object is! ElementLocationImpl) {
       return false;
     }
-    ElementLocationImpl location = (object as ElementLocationImpl);
+    ElementLocationImpl location = object as ElementLocationImpl;
     return JavaArrays.equals(_components, location._components);
   }
   /**
@@ -1603,11 +2145,11 @@
    */
   List<String> get components => _components;
   String get encoding {
-    StringBuffer builder = new StringBuffer();
+    JavaStringBuilder builder = new JavaStringBuilder();
     int length2 = _components.length;
     for (int i = 0; i < length2; i++) {
       if (i > 0) {
-        builder.addCharCode(_SEPARATOR_CHAR);
+        builder.appendChar(_SEPARATOR_CHAR);
       }
       encode(builder, _components[i]);
     }
@@ -1622,22 +2164,22 @@
    */
   List<String> decode(String encoding) {
     List<String> components = new List<String>();
-    StringBuffer builder = new StringBuffer();
+    JavaStringBuilder builder = new JavaStringBuilder();
     int index = 0;
     int length3 = encoding.length;
     while (index < length3) {
       int currentChar = encoding.codeUnitAt(index);
       if (currentChar == _SEPARATOR_CHAR) {
         if (index + 1 < length3 && encoding.codeUnitAt(index + 1) == _SEPARATOR_CHAR) {
-          builder.addCharCode(_SEPARATOR_CHAR);
+          builder.appendChar(_SEPARATOR_CHAR);
           index += 2;
         } else {
           components.add(builder.toString());
-          builder.clear();
+          builder.length = 0;
           index++;
         }
       } else {
-        builder.addCharCode(currentChar);
+        builder.appendChar(currentChar);
         index++;
       }
     }
@@ -1651,25 +2193,56 @@
    * @param builder the builder to which the encoded component is to be appended
    * @param component the component to be appended to the builder
    */
-  void encode(StringBuffer builder, String component) {
+  void encode(JavaStringBuilder builder, String component) {
     int length4 = component.length;
     for (int i = 0; i < length4; i++) {
       int currentChar = component.codeUnitAt(i);
       if (currentChar == _SEPARATOR_CHAR) {
-        builder.addCharCode(_SEPARATOR_CHAR);
+        builder.appendChar(_SEPARATOR_CHAR);
       }
-      builder.addCharCode(currentChar);
+      builder.appendChar(currentChar);
     }
   }
 }
 /**
+ * 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})
+   */
+  EmbeddedHtmlScriptElementImpl(XmlTagNode node) : super(node) {
+  }
+  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
+   */
+  void set scriptLibrary(LibraryElementImpl scriptLibrary2) {
+    scriptLibrary2.enclosingElement = this;
+    this._scriptLibrary = scriptLibrary2;
+  }
+  void visitChildren(ElementVisitor<Object> visitor) {
+    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<ExecutableElement> _functions = EMPTY_ARRAY;
+  List<FunctionElement> _functions = FunctionElementImpl.EMPTY_ARRAY;
   /**
    * An array containing all of the labels defined within this executable element.
    */
@@ -1677,7 +2250,7 @@
   /**
    * An array containing all of the local variables defined within this executable element.
    */
-  List<VariableElement> _localVariables = VariableElementImpl.EMPTY_ARRAY;
+  List<LocalVariableElement> _localVariables = LocalVariableElementImpl.EMPTY_ARRAY;
   /**
    * An array containing all of the parameters defined by this executable element.
    */
@@ -1695,9 +2268,9 @@
    * @param name the name of this element
    */
   ExecutableElementImpl.con1(Identifier name) : super.con1(name) {
-    _jtd_constructor_139_impl(name);
+    _jtd_constructor_177_impl(name);
   }
-  _jtd_constructor_139_impl(Identifier name) {
+  _jtd_constructor_177_impl(Identifier name) {
   }
   /**
    * Initialize a newly created executable element to have the given name.
@@ -1706,45 +2279,45 @@
    * declaration of this element
    */
   ExecutableElementImpl.con2(String name, int nameOffset) : super.con2(name, nameOffset) {
-    _jtd_constructor_140_impl(name, nameOffset);
+    _jtd_constructor_178_impl(name, nameOffset);
   }
-  _jtd_constructor_140_impl(String name, int nameOffset) {
+  _jtd_constructor_178_impl(String name, int nameOffset) {
   }
-  ElementImpl getChild(String identifier21) {
+  ElementImpl getChild(String identifier27) {
     for (ExecutableElement function in _functions) {
-      if (((function as ExecutableElementImpl)).identifier == identifier21) {
-        return (function as ExecutableElementImpl);
+      if (((function as ExecutableElementImpl)).identifier == identifier27) {
+        return function as ExecutableElementImpl;
       }
     }
     for (LabelElement label in _labels) {
-      if (((label as LabelElementImpl)).identifier == identifier21) {
-        return (label as LabelElementImpl);
+      if (((label as LabelElementImpl)).identifier == identifier27) {
+        return label as LabelElementImpl;
       }
     }
     for (VariableElement variable in _localVariables) {
-      if (((variable as VariableElementImpl)).identifier == identifier21) {
-        return (variable as VariableElementImpl);
+      if (((variable as VariableElementImpl)).identifier == identifier27) {
+        return variable as VariableElementImpl;
       }
     }
     for (ParameterElement parameter in _parameters) {
-      if (((parameter as ParameterElementImpl)).identifier == identifier21) {
-        return (parameter as ParameterElementImpl);
+      if (((parameter as ParameterElementImpl)).identifier == identifier27) {
+        return parameter as ParameterElementImpl;
       }
     }
     return null;
   }
-  List<ExecutableElement> get functions => _functions;
+  List<FunctionElement> get functions => _functions;
   List<LabelElement> get labels => _labels;
-  List<VariableElement> get localVariables => _localVariables;
+  List<LocalVariableElement> get localVariables => _localVariables;
   List<ParameterElement> get parameters => _parameters;
   FunctionType get type => _type;
   /**
    * Set the functions defined within this executable element to the given functions.
    * @param functions the functions defined within this executable element
    */
-  void set functions(List<ExecutableElement> functions3) {
-    for (ExecutableElement function in functions3) {
-      ((function as ExecutableElementImpl)).enclosingElement = this;
+  void set functions(List<FunctionElement> functions3) {
+    for (FunctionElement function in functions3) {
+      ((function as FunctionElementImpl)).enclosingElement = this;
     }
     this._functions = functions3;
   }
@@ -1762,9 +2335,9 @@
    * Set the local variables defined within this executable element to the given variables.
    * @param localVariables the local variables defined within this executable element
    */
-  void set localVariables(List<VariableElement> localVariables2) {
-    for (VariableElement variable in localVariables2) {
-      ((variable as VariableElementImpl)).enclosingElement = this;
+  void set localVariables(List<LocalVariableElement> localVariables2) {
+    for (LocalVariableElement variable in localVariables2) {
+      ((variable as LocalVariableElementImpl)).enclosingElement = this;
     }
     this._localVariables = localVariables2;
   }
@@ -1782,27 +2355,35 @@
    * 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
    */
-  void set type(FunctionType type6) {
-    this._type = type6;
+  void set type(FunctionType type7) {
+    this._type = type7;
   }
-  void appendTo(StringBuffer builder) {
-    builder.add("(");
+  void visitChildren(ElementVisitor<Object> visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChildren(_functions, visitor);
+    safelyVisitChildren(_labels, visitor);
+    safelyVisitChildren(_localVariables, visitor);
+    safelyVisitChildren(_parameters, visitor);
+  }
+  void appendTo(JavaStringBuilder builder) {
+    builder.append("(");
     int parameterCount = _parameters.length;
     for (int i = 0; i < parameterCount; i++) {
       if (i > 0) {
-        builder.add(", ");
+        builder.append(", ");
       }
       ((_parameters[i] as ParameterElementImpl)).appendTo(builder);
     }
-    builder.add(")");
+    builder.append(")");
     if (_type != null) {
-      builder.add(" -> ");
-      builder.add(_type.returnType);
+      builder.append(" -> ");
+      builder.append(_type.returnType);
     }
   }
 }
 /**
  * Instances of the class {@code ExportElementImpl} implement an {@link ExportElement}.
+ * @coverage dart.engine.element
  */
 class ExportElementImpl extends ElementImpl implements ExportElement {
   /**
@@ -1819,6 +2400,7 @@
    */
   ExportElementImpl() : super.con1(null) {
   }
+  accept(ElementVisitor visitor) => visitor.visitExportElement(this);
   List<NamespaceCombinator> get combinators => _combinators;
   LibraryElement get exportedLibrary => _exportedLibrary;
   ElementKind get kind => ElementKind.EXPORT;
@@ -1838,23 +2420,42 @@
   void set exportedLibrary(LibraryElement exportedLibrary2) {
     this._exportedLibrary = exportedLibrary2;
   }
-  void appendTo(StringBuffer builder) {
-    builder.add("export ");
+  void appendTo(JavaStringBuilder builder) {
+    builder.append("export ");
     ((_exportedLibrary as LibraryElementImpl)).appendTo(builder);
   }
 }
 /**
- * Instances of the class {@code FieldElementImpl} implement a {@code FieldElement}.
+ * Instances of the class {@code ExternalHtmlScriptElementImpl} implement an{@link ExternalHtmlScriptElement}.
+ * @coverage dart.engine.element
  */
-class FieldElementImpl extends VariableElementImpl implements FieldElement {
+class ExternalHtmlScriptElementImpl extends HtmlScriptElementImpl implements ExternalHtmlScriptElement {
   /**
-   * The getter associated with this field.
+   * The source specified in the {@code source} attribute or {@code null} if unspecified.
    */
-  PropertyAccessorElement _getter;
+  Source _scriptSource;
   /**
-   * The setter associated with this field, or {@code null} if the field is effectively{@code final} and therefore does not have a setter associated with it.
+   * 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})
    */
-  PropertyAccessorElement _setter;
+  ExternalHtmlScriptElementImpl(XmlTagNode node) : super(node) {
+  }
+  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
+   */
+  void set scriptSource(Source scriptSource2) {
+    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.
    */
@@ -1864,39 +2465,24 @@
    * @param name the name of this element
    */
   FieldElementImpl.con1(Identifier name) : super.con1(name) {
-    _jtd_constructor_142_impl(name);
+    _jtd_constructor_181_impl(name);
   }
-  _jtd_constructor_142_impl(Identifier name) {
+  _jtd_constructor_181_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, -1) {
-    _jtd_constructor_143_impl(name);
+  FieldElementImpl.con2(String name) : super.con2(name) {
+    _jtd_constructor_182_impl(name);
   }
-  _jtd_constructor_143_impl(String name) {
-    synthetic = true;
+  _jtd_constructor_182_impl(String name) {
   }
-  PropertyAccessorElement get getter => _getter;
+  accept(ElementVisitor visitor) => visitor.visitFieldElement(this);
+  ClassElement get enclosingElement => super.enclosingElement as ClassElement;
   ElementKind get kind => ElementKind.FIELD;
-  PropertyAccessorElement get setter => _setter;
   bool isStatic() => hasModifier(Modifier.STATIC);
   /**
-   * Set the getter associated with this field to the given accessor.
-   * @param getter the getter associated with this field
-   */
-  void set getter(PropertyAccessorElement getter2) {
-    this._getter = getter2;
-  }
-  /**
-   * Set the setter associated with this field to the given accessor.
-   * @param setter the setter associated with this field
-   */
-  void set setter(PropertyAccessorElement setter2) {
-    this._setter = setter2;
-  }
-  /**
    * Set whether this field is static to correspond to the given value.
    * @param isStatic {@code true} if the field is static
    */
@@ -1906,6 +2492,7 @@
 }
 /**
  * Instances of the class {@code FunctionElementImpl} implement a {@code FunctionElement}.
+ * @coverage dart.engine.element
  */
 class FunctionElementImpl extends ExecutableElementImpl implements FunctionElement {
   /**
@@ -1925,9 +2512,9 @@
    * Initialize a newly created synthetic function element.
    */
   FunctionElementImpl() : super.con2("", -1) {
-    _jtd_constructor_144_impl();
+    _jtd_constructor_183_impl();
   }
-  _jtd_constructor_144_impl() {
+  _jtd_constructor_183_impl() {
     synthetic = true;
   }
   /**
@@ -1935,10 +2522,11 @@
    * @param name the name of this element
    */
   FunctionElementImpl.con1(Identifier name) : super.con1(name) {
-    _jtd_constructor_145_impl(name);
+    _jtd_constructor_184_impl(name);
   }
-  _jtd_constructor_145_impl(Identifier name) {
+  _jtd_constructor_184_impl(Identifier name) {
   }
+  accept(ElementVisitor visitor) => visitor.visitFunctionElement(this);
   String get identifier => name;
   ElementKind get kind => ElementKind.FUNCTION;
   SourceRange get visibleRange {
@@ -1947,6 +2535,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.
@@ -1958,16 +2547,126 @@
     _visibleRangeOffset = offset;
     _visibleRangeLength = length;
   }
-  void appendTo(StringBuffer builder) {
+  void appendTo(JavaStringBuilder builder) {
     String name13 = name;
     if (name13 != null) {
-      builder.add(name13);
+      builder.append(name13);
     }
     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
+   */
+  FunctionTypeAliasElementImpl(Identifier name) : super.con1(name) {
+  }
+  accept(ElementVisitor visitor) => visitor.visitFunctionTypeAliasElement(this);
+  ElementImpl getChild(String identifier28) {
+    for (VariableElement parameter in _parameters) {
+      if (((parameter as VariableElementImpl)).identifier == identifier28) {
+        return parameter as VariableElementImpl;
+      }
+    }
+    for (TypeVariableElement typeVariable in _typeVariables) {
+      if (((typeVariable as TypeVariableElementImpl)).identifier == identifier28) {
+        return typeVariable as TypeVariableElementImpl;
+      }
+    }
+    return null;
+  }
+  CompilationUnitElement get enclosingElement => super.enclosingElement as CompilationUnitElement;
+  ElementKind get kind => ElementKind.FUNCTION_TYPE_ALIAS;
+  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
+   */
+  void set parameters(List<ParameterElement> parameters8) {
+    if (parameters8 != null) {
+      for (ParameterElement parameter in parameters8) {
+        ((parameter as ParameterElementImpl)).enclosingElement = this;
+      }
+    }
+    this._parameters = parameters8;
+  }
+  /**
+   * 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
+   */
+  void set type(FunctionType type8) {
+    this._type = type8;
+  }
+  /**
+   * Set the type variables defined for this type to the given variables.
+   * @param typeVariables the type variables defined for this type
+   */
+  void set typeVariables(List<TypeVariableElement> typeVariables3) {
+    for (TypeVariableElement variable in typeVariables3) {
+      ((variable as TypeVariableElementImpl)).enclosingElement = this;
+    }
+    this._typeVariables = typeVariables3;
+  }
+  void visitChildren(ElementVisitor<Object> visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChildren(_parameters, visitor);
+    safelyVisitChildren(_typeVariables, visitor);
+  }
+  void appendTo(JavaStringBuilder builder) {
+    builder.append("typedef ");
+    builder.append(name);
+    int variableCount = _typeVariables.length;
+    if (variableCount > 0) {
+      builder.append("<");
+      for (int i = 0; i < variableCount; i++) {
+        if (i > 0) {
+          builder.append(", ");
+        }
+        ((_typeVariables[i] as TypeVariableElementImpl)).appendTo(builder);
+      }
+      builder.append(">");
+    }
+    builder.append("(");
+    int parameterCount = _parameters.length;
+    for (int i = 0; i < parameterCount; i++) {
+      if (i > 0) {
+        builder.append(", ");
+      }
+      ((_parameters[i] as ParameterElementImpl)).appendTo(builder);
+    }
+    builder.append(")");
+    if (_type != null) {
+      builder.append(" -> ");
+      builder.append(_type.returnType);
+    }
+  }
+}
+/**
  * Instances of the class {@code ShowCombinatorImpl} implement a {@link ShowCombinator}.
+ * @coverage dart.engine.element
  */
 class HideCombinatorImpl implements HideCombinator {
   /**
@@ -1990,20 +2689,21 @@
     this._hiddenNames = hiddenNames2;
   }
   String toString() {
-    StringBuffer builder = new StringBuffer();
-    builder.add("show ");
+    JavaStringBuilder builder = new JavaStringBuilder();
+    builder.append("show ");
     int count = _hiddenNames.length;
     for (int i = 0; i < count; i++) {
       if (i > 0) {
-        builder.add(", ");
+        builder.append(", ");
       }
-      builder.add(_hiddenNames[i]);
+      builder.append(_hiddenNames[i]);
     }
     return builder.toString();
   }
 }
 /**
  * Instances of the class {@code HtmlElementImpl} implement an {@link HtmlElement}.
+ * @coverage dart.engine.element
  */
 class HtmlElementImpl extends ElementImpl implements HtmlElement {
   /**
@@ -2015,9 +2715,9 @@
    */
   AnalysisContext _context;
   /**
-   * The libraries contained in or referenced from script tags in the HTML file.
+   * The scripts contained in or referenced from script tags in the HTML file.
    */
-  List<LibraryElement> _libraries = LibraryElementImpl.EMPTY_ARRAY;
+  List<HtmlScriptElement> _scripts = HtmlScriptElementImpl.EMPTY_ARRAY;
   /**
    * The source that corresponds to this HTML file.
    */
@@ -2030,19 +2730,22 @@
   HtmlElementImpl(AnalysisContext context, String name) : super.con2(name, -1) {
     this._context = context;
   }
-  bool operator ==(Object object) => identical(this.runtimeType, object.runtimeType) && _source == ((object as CompilationUnitElementImpl)).source;
+  accept(ElementVisitor visitor) => visitor.visitHtmlElement(this);
+  bool operator ==(Object object) => identical(runtimeType, object.runtimeType) && _source == ((object as CompilationUnitElementImpl)).source;
   AnalysisContext get context => _context;
   ElementKind get kind => ElementKind.HTML;
-  List<LibraryElement> get libraries => _libraries;
+  List<HtmlScriptElement> get scripts => _scripts;
   Source get source => _source;
   int get hashCode => _source.hashCode;
   /**
-   * Set the libraries contained in or referenced from script tags in the HTML file to the given
-   * libraries.
-   * @param libraries the libraries contained in or referenced from script tags in the HTML file
+   * Set the scripts contained in the HTML file to the given scripts.
+   * @param scripts the scripts
    */
-  void set libraries(List<LibraryElement> libraries2) {
-    this._libraries = libraries2;
+  void set scripts(List<HtmlScriptElement> scripts2) {
+    for (HtmlScriptElement script in scripts2) {
+      ((script as HtmlScriptElementImpl)).enclosingElement = this;
+    }
+    this._scripts = scripts2;
   }
   /**
    * Set the source that corresponds to this HTML file to the given source.
@@ -2051,16 +2754,37 @@
   void set source(Source source6) {
     this._source = source6;
   }
-  void appendTo(StringBuffer builder) {
+  void visitChildren(ElementVisitor<Object> visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChildren(_scripts, visitor);
+  }
+  void appendTo(JavaStringBuilder builder) {
     if (_source == null) {
-      builder.add("{HTML file}");
+      builder.append("{HTML file}");
     } else {
-      builder.add(_source.fullName);
+      builder.append(_source.fullName);
     }
   }
 }
 /**
+ * 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})
+   */
+  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 {
   /**
@@ -2082,6 +2806,7 @@
    */
   ImportElementImpl() : super.con1(null) {
   }
+  accept(ElementVisitor visitor) => visitor.visitImportElement(this);
   List<NamespaceCombinator> get combinators => _combinators;
   LibraryElement get importedLibrary => _importedLibrary;
   ElementKind get kind => ElementKind.IMPORT;
@@ -2109,13 +2834,18 @@
   void set prefix(PrefixElement prefix3) {
     this._prefix = prefix3;
   }
-  void appendTo(StringBuffer builder) {
-    builder.add("import ");
+  void visitChildren(ElementVisitor<Object> visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChild(_prefix, visitor);
+  }
+  void appendTo(JavaStringBuilder builder) {
+    builder.append("import ");
     ((_importedLibrary as LibraryElementImpl)).appendTo(builder);
   }
 }
 /**
  * Instances of the class {@code LabelElementImpl} implement a {@code LabelElement}.
+ * @coverage dart.engine.element
  */
 class LabelElementImpl extends ElementImpl implements LabelElement {
   /**
@@ -2140,7 +2870,8 @@
     this._onSwitchStatement = onSwitchStatement;
     this._onSwitchMember = onSwitchMember;
   }
-  ExecutableElement get enclosingElement => (super.enclosingElement as ExecutableElement);
+  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}).
@@ -2155,6 +2886,7 @@
 }
 /**
  * Instances of the class {@code LibraryElementImpl} implement a {@code LibraryElement}.
+ * @coverage dart.engine.element
  */
 class LibraryElementImpl extends ElementImpl implements LibraryElement {
   /**
@@ -2162,6 +2894,36 @@
    */
   static List<LibraryElement> EMPTY_ARRAY = new List<LibraryElement>(0);
   /**
+   * Determine if the given library is up to date with respect to the given time stamp.
+   * @param library the library to process
+   * @param timeStamp the time stamp to check against
+   * @param visitedLibraries the set of visited libraries
+   */
+  static bool isUpToDate(LibraryElement library, int timeStamp, Set<LibraryElement> visitedLibraries) {
+    if (!visitedLibraries.contains(library)) {
+      javaSetAdd(visitedLibraries, library);
+      if (timeStamp < library.definingCompilationUnit.source.modificationStamp) {
+        return false;
+      }
+      for (CompilationUnitElement element in library.parts) {
+        if (timeStamp < element.source.modificationStamp) {
+          return false;
+        }
+      }
+      for (LibraryElement importedLibrary in library.importedLibraries) {
+        if (!isUpToDate(importedLibrary, timeStamp, visitedLibraries)) {
+          return false;
+        }
+      }
+      for (LibraryElement exportedLibrary in library.exportedLibraries) {
+        if (!isUpToDate(exportedLibrary, timeStamp, visitedLibraries)) {
+          return false;
+        }
+      }
+    }
+    return true;
+  }
+  /**
    * The analysis context in which this library is defined.
    */
   AnalysisContext _context;
@@ -2193,14 +2955,15 @@
   LibraryElementImpl(AnalysisContext context, LibraryIdentifier name) : super.con1(name) {
     this._context = context;
   }
-  bool operator ==(Object object) => identical(this.runtimeType, object.runtimeType) && _definingCompilationUnit == ((object as LibraryElementImpl)).definingCompilationUnit;
-  ElementImpl getChild(String identifier22) {
-    if (((_definingCompilationUnit as CompilationUnitElementImpl)).identifier == identifier22) {
-      return (_definingCompilationUnit as CompilationUnitElementImpl);
+  accept(ElementVisitor visitor) => visitor.visitLibraryElement(this);
+  bool operator ==(Object object) => object != null && identical(runtimeType, object.runtimeType) && _definingCompilationUnit == ((object as LibraryElementImpl)).definingCompilationUnit;
+  ElementImpl getChild(String identifier29) {
+    if (((_definingCompilationUnit as CompilationUnitElementImpl)).identifier == identifier29) {
+      return _definingCompilationUnit as CompilationUnitElementImpl;
     }
     for (CompilationUnitElement part in _parts) {
-      if (((part as CompilationUnitElementImpl)).identifier == identifier22) {
-        return (part as CompilationUnitElementImpl);
+      if (((part as CompilationUnitElementImpl)).identifier == identifier29) {
+        return part as CompilationUnitElementImpl;
       }
     }
     return null;
@@ -2241,6 +3004,11 @@
   }
   int get hashCode => _definingCompilationUnit.hashCode;
   bool isBrowserApplication() => _entryPoint != null && isOrImportsBrowserLibrary();
+  bool isDartCore() => name == "dart.core";
+  bool isUpToDate2(int timeStamp) {
+    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
@@ -2254,7 +3022,6 @@
    * @param entryPoint the entry point for this library
    */
   void set entryPoint(FunctionElement entryPoint2) {
-    ((entryPoint2 as FunctionElementImpl)).enclosingElement = this;
     this._entryPoint = entryPoint2;
   }
   /**
@@ -2262,6 +3029,9 @@
    * @param exports the specifications of all of the exports defined in this library
    */
   void set exports(List<ExportElement> exports2) {
+    for (ExportElement exportElement in exports2) {
+      ((exportElement as ExportElementImpl)).enclosingElement = this;
+    }
     this._exports = exports2;
   }
   /**
@@ -2269,6 +3039,13 @@
    * @param imports the specifications of all of the imports defined in this library
    */
   void set imports(List<ImportElement> imports2) {
+    for (ImportElement importElement in imports2) {
+      ((importElement as ImportElementImpl)).enclosingElement = this;
+      PrefixElementImpl prefix5 = importElement.prefix as PrefixElementImpl;
+      if (prefix5 != null) {
+        prefix5.enclosingElement = this;
+      }
+    }
     this._imports = imports2;
   }
   /**
@@ -2281,18 +3058,25 @@
     }
     this._parts = parts2;
   }
+  void visitChildren(ElementVisitor<Object> visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChild(_definingCompilationUnit, visitor);
+    safelyVisitChildren(_exports, visitor);
+    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
    */
   bool isOrImportsBrowserLibrary() {
-    List<LibraryElement> visited = new List<LibraryElement>(10);
-    Source htmlLibSource = definingCompilationUnit.source.resolve(DartSdk.DART_HTML);
+    List<LibraryElement> visited = new List<LibraryElement>();
+    Source htmlLibSource = definingCompilationUnit.source.resolve("dart:html");
     visited.add(this);
     for (int index = 0; index < visited.length; index++) {
       LibraryElement library = visited[index];
-      Source source8 = library.definingCompilationUnit.source;
-      if (source8 == htmlLibSource) {
+      Source source10 = library.definingCompilationUnit.source;
+      if (source10 == htmlLibSource) {
         return true;
       }
       for (LibraryElement importedLibrary in library.importedLibraries) {
@@ -2310,7 +3094,57 @@
   }
 }
 /**
+ * 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
+   */
+  LocalVariableElementImpl(Identifier name) : super.con1(name) {
+  }
+  accept(ElementVisitor visitor) => visitor.visitLocalVariableElement(this);
+  ElementKind get kind => ElementKind.LOCAL_VARIABLE;
+  SourceRange get visibleRange {
+    if (_visibleRangeLength < 0) {
+      return null;
+    }
+    return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
+  }
+  /**
+   * Set the visible range for this element to the range starting at the given offset with the given
+   * length.
+   * @param offset the offset to the beginning of the visible range for this element
+   * @param length the length of the visible range for this element, or {@code -1} if this element
+   * does not have a visible range
+   */
+  void setVisibleRange(int offset, int length) {
+    _visibleRangeOffset = offset;
+    _visibleRangeLength = length;
+  }
+  void appendTo(JavaStringBuilder builder) {
+    builder.append(type);
+    builder.append(" ");
+    builder.append(name);
+  }
+}
+/**
  * Instances of the class {@code MethodElementImpl} implement a {@code MethodElement}.
+ * @coverage dart.engine.element
  */
 class MethodElementImpl extends ExecutableElementImpl implements MethodElement {
   /**
@@ -2322,9 +3156,9 @@
    * @param name the name of this element
    */
   MethodElementImpl.con1(Identifier name) : super.con1(name) {
-    _jtd_constructor_151_impl(name);
+    _jtd_constructor_193_impl(name);
   }
-  _jtd_constructor_151_impl(Identifier name) {
+  _jtd_constructor_193_impl(Identifier name) {
   }
   /**
    * Initialize a newly created method element to have the given name.
@@ -2333,11 +3167,12 @@
    * declaration of this element
    */
   MethodElementImpl.con2(String name, int nameOffset) : super.con2(name, nameOffset) {
-    _jtd_constructor_152_impl(name, nameOffset);
+    _jtd_constructor_194_impl(name, nameOffset);
   }
-  _jtd_constructor_152_impl(String name, int nameOffset) {
+  _jtd_constructor_194_impl(String name, int nameOffset) {
   }
-  ClassElement get enclosingElement => (super.enclosingElement as ClassElement);
+  accept(ElementVisitor visitor) => visitor.visitMethodElement(this);
+  ClassElement get enclosingElement => super.enclosingElement as ClassElement;
   ElementKind get kind => ElementKind.METHOD;
   bool isAbstract() => hasModifier(Modifier.ABSTRACT);
   bool isStatic() => hasModifier(Modifier.STATIC);
@@ -2355,16 +3190,17 @@
   void set static(bool isStatic) {
     setModifier(Modifier.STATIC, isStatic);
   }
-  void appendTo(StringBuffer builder) {
-    builder.add(enclosingElement.name);
-    builder.add(".");
-    builder.add(name);
+  void appendTo(JavaStringBuilder builder) {
+    builder.append(enclosingElement.name);
+    builder.append(".");
+    builder.append(name);
     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.
+ * @coverage dart.engine.element
  */
 class Modifier {
   static final Modifier ABSTRACT = new Modifier('ABSTRACT', 0);
@@ -2373,12 +3209,15 @@
   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 SETTER = new Modifier('SETTER', 6);
-  static final Modifier STATIC = new Modifier('STATIC', 7);
-  static final Modifier SYNTHETIC = new Modifier('SYNTHETIC', 8);
-  static final List<Modifier> values = [ABSTRACT, CONST, FACTORY, FINAL, GETTER, INITIALIZING_FORMAL, SETTER, STATIC, SYNTHETIC];
+  static final Modifier MIXIN = new Modifier('MIXIN', 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) {
   }
   String toString() => __name;
@@ -2386,6 +3225,7 @@
 /**
  * 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 {
   /**
@@ -2410,6 +3250,7 @@
     _name = firstElement.name;
     _conflictingElements = computeConflictingElements(firstElement, secondElement);
   }
+  accept(ElementVisitor visitor) => visitor.visitMultiplyDefinedElement(this);
   Element getAncestor(Type elementClass) => null;
   List<Element> get conflictingElements => _conflictingElements;
   AnalysisContext get context => _context;
@@ -2431,18 +3272,20 @@
   }
   bool isSynthetic() => true;
   String toString() {
-    StringBuffer builder = new StringBuffer();
-    builder.add("[");
+    JavaStringBuilder builder = new JavaStringBuilder();
+    builder.append("[");
     int count = _conflictingElements.length;
     for (int i = 0; i < count; i++) {
       if (i > 0) {
-        builder.add(", ");
+        builder.append(", ");
       }
       ((_conflictingElements[i] as ElementImpl)).appendTo(builder);
     }
-    builder.add("]");
+    builder.append("]");
     return builder.toString();
   }
+  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.
@@ -2475,6 +3318,7 @@
 }
 /**
  * Instances of the class {@code ParameterElementImpl} implement a {@code ParameterElement}.
+ * @coverage dart.engine.element
  */
 class ParameterElementImpl extends VariableElementImpl implements ParameterElement {
   /**
@@ -2482,6 +3326,15 @@
    */
   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);
@@ -2491,8 +3344,15 @@
    */
   ParameterElementImpl(Identifier name) : super.con1(name) {
   }
+  accept(ElementVisitor visitor) => visitor.visitParameterElement(this);
   ElementKind get kind => ElementKind.PARAMETER;
   ParameterKind get parameterKind => _parameterKind;
+  SourceRange get visibleRange {
+    if (_visibleRangeLength < 0) {
+      return null;
+    }
+    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.
@@ -2508,17 +3368,29 @@
   void set parameterKind(ParameterKind parameterKind2) {
     this._parameterKind = parameterKind2;
   }
-  void appendTo(StringBuffer builder) {
-    builder.add(type);
-    builder.add(" ");
-    builder.add(name);
-    builder.add(" (");
-    builder.add(kind);
-    builder.add(")");
+  /**
+   * Set the visible range for this element to the range starting at the given offset with the given
+   * length.
+   * @param offset the offset to the beginning of the visible range for this element
+   * @param length the length of the visible range for this element, or {@code -1} if this element
+   * does not have a visible range
+   */
+  void setVisibleRange(int offset, int length) {
+    _visibleRangeOffset = offset;
+    _visibleRangeLength = length;
+  }
+  void appendTo(JavaStringBuilder builder) {
+    builder.append(type);
+    builder.append(" ");
+    builder.append(name);
+    builder.append(" (");
+    builder.append(kind);
+    builder.append(")");
   }
 }
 /**
  * Instances of the class {@code PrefixElementImpl} implement a {@code PrefixElement}.
+ * @coverage dart.engine.element
  */
 class PrefixElementImpl extends ElementImpl implements PrefixElement {
   /**
@@ -2535,7 +3407,8 @@
    */
   PrefixElementImpl(Identifier name) : super.con1(name) {
   }
-  LibraryElement get enclosingElement => (super.enclosingElement as LibraryElement);
+  accept(ElementVisitor visitor) => visitor.visitPrefixElement(this);
+  LibraryElement get enclosingElement => super.enclosingElement as LibraryElement;
   List<LibraryElement> get importedLibraries => _importedLibraries;
   ElementKind get kind => ElementKind.PREFIX;
   /**
@@ -2548,60 +3421,57 @@
     }
     this._importedLibraries = importedLibraries2;
   }
-  void appendTo(StringBuffer builder) {
-    builder.add("as ");
+  void appendTo(JavaStringBuilder builder) {
+    builder.append("as ");
     super.appendTo(builder);
   }
 }
 /**
  * Instances of the class {@code PropertyAccessorElementImpl} implement a{@code PropertyAccessorElement}.
+ * @coverage dart.engine.element
  */
 class PropertyAccessorElementImpl extends ExecutableElementImpl implements PropertyAccessorElement {
   /**
-   * The field associated with this accessor.
+   * The variable associated with this accessor.
    */
-  FieldElement _field;
+  PropertyInducingElement _variable;
   /**
    * An empty array of property accessor elements.
    */
   static List<PropertyAccessorElement> EMPTY_ARRAY = new List<PropertyAccessorElement>(0);
   /**
-   * Initialize a newly created synthetic property accessor element to be associated with the given
-   * field.
-   * @param name the name of this element
-   */
-  PropertyAccessorElementImpl.con1(FieldElementImpl field2) : super.con2(field2.name, -1) {
-    _jtd_constructor_157_impl(field2);
-  }
-  _jtd_constructor_157_impl(FieldElementImpl field2) {
-    this._field = field2;
-    synthetic = true;
-  }
-  /**
    * Initialize a newly created property accessor element to have the given name.
    * @param name the name of this element
    */
-  PropertyAccessorElementImpl.con2(Identifier name) : super.con1(name) {
-    _jtd_constructor_158_impl(name);
+  PropertyAccessorElementImpl.con1(Identifier name) : super.con1(name) {
+    _jtd_constructor_199_impl(name);
   }
-  _jtd_constructor_158_impl(Identifier name) {
+  _jtd_constructor_199_impl(Identifier name) {
   }
-  FieldElement get field => _field;
+  /**
+   * 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_200_impl(variable2);
+  }
+  _jtd_constructor_200_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());
   ElementKind get kind {
     if (isGetter()) {
       return ElementKind.GETTER;
     }
     return ElementKind.SETTER;
   }
+  PropertyInducingElement get variable => _variable;
   bool isGetter() => hasModifier(Modifier.GETTER);
   bool isSetter() => hasModifier(Modifier.SETTER);
-  /**
-   * Set the field associated with this accessor to the given field.
-   * @param field the field associated with this accessor
-   */
-  void set field(FieldElement field3) {
-    this._field = field3;
-  }
+  bool isStatic() => variable.isStatic();
   /**
    * Set whether this accessor is a getter to correspond to the given value.
    * @param isGetter {@code true} if the accessor is a getter
@@ -2616,14 +3486,75 @@
   void set setter(bool isSetter) {
     setModifier(Modifier.SETTER, isSetter);
   }
-  void appendTo(StringBuffer builder) {
-    builder.add(isGetter() ? "get " : "set ");
-    builder.add(field.name);
+  /**
+   * Set the variable associated with this accessor to the given variable.
+   * @param variable the variable associated with this accessor
+   */
+  void set variable(PropertyInducingElement variable3) {
+    this._variable = variable3;
+  }
+  void appendTo(JavaStringBuilder builder) {
+    builder.append(isGetter() ? "get " : "set ");
+    builder.append(variable.name);
     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_201_impl(name);
+  }
+  _jtd_constructor_201_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_202_impl(name);
+  }
+  _jtd_constructor_202_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
+   */
+  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
+   */
+  void set setter(PropertyAccessorElement setter2) {
+    this._setter = setter2;
+  }
+}
+/**
  * Instances of the class {@code ShowCombinatorImpl} implement a {@link ShowCombinator}.
+ * @coverage dart.engine.element
  */
 class ShowCombinatorImpl implements ShowCombinator {
   /**
@@ -2646,122 +3577,52 @@
     this._shownNames = shownNames2;
   }
   String toString() {
-    StringBuffer builder = new StringBuffer();
-    builder.add("show ");
+    JavaStringBuilder builder = new JavaStringBuilder();
+    builder.append("show ");
     int count = _shownNames.length;
     for (int i = 0; i < count; i++) {
       if (i > 0) {
-        builder.add(", ");
+        builder.append(", ");
       }
-      builder.add(_shownNames[i]);
+      builder.append(_shownNames[i]);
     }
     return builder.toString();
   }
 }
 /**
- * Instances of the class {@code TypeAliasElementImpl} implement a {@code TypeAliasElement}.
+ * Instances of the class {@code TopLevelVariableElementImpl} implement a{@code TopLevelVariableElement}.
+ * @coverage dart.engine.element
  */
-class TypeAliasElementImpl extends ElementImpl implements TypeAliasElement {
+class TopLevelVariableElementImpl extends PropertyInducingElementImpl implements TopLevelVariableElement {
   /**
-   * An array containing all of the parameters defined by this type alias.
+   * An empty array of top-level variable elements.
    */
-  List<ParameterElement> _parameters = ParameterElementImpl.EMPTY_ARRAY;
+  static List<TopLevelVariableElement> EMPTY_ARRAY = new List<TopLevelVariableElement>(0);
   /**
-   * 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<TypeAliasElement> EMPTY_ARRAY = new List<TypeAliasElement>(0);
-  /**
-   * Initialize a newly created type alias element to have the given name.
+   * Initialize a newly created top-level variable element to have the given name.
    * @param name the name of this element
    */
-  TypeAliasElementImpl(Identifier name) : super.con1(name) {
+  TopLevelVariableElementImpl.con1(Identifier name) : super.con1(name) {
+    _jtd_constructor_204_impl(name);
   }
-  ElementImpl getChild(String identifier23) {
-    for (VariableElement parameter in _parameters) {
-      if (((parameter as VariableElementImpl)).identifier == identifier23) {
-        return (parameter as VariableElementImpl);
-      }
-    }
-    for (TypeVariableElement typeVariable in _typeVariables) {
-      if (((typeVariable as TypeVariableElementImpl)).identifier == identifier23) {
-        return (typeVariable as TypeVariableElementImpl);
-      }
-    }
-    return null;
-  }
-  CompilationUnitElement get enclosingElement => (super.enclosingElement as CompilationUnitElement);
-  ElementKind get kind => ElementKind.TYPE_ALIAS;
-  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
-   */
-  void set parameters(List<ParameterElement> parameters8) {
-    if (parameters8 != null) {
-      for (ParameterElement parameter in parameters8) {
-        ((parameter as ParameterElementImpl)).enclosingElement = this;
-      }
-    }
-    this._parameters = parameters8;
+  _jtd_constructor_204_impl(Identifier name) {
   }
   /**
-   * 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
+   * Initialize a newly created synthetic top-level variable element to have the given name.
+   * @param name the name of this element
    */
-  void set type(FunctionType type7) {
-    this._type = type7;
+  TopLevelVariableElementImpl.con2(String name) : super.con2(name) {
+    _jtd_constructor_205_impl(name);
   }
-  /**
-   * Set the type variables defined for this type to the given variables.
-   * @param typeVariables the type variables defined for this type
-   */
-  void set typeVariables(List<TypeVariableElement> typeVariables3) {
-    for (TypeVariableElement variable in typeVariables3) {
-      ((variable as TypeVariableElementImpl)).enclosingElement = this;
-    }
-    this._typeVariables = typeVariables3;
+  _jtd_constructor_205_impl(String name) {
   }
-  void appendTo(StringBuffer builder) {
-    builder.add("typedef ");
-    builder.add(name);
-    int variableCount = _typeVariables.length;
-    if (variableCount > 0) {
-      builder.add("<");
-      for (int i = 0; i < variableCount; i++) {
-        if (i > 0) {
-          builder.add(", ");
-        }
-        ((_typeVariables[i] as TypeVariableElementImpl)).appendTo(builder);
-      }
-      builder.add(">");
-    }
-    builder.add("(");
-    int parameterCount = _parameters.length;
-    for (int i = 0; i < parameterCount; i++) {
-      if (i > 0) {
-        builder.add(", ");
-      }
-      ((_parameters[i] as ParameterElementImpl)).appendTo(builder);
-    }
-    builder.add(")");
-    if (_type != null) {
-      builder.add(" -> ");
-      builder.add(_type.returnType);
-    }
-  }
+  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 {
   /**
@@ -2783,6 +3644,7 @@
    */
   TypeVariableElementImpl(Identifier name) : super.con1(name) {
   }
+  accept(ElementVisitor visitor) => visitor.visitTypeVariableElement(this);
   Type2 get bound => _bound;
   ElementKind get kind => ElementKind.TYPE_VARIABLE;
   TypeVariableType get type => _type;
@@ -2797,21 +3659,22 @@
    * Set the type defined by this type variable to the given type
    * @param type the type defined by this type variable
    */
-  void set type(TypeVariableType type8) {
-    this._type = type8;
+  void set type(TypeVariableType type9) {
+    this._type = type9;
   }
-  void appendTo(StringBuffer builder) {
-    builder.add(name);
+  void appendTo(JavaStringBuilder builder) {
+    builder.append(name);
     if (_bound != null) {
-      builder.add(" extends ");
-      builder.add(_bound);
+      builder.append(" extends ");
+      builder.append(_bound);
     }
   }
 }
 /**
  * Instances of the class {@code VariableElementImpl} implement a {@code VariableElement}.
+ * @coverage dart.engine.element
  */
-class VariableElementImpl extends ElementImpl implements VariableElement {
+abstract class VariableElementImpl extends ElementImpl implements VariableElement {
   /**
    * The declared type of this variable.
    */
@@ -2822,15 +3685,6 @@
    */
   FunctionElement _initializer;
   /**
-   * 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 variable elements.
    */
   static List<VariableElement> EMPTY_ARRAY = new List<VariableElement>(0);
@@ -2839,9 +3693,9 @@
    * @param name the name of this element
    */
   VariableElementImpl.con1(Identifier name) : super.con1(name) {
-    _jtd_constructor_162_impl(name);
+    _jtd_constructor_207_impl(name);
   }
-  _jtd_constructor_162_impl(Identifier name) {
+  _jtd_constructor_207_impl(Identifier name) {
   }
   /**
    * Initialize a newly created variable element to have the given name.
@@ -2850,29 +3704,37 @@
    * declaration of this element
    */
   VariableElementImpl.con2(String name, int nameOffset) : super.con2(name, nameOffset) {
-    _jtd_constructor_163_impl(name, nameOffset);
+    _jtd_constructor_208_impl(name, nameOffset);
   }
-  _jtd_constructor_163_impl(String name, int nameOffset) {
+  _jtd_constructor_208_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
+   * initializer.
+   * @return the result of evaluating this variable's initializer
+   */
+  EvaluationResultImpl get evaluationResult => null;
   FunctionElement get initializer => _initializer;
-  ElementKind get kind => ElementKind.VARIABLE;
   Type2 get type => _type;
-  SourceRange get visibleRange {
-    if (_visibleRangeLength < 0) {
-      return null;
-    }
-    return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
-  }
   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
    */
-  void set const2(bool isConst) {
+  void set const3(bool isConst) {
     setModifier(Modifier.CONST, isConst);
   }
   /**
+   * Set the result of evaluating this variable's initializer as a compile-time constant expression
+   * to the given result.
+   * @param result the result of evaluating this variable's initializer
+   */
+  void set evaluationResult(EvaluationResultImpl result) {
+    throw new IllegalStateException("Invalid attempt to set a compile-time constant result");
+  }
+  /**
    * Set whether this variable is final to correspond to the given value.
    * @param isFinal {@code true} if the variable is final
    */
@@ -2893,28 +3755,22 @@
    * Set the declared type of this variable to the given type.
    * @param type the declared type of this variable
    */
-  void set type(Type2 type9) {
-    this._type = type9;
+  void set type(Type2 type10) {
+    this._type = type10;
   }
-  /**
-   * Set the visible range for this element to the range starting at the given offset with the given
-   * length.
-   * @param offset the offset to the beginning of the visible range for this element
-   * @param length the length of the visible range for this element, or {@code -1} if this element
-   * does not have a visible range
-   */
-  void setVisibleRange(int offset, int length) {
-    _visibleRangeOffset = offset;
-    _visibleRangeLength = length;
+  void visitChildren(ElementVisitor<Object> visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChild(_initializer, visitor);
   }
-  void appendTo(StringBuffer builder) {
-    builder.add(type);
-    builder.add(" ");
-    builder.add(name);
+  void appendTo(JavaStringBuilder builder) {
+    builder.append(type);
+    builder.append(" ");
+    builder.append(name);
   }
 }
 /**
  * The unique instance of the class {@code BottomTypeImpl} implements the type {@code bottom}.
+ * @coverage dart.engine.type
  */
 class BottomTypeImpl extends TypeImpl {
   /**
@@ -2939,6 +3795,7 @@
 }
 /**
  * The unique instance of the class {@code DynamicTypeImpl} implements the type {@code dynamic}.
+ * @coverage dart.engine.type
  */
 class DynamicTypeImpl extends TypeImpl {
   /**
@@ -2957,25 +3814,28 @@
     ((element as DynamicElementImpl)).type = this;
   }
   bool operator ==(Object object) => object is DynamicTypeImpl;
+  bool isDynamic() => true;
   bool isMoreSpecificThan(Type2 type) => false;
-  bool isSubtypeOf(Type2 type) => false;
+  bool isSubtypeOf(Type2 type) => identical(this, type);
   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 types in the first array are equal to the corresponding types
-   * in the second array.
-   * @param firstTypes the first array of types being compared
-   * @param secondTypes the second array of types being compared
-   * @return {@code true} if all of the types in the first array are equal to the corresponding
-   * types in the second array
+   * 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
+   * entries in the same order in which those entries were added to the map.
+   * @param firstTypes the first map of name/type pairs being compared
+   * @param secondTypes the second map of name/type pairs being compared
+   * @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
    */
-  static bool equals2(LinkedHashMap<String, Type2> firstTypes, LinkedHashMap<String, Type2> secondTypes) {
+  static bool equals2(Map<String, Type2> firstTypes, Map<String, Type2> secondTypes) {
     if (secondTypes.length != firstTypes.length) {
       return false;
     }
@@ -2999,7 +3859,10 @@
    * @param parameterTypes the parameter types for the substitution
    * @return the result of performing the substitution on each of the types
    */
-  static LinkedHashMap<String, Type2> substitute3(LinkedHashMap<String, Type2> types, List<Type2> argumentTypes, List<Type2> parameterTypes) {
+  static Map<String, Type2> substitute3(Map<String, Type2> types, List<Type2> argumentTypes, List<Type2> parameterTypes) {
+    if (types.isEmpty) {
+      return types;
+    }
     LinkedHashMap<String, Type2> newTypes = new LinkedHashMap<String, Type2>();
     for (MapEntry<String, Type2> entry in getMapEntrySet(types)) {
       newTypes[entry.getKey()] = entry.getValue().substitute2(argumentTypes, parameterTypes);
@@ -3025,7 +3888,7 @@
    * A table mapping the names of named parameters to the types of the named parameters of this type
    * of function.
    */
-  LinkedHashMap<String, Type2> _namedParameterTypes = new LinkedHashMap<String, Type2>();
+  Map<String, Type2> _namedParameterTypes = new Map();
   /**
    * The type of object returned by this type of function.
    */
@@ -3036,25 +3899,25 @@
    * @param element the element representing the declaration of the function type
    */
   FunctionTypeImpl.con1(ExecutableElement element) : super(element, element == null ? null : element.name) {
-    _jtd_constructor_209_impl(element);
+    _jtd_constructor_259_impl(element);
   }
-  _jtd_constructor_209_impl(ExecutableElement element) {
+  _jtd_constructor_259_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(TypeAliasElement element) : super(element, element == null ? null : element.name) {
-    _jtd_constructor_210_impl(element);
+  FunctionTypeImpl.con2(FunctionTypeAliasElement element) : super(element, element == null ? null : element.name) {
+    _jtd_constructor_260_impl(element);
   }
-  _jtd_constructor_210_impl(TypeAliasElement element) {
+  _jtd_constructor_260_impl(FunctionTypeAliasElement element) {
   }
   bool operator ==(Object object) {
     if (object is! FunctionTypeImpl) {
       return false;
     }
-    FunctionTypeImpl otherType = (object as FunctionTypeImpl);
+    FunctionTypeImpl otherType = object as FunctionTypeImpl;
     return element == otherType.element && JavaArrays.equals(_normalParameterTypes, otherType._normalParameterTypes) && JavaArrays.equals(_optionalParameterTypes, otherType._optionalParameterTypes) && equals2(_namedParameterTypes, otherType._namedParameterTypes);
   }
   Map<String, Type2> get namedParameterTypes => _namedParameterTypes;
@@ -3063,20 +3926,24 @@
   Type2 get returnType => _returnType;
   List<Type2> get typeArguments => _typeArguments;
   int get hashCode {
-    Element element34 = element;
-    if (element34 == null) {
+    Element element40 = element;
+    if (element40 == null) {
       return 0;
     }
-    return element34.hashCode;
+    return element40.hashCode;
   }
   bool isSubtypeOf(Type2 type) {
-    if (type == null || type is! FunctionType) {
+    if (type == null) {
       return false;
-    } else if (identical(this, type) || this == type) {
+    } else if (identical(this, type) || type.isDynamic() || type.isDartCoreFunction()) {
+      return true;
+    } else if (type is! FunctionType) {
+      return false;
+    } else if (this == type) {
       return true;
     }
     FunctionType t = this;
-    FunctionType s = (type as FunctionType);
+    FunctionType s = type as FunctionType;
     if (t.normalParameterTypes.length != s.normalParameterTypes.length) {
       return false;
     } else if (t.normalParameterTypes.length > 0) {
@@ -3174,21 +4041,21 @@
     if (argumentTypes.length == 0) {
       return this;
     }
-    Element element35 = element;
-    FunctionTypeImpl newType = (element35 is ExecutableElement) ? new FunctionTypeImpl.con1((element35 as ExecutableElement)) : new FunctionTypeImpl.con2((element35 as TypeAliasElement));
+    Element element41 = element;
+    FunctionTypeImpl newType = (element41 is ExecutableElement) ? new FunctionTypeImpl.con1((element41 as ExecutableElement)) : new FunctionTypeImpl.con2((element41 as FunctionTypeAliasElement));
     newType.returnType = _returnType.substitute2(argumentTypes, parameterTypes);
     newType.normalParameterTypes = TypeImpl.substitute(_normalParameterTypes, argumentTypes, parameterTypes);
     newType.optionalParameterTypes = TypeImpl.substitute(_optionalParameterTypes, argumentTypes, parameterTypes);
-    newType.namedParameterTypes = substitute3(_namedParameterTypes, argumentTypes, parameterTypes);
+    newType._namedParameterTypes = substitute3(_namedParameterTypes, argumentTypes, parameterTypes);
     return newType;
   }
-  void appendTo(StringBuffer builder) {
-    builder.add("(");
+  void appendTo(JavaStringBuilder builder) {
+    builder.append("(");
     bool needsComma = false;
     if (_normalParameterTypes.length > 0) {
       for (Type2 type in _normalParameterTypes) {
         if (needsComma) {
-          builder.add(", ");
+          builder.append(", ");
         } else {
           needsComma = true;
         }
@@ -3197,48 +4064,53 @@
     }
     if (_optionalParameterTypes.length > 0) {
       if (needsComma) {
-        builder.add(", ");
+        builder.append(", ");
         needsComma = false;
       }
-      builder.add("[");
+      builder.append("[");
       for (Type2 type in _optionalParameterTypes) {
         if (needsComma) {
-          builder.add(", ");
+          builder.append(", ");
         } else {
           needsComma = true;
         }
         ((type as TypeImpl)).appendTo(builder);
       }
-      builder.add("]");
+      builder.append("]");
       needsComma = true;
     }
     if (_namedParameterTypes.length > 0) {
       if (needsComma) {
-        builder.add(", ");
+        builder.append(", ");
         needsComma = false;
       }
-      builder.add("{");
+      builder.append("{");
       for (MapEntry<String, Type2> entry in getMapEntrySet(_namedParameterTypes)) {
         if (needsComma) {
-          builder.add(", ");
+          builder.append(", ");
         } else {
           needsComma = true;
         }
-        builder.add(entry.getKey());
-        builder.add(": ");
+        builder.append(entry.getKey());
+        builder.append(": ");
         ((entry.getValue() as TypeImpl)).appendTo(builder);
       }
-      builder.add("}");
+      builder.append("}");
       needsComma = true;
     }
-    builder.add(") -> ");
-    ((_returnType as TypeImpl)).appendTo(builder);
+    builder.append(") -> ");
+    if (_returnType == null) {
+      builder.append("null");
+    } else {
+      ((_returnType as TypeImpl)).appendTo(builder);
+    }
   }
 }
 /**
  * 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
  * type.
+ * @coverage dart.engine.type
  */
 class InterfaceTypeImpl extends TypeImpl implements InterfaceType {
   /**
@@ -3303,9 +4175,9 @@
    * @see #getLeastUpperBound(Type)
    */
   static Set<InterfaceType> computeSuperinterfaceSet2(InterfaceType type, Set<InterfaceType> set) {
-    Element element36 = type.element;
-    if (element36 != null && element36 is ClassElement) {
-      ClassElement classElement = (element36 as ClassElement);
+    Element element42 = type.element;
+    if (element42 != null && element42 is ClassElement) {
+      ClassElement classElement = element42 as ClassElement;
       List<InterfaceType> superinterfaces = classElement.interfaces;
       for (InterfaceType superinterface in superinterfaces) {
         javaSetAdd(set, superinterface);
@@ -3328,9 +4200,9 @@
    * @param element the element representing the declaration of the type
    */
   InterfaceTypeImpl.con1(ClassElement element) : super(element, element.name) {
-    _jtd_constructor_211_impl(element);
+    _jtd_constructor_261_impl(element);
   }
-  _jtd_constructor_211_impl(ClassElement element) {
+  _jtd_constructor_261_impl(ClassElement element) {
   }
   /**
    * Initialize a newly created type to have the given name. This constructor should only be used in
@@ -3338,18 +4210,18 @@
    * @param name the name of the type
    */
   InterfaceTypeImpl.con2(String name) : super(null, name) {
-    _jtd_constructor_212_impl(name);
+    _jtd_constructor_262_impl(name);
   }
-  _jtd_constructor_212_impl(String name) {
+  _jtd_constructor_262_impl(String name) {
   }
   bool operator ==(Object object) {
     if (object is! InterfaceTypeImpl) {
       return false;
     }
-    InterfaceTypeImpl otherType = (object as InterfaceTypeImpl);
+    InterfaceTypeImpl otherType = object as InterfaceTypeImpl;
     return element == otherType.element && JavaArrays.equals(_typeArguments, otherType._typeArguments);
   }
-  ClassElement get element => (super.element as ClassElement);
+  ClassElement get element => super.element as ClassElement;
   Type2 getLeastUpperBound(Type2 type) {
     Type2 dynamicType = DynamicTypeImpl.instance;
     if (identical(this, dynamicType) || identical(type, dynamicType)) {
@@ -3359,7 +4231,7 @@
       return null;
     }
     InterfaceType i = this;
-    InterfaceType j = (type as InterfaceType);
+    InterfaceType j = type as InterfaceType;
     Set<InterfaceType> si = computeSuperinterfaceSet(i);
     Set<InterfaceType> sj = computeSuperinterfaceSet(j);
     javaSetAdd(si, i);
@@ -3367,7 +4239,7 @@
     si.retainAll(sj);
     Set<InterfaceType> s = si;
     List<InterfaceType> sn = new List.from(s);
-    List<int> depths = new List<int>(sn.length);
+    List<int> depths = new List<int>.filled(sn.length, 0);
     int maxDepth = 0;
     for (int n = 0; n < sn.length; n++) {
       depths[n] = computeLongestInheritancePathToObject(sn[n]);
@@ -3396,11 +4268,18 @@
   }
   List<Type2> get typeArguments => _typeArguments;
   int get hashCode {
-    ClassElement element37 = element;
-    if (element37 == null) {
+    ClassElement element43 = element;
+    if (element43 == null) {
       return 0;
     }
-    return element37.hashCode;
+    return element43.hashCode;
+  }
+  bool isDartCoreFunction() {
+    ClassElement element44 = element;
+    if (element44 == null) {
+      return false;
+    }
+    return element44.name == "Function" && element44.library.isDartCore();
   }
   bool isDirectSupertypeOf(InterfaceType type) {
     ClassElement i = element;
@@ -3431,7 +4310,7 @@
     } else if (type is! InterfaceType) {
       return false;
     }
-    InterfaceType s = (type as InterfaceType);
+    InterfaceType s = type as InterfaceType;
     if (this == s) {
       return true;
     }
@@ -3469,7 +4348,7 @@
       return true;
     }
     InterfaceType typeT = this;
-    InterfaceType typeS = (type as InterfaceType);
+    InterfaceType typeS = type as InterfaceType;
     ClassElement elementT = element;
     if (elementT == null) {
       return false;
@@ -3527,24 +4406,25 @@
     newType.typeArguments = TypeImpl.substitute(_typeArguments, argumentTypes, parameterTypes);
     return newType;
   }
-  void appendTo(StringBuffer builder) {
-    builder.add(name);
+  void appendTo(JavaStringBuilder builder) {
+    builder.append(name);
     int argumentCount = _typeArguments.length;
     if (argumentCount > 0) {
-      builder.add("<");
+      builder.append("<");
       for (int i = 0; i < argumentCount; i++) {
         if (i > 0) {
-          builder.add(", ");
+          builder.append(", ");
         }
         ((_typeArguments[i] as TypeImpl)).appendTo(builder);
       }
-      builder.add(">");
+      builder.append(">");
     }
   }
 }
 /**
  * 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 {
   /**
@@ -3557,6 +4437,9 @@
    */
   static List<Type2> substitute(List<Type2> types, List<Type2> argumentTypes, List<Type2> parameterTypes) {
     int length6 = types.length;
+    if (length6 == 0) {
+      return types;
+    }
     List<Type2> newTypes = new List<Type2>(length6);
     for (int i = 0; i < length6; i++) {
       newTypes[i] = types[i].substitute2(argumentTypes, parameterTypes);
@@ -3589,10 +4472,13 @@
   Type2 getLeastUpperBound(Type2 type) => null;
   String get name => _name;
   bool isAssignableTo(Type2 type) => this.isSubtypeOf(type) || type.isSubtypeOf(this);
+  bool isDartCoreFunction() => false;
+  bool isDynamic() => false;
   bool isMoreSpecificThan(Type2 type) => false;
   bool isSupertypeOf(Type2 type) => type.isSubtypeOf(this);
+  bool isVoid() => false;
   String toString() {
-    StringBuffer builder = new StringBuffer();
+    JavaStringBuilder builder = new JavaStringBuilder();
     appendTo(builder);
     return builder.toString();
   }
@@ -3600,17 +4486,18 @@
    * Append a textual representation of this type to the given builder.
    * @param builder the builder to which the text is to be appended
    */
-  void appendTo(StringBuffer builder) {
+  void appendTo(JavaStringBuilder builder) {
     if (_name == null) {
-      builder.add("<unnamed type>");
+      builder.append("<unnamed type>");
     } else {
-      builder.add(_name);
+      builder.append(_name);
     }
   }
 }
 /**
  * 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 {
   /**
@@ -3635,7 +4522,7 @@
   TypeVariableTypeImpl(TypeVariableElement element) : super(element, element.name) {
   }
   bool operator ==(Object object) => object is TypeVariableTypeImpl && element == ((object as TypeVariableTypeImpl)).element;
-  TypeVariableElement get element => (super.element as TypeVariableElement);
+  TypeVariableElement get element => super.element as TypeVariableElement;
   int get hashCode => element.hashCode;
   bool isMoreSpecificThan(Type2 type) {
     Type2 upperBound = element.bound;
@@ -3654,6 +4541,7 @@
 }
 /**
  * The unique instance of the class {@code VoidTypeImpl} implements the type {@code void}.
+ * @coverage dart.engine.type
  */
 class VoidTypeImpl extends TypeImpl implements VoidType {
   /**
@@ -3672,6 +4560,7 @@
   }
   bool operator ==(Object object) => identical(object, this);
   bool isSubtypeOf(Type2 type) => identical(type, this) || identical(type, DynamicTypeImpl.instance);
+  bool isVoid() => true;
   VoidTypeImpl substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes) => this;
 }
 /**
@@ -3687,6 +4576,7 @@
  * <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 {
   /**
@@ -3801,6 +4691,7 @@
 /**
  * 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 {
   ClassElement get element;
@@ -3892,6 +4783,7 @@
 /**
  * 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 {
   /**
@@ -3923,6 +4815,18 @@
    */
   bool isAssignableTo(Type2 type);
   /**
+   * Return {@code true} if this type represents the type 'Function' defined in the dart:core
+   * library.
+   * @return {@code true} if this type represents the type 'Function' defined in the dart:core
+   * 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
@@ -3942,6 +4846,11 @@
    */
   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
    * <i>[x<sub>1</sub>, ..., x<sub>n</sub>/y<sub>1</sub>, ..., y<sub>n</sub>]E</i> denotes a copy of
@@ -3958,13 +4867,15 @@
 /**
  * The interface {@code TypeVariableType} defines the behavior of objects representing the type
  * introduced by a type variable.
+ * @coverage dart.engine.type
  */
 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
  */
 abstract class VoidType implements Type2 {
   VoidType substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes);
-}
+}
\ No newline at end of file
diff --git a/pkg/analyzer_experimental/lib/src/generated/engine.dart b/pkg/analyzer_experimental/lib/src/generated/engine.dart
new file mode 100644
index 0000000..f782870
--- /dev/null
+++ b/pkg/analyzer_experimental/lib/src/generated/engine.dart
@@ -0,0 +1,1051 @@
+// This code was auto-generated, is not intended to be edited, and is subject to
+// significant change. Please see the README file for more information.
+
+library engine;
+
+import 'java_core.dart';
+import 'java_engine.dart';
+import 'dart:collection' show HasNextIterator;
+import 'error.dart';
+import 'source.dart';
+import 'scanner.dart' show Token, CharBufferScanner, StringScanner;
+import 'ast.dart' show CompilationUnit, Directive, PartOfDirective;
+import 'parser.dart' show Parser;
+import 'element.dart';
+import 'resolver.dart' show Namespace, NamespaceBuilder, LibraryResolver;
+import 'html.dart' show HtmlScanner, HtmlScanResult, HtmlParser, HtmlParseResult;
+
+/**
+ * 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
+   * @return {@code true} if the given file name is assumed to contain Dart source code
+   */
+  static bool isDartFileName(String fileName) {
+    if (fileName == null) {
+      return false;
+    }
+    return javaStringEqualsIgnoreCase(FileNameUtilities.getExtension(fileName), SUFFIX_DART);
+  }
+  /**
+   * Return {@code true} if the given file name is assumed to contain HTML.
+   * @param fileName the name of the file being tested
+   * @return {@code true} if the given file name is assumed to contain HTML
+   */
+  static bool isHtmlFileName(String fileName) {
+    if (fileName == null) {
+      return false;
+    }
+    String extension = FileNameUtilities.getExtension(fileName);
+    return javaStringEqualsIgnoreCase(extension, SUFFIX_HTML) || javaStringEqualsIgnoreCase(extension, SUFFIX_HTM);
+  }
+  /**
+   * The logger that should receive information about errors within the analysis engine.
+   */
+  Logger _logger = Logger.NULL;
+  /**
+   * 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
+   */
+  AnalysisContext createAnalysisContext() => new AnalysisContextImpl();
+  /**
+   * Return the logger that should receive information about errors within the analysis engine.
+   * @return the logger that should receive information about errors within the analysis engine
+   */
+  Logger get logger => _logger;
+  /**
+   * Set the logger that should receive information about errors within the analysis engine to the
+   * given logger.
+   * @param logger the logger that should receive information about errors within the analysis
+   * engine
+   */
+  void set logger(Logger logger2) {
+    this._logger = logger2 == null ? Logger.NULL : logger2;
+  }
+}
+/**
+ * The interface {@code AnalysisContext} defines the behavior of objects that represent a context in
+ * which analysis can be performed. The context includes such information as the version of the SDK
+ * being analyzed against as well as the package-root used to resolve 'package:' URI's. (The latter
+ * is included indirectly through the {@link SourceFactory source factory}.)
+ * <p>
+ * Analysis engine allows for having more than one context. This can be used, for example, to
+ * perform one analysis based on the state of files on disk and a separate analysis based on the
+ * state of those files in open editors. It can also be used to perform an analysis based on a
+ * proposed future state, such as the state after a refactoring.
+ */
+abstract class AnalysisContext {
+  /**
+   * Respond to the given set of changes by removing any cached information that might now be
+   * out-of-date. The result indicates what operations need to be performed as a result of this
+   * change without actually performing those operations.
+   * @param changeSet a description of the changes that have occurred
+   * @return a result (not {@code null}) indicating operations to be performed
+   */
+  ChangeResult changed(ChangeSet changeSet);
+  /**
+   * Clear any cached information that is dependent on resolution. This method should be invoked if
+   * the assumptions used by resolution have changed but the contents of the file have not changed.
+   * Use {@link #sourceChanged(Source)} and {@link #sourcesDeleted(SourceContainer)} to indicate
+   * when the contents of a file or files have changed.
+   */
+  void clearResolution();
+  /**
+   * Call this method when this context is no longer going to be used. At this point, the receiver
+   * may choose to push some of its information back into the global cache for consumption by
+   * another context for performance.
+   */
+  void discard();
+  /**
+   * Create a new context in which analysis can be performed. Any sources in the specified directory
+   * in the receiver will be removed from the receiver and added to the newly created context.
+   * @param directory the directory (not {@code null}) containing sources that should be removed
+   * from the receiver and added to the returned context
+   * @return the analysis context that was created (not {@code null})
+   */
+  AnalysisContext extractAnalysisContext(SourceContainer container);
+  /**
+   * Return the element referenced by the given location.
+   * @param location the reference describing the element to be returned
+   * @return the element referenced by the given location
+   */
+  Element getElement(ElementLocation location);
+  /**
+   * Return an array containing all of the errors associated with the given source.
+   * @param source the source whose errors are to be returned
+   * @return all of the errors associated with the given source
+   * @throws AnalysisException if the errors could not be determined because the analysis could not
+   * be performed
+   */
+  List<AnalysisError> getErrors(Source source);
+  /**
+   * Parse and build an element model for the HTML file defined by the given source.
+   * @param source the source defining the HTML file whose element model is to be returned
+   * @return the element model corresponding to the HTML file defined by the given source
+   */
+  HtmlElement getHtmlElement(Source source);
+  /**
+   * Return the kind of the given source if it is already known, or {@code null} if the kind is not
+   * already known.
+   * @param source the source whose kind is to be returned
+   * @return the kind of the given source
+   * @see #getOrComputeKindOf(Source)
+   */
+  SourceKind getKnownKindOf(Source source);
+  /**
+   * 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
+   * are only included in a single library, but it is possible to have a part that is contained in
+   * multiple identically named libraries. If the source represents the defining compilation unit of
+   * a library, then the returned array will contain the given source as its only element. If the
+   * source does not represent a Dart source or is not known to this context, the returned array
+   * will be empty.
+   * @param source the source contained in the returned libraries
+   * @return the sources for the libraries containing the given source
+   */
+  List<Source> getLibrariesContaining(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
+   * for a library can long-running, depending on the size of the library and the number of
+   * libraries that are imported into it that also need to have a model built for them.
+   * @param source the source defining the library whose element model is to be returned
+   * @return the element model corresponding to the library defined by the given source or{@code null} if the element model could not be determined because the analysis could
+   * not be performed
+   */
+  LibraryElement getLibraryElement(Source source);
+  /**
+   * Return the element model corresponding to the library defined by the given source, or{@code null} if the element model does not yet exist.
+   * @param source the source defining the library whose element model is to be returned
+   * @return the element model corresponding to the library defined by the given source
+   */
+  LibraryElement getLibraryElementOrNull(Source source);
+  /**
+   * Return the kind of the given source, computing it's kind if it is not already known.
+   * @param source the source whose kind is to be returned
+   * @return the kind of the given source
+   * @see #getKnownKindOf(Source)
+   */
+  SourceKind getOrComputeKindOf(Source source);
+  /**
+   * Return an array containing all of the parsing errors associated with the given source.
+   * @param source the source whose errors are to be returned
+   * @return all of the parsing errors associated with the given source
+   * @throws AnalysisException if the errors could not be determined because the analysis could not
+   * be performed
+   */
+  List<AnalysisError> getParsingErrors(Source source);
+  /**
+   * Return an array containing all of the resolution errors associated with the given source.
+   * @param source the source whose errors are to be returned
+   * @return all of the resolution errors associated with the given source
+   * @throws AnalysisException if the errors could not be determined because the analysis could not
+   * be performed
+   */
+  List<AnalysisError> getResolutionErrors(Source source);
+  /**
+   * 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;
+  /**
+   * Add the sources contained in the specified context to the receiver's collection of sources.
+   * This method is called when an existing context's pubspec has been removed, and the contained
+   * sources should be reanalyzed as part of the receiver.
+   * @param context the context being merged (not {@code null})
+   */
+  void mergeAnalysisContext(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.
+   * @param source the source to be parsed
+   * @return the AST structure representing the content of the source
+   * @throws AnalysisException if the analysis could not be performed
+   */
+  CompilationUnit parse(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
+   * resolved.
+   * @param source the HTML source to be parsed
+   * @return the parse result (not {@code null})
+   * @throws AnalysisException if the analysis could not be performed
+   */
+  HtmlParseResult parseHtml(Source source);
+  /**
+   * Parse and resolve a single source within the given context to produce a fully resolved AST.
+   * @param source the source to be parsed and resolved
+   * @param library the library defining the context in which the source file is to be resolved
+   * @return the result of resolving the AST structure representing the content of the source
+   * @throws AnalysisException if the analysis could not be performed
+   */
+  CompilationUnit resolve(Source source, LibraryElement library);
+  /**
+   * Scan a single source to produce a token stream.
+   * @param source the source to be scanned
+   * @param errorListener the listener to which errors should be reported
+   * @return the head of the token stream representing the content of the source
+   * @throws AnalysisException if the analysis could not be performed
+   */
+  Token scan(Source source, AnalysisErrorListener errorListener);
+  /**
+   * Scan a single source to produce an HTML token stream.
+   * @param source the source to be scanned
+   * @return the scan result (not {@code null})
+   * @throws AnalysisException if the analysis could not be performed
+   */
+  HtmlScanResult scanHtml(Source source);
+  /**
+   * Set the source factory used to create the sources that can be analyzed in this context to the
+   * given source factory.
+   * @param sourceFactory the source factory used to create the sources that can be analyzed in this
+   * context
+   */
+  void set sourceFactory(SourceFactory sourceFactory4);
+  /**
+   * 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)
+   * @return An iterable returning the sources to be resolved
+   */
+  Iterable<Source> sourcesToResolve(List<Source> changedSources);
+}
+/**
+ * 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.
+   */
+  AnalysisException() : super() {
+    _jtd_constructor_123_impl();
+  }
+  _jtd_constructor_123_impl() {
+  }
+  /**
+   * Initialize a newly created exception to have the given message.
+   * @param message the message associated with the exception
+   */
+  AnalysisException.con1(String message) : super(message) {
+    _jtd_constructor_124_impl(message);
+  }
+  _jtd_constructor_124_impl(String message) {
+  }
+  /**
+   * Initialize a newly created exception to have the given message and cause.
+   * @param message the message associated with the exception
+   * @param cause the underlying exception that caused this exception
+   */
+  AnalysisException.con2(String message, Exception cause) : super(message, cause) {
+    _jtd_constructor_125_impl(message, cause);
+  }
+  _jtd_constructor_125_impl(String message, Exception cause) {
+  }
+  /**
+   * Initialize a newly created exception to have the given cause.
+   * @param cause the underlying exception that caused this exception
+   */
+  AnalysisException.con3(Exception cause) : super.withCause(cause) {
+    _jtd_constructor_126_impl(cause);
+  }
+  _jtd_constructor_126_impl(Exception cause) {
+  }
+}
+/**
+ * Instances of {@code ChangeResult} are returned by {@link AnalysisContext#changed(ChangeSet)} to
+ * indicate what operations need to be performed as a result of the change.
+ * @coverage dart.engine
+ */
+class ChangeResult {
+}
+/**
+ * Instances of the class {@code ChangeSet} indicate what sources have been added, changed, or
+ * removed.
+ * @coverage dart.engine
+ */
+class ChangeSet {
+  /**
+   * A table mapping the sources that have been added to their contents.
+   */
+  Map<Source, String> _added3 = new Map<Source, String>();
+  /**
+   * A table mapping the sources that have been changed to their contents.
+   */
+  Map<Source, String> _changed3 = new Map<Source, String>();
+  /**
+   * 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.
+   * @param source the source that was added
+   */
+  void added(Source source) {
+    added2(source, null);
+  }
+  /**
+   * Record that the specified source has been added and that it has the given content. If the
+   * content is non-{@code null}, this has the effect of overriding the default contents of the
+   * source. If the contents are {@code null}, any previous the override is removed so that the
+   * default contents will be used.
+   * @param source the source that was added
+   * @param content the content of the new source
+   */
+  void added2(Source source, String content) {
+    if (source != null) {
+      _added3[source] = content;
+    }
+  }
+  /**
+   * Record that the specified source has been changed and that it's content is the default contents
+   * of the source.
+   * @param source the source that was changed
+   */
+  void changed(Source source) {
+    changed2(source, null);
+  }
+  /**
+   * Record that the specified source has been changed and that it now has the given content. If the
+   * content is non-{@code null}, this has the effect of overriding the default contents of the
+   * source. If the contents are {@code null}, any previous the override is removed so that the
+   * default contents will be used.
+   * @param source the source that was changed
+   * @param content the new content of the source
+   */
+  void changed2(Source source, String content) {
+    if (source != null) {
+      _changed3[source] = content;
+    }
+  }
+  /**
+   * Return a table mapping the sources that have been added to their contents.
+   * @return a table mapping the sources that have been added to their contents
+   */
+  Map<Source, String> get addedWithContent => _added3;
+  /**
+   * Return a table mapping the sources that have been changed to their contents.
+   * @return a table mapping the sources that have been changed to their contents
+   */
+  Map<Source, String> get changedWithContent => _changed3;
+  /**
+   * 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() => _added3.isEmpty && _changed3.isEmpty && _removed2.isEmpty && _removedContainers.isEmpty;
+  /**
+   * Record that the specified source has been removed.
+   * @param source the source that was removed
+   */
+  void removed3(Source source) {
+    if (source != null) {
+      _removed2.add(source);
+    }
+  }
+  /**
+   * Record that the specified source container has been removed.
+   * @param container the source container that was removed
+   */
+  void removedContainer(SourceContainer container) {
+    if (container != null) {
+      _removedContainers.add(container);
+    }
+  }
+}
+/**
+ * Instances of the class {@code AnalysisContextImpl} implement an {@link AnalysisContext analysis
+ * context}.
+ * @coverage dart.engine
+ */
+class AnalysisContextImpl implements AnalysisContext {
+  /**
+   * The source factory used to create the sources that can be analyzed in this context.
+   */
+  SourceFactory _sourceFactory;
+  /**
+   * A table mapping sources known to the context to the information known about the source.
+   */
+  Map<Source, SourceInfo> _sourceMap = new Map<Source, SourceInfo>();
+  /**
+   * A cache mapping sources to the compilation units that were produced for the contents of the
+   * source.
+   */
+  Map<Source, CompilationUnit> _parseCache = new Map<Source, CompilationUnit>();
+  /**
+   * A cache mapping sources to the html parse results that were produced for the contents of the
+   * source.
+   */
+  Map<Source, HtmlParseResult> _htmlParseCache = new Map<Source, HtmlParseResult>();
+  /**
+   * A cache mapping sources (of the defining compilation units of libraries) to the library
+   * elements for those libraries.
+   */
+  Map<Source, LibraryElement> _libraryElementCache = new Map<Source, LibraryElement>();
+  /**
+   * A cache mapping sources (of the defining compilation units of libraries) to the public
+   * namespace for that library.
+   */
+  Map<Source, Namespace> _publicNamespaceCache = new Map<Source, Namespace>();
+  /**
+   * The object used to synchronize access to all of the caches.
+   */
+  Object _cacheLock = new Object();
+  /**
+   * The suffix used by sources that contain Dart.
+   */
+  static String _DART_SUFFIX = ".dart";
+  /**
+   * The suffix used by sources that contain HTML.
+   */
+  static String _HTML_SUFFIX = ".html";
+  /**
+   * Initialize a newly created analysis context.
+   */
+  AnalysisContextImpl() : super() {
+  }
+  ChangeResult changed(ChangeSet changeSet) {
+    if (changeSet.isEmpty()) {
+      return new ChangeResult();
+    }
+    {
+      for (MapEntry<Source, String> entry in getMapEntrySet(changeSet.addedWithContent)) {
+        _sourceFactory.setContents(entry.getKey(), entry.getValue());
+      }
+      for (MapEntry<Source, String> entry in getMapEntrySet(changeSet.changedWithContent)) {
+        _sourceFactory.setContents(entry.getKey(), entry.getValue());
+      }
+      for (Source source in changeSet.addedWithContent.keys.toSet()) {
+        sourceAvailable(source);
+      }
+      for (Source source in changeSet.changedWithContent.keys.toSet()) {
+        sourceChanged(source);
+      }
+      for (Source source in changeSet.removed) {
+        sourceDeleted(source);
+      }
+      for (SourceContainer container in changeSet.removedContainers) {
+        sourcesDeleted(container);
+      }
+    }
+    return new ChangeResult();
+  }
+  void clearResolution() {
+    {
+      _parseCache.clear();
+      _htmlParseCache.clear();
+      _libraryElementCache.clear();
+      _publicNamespaceCache.clear();
+    }
+  }
+  void discard() {
+    {
+      _sourceMap.clear();
+      _parseCache.clear();
+      _htmlParseCache.clear();
+      _libraryElementCache.clear();
+      _publicNamespaceCache.clear();
+    }
+  }
+  AnalysisContext extractAnalysisContext(SourceContainer container) {
+    AnalysisContextImpl newContext = AnalysisEngine.instance.createAnalysisContext() as AnalysisContextImpl;
+    List<Source> sourcesToRemove = new List<Source>();
+    {
+      for (MapEntry<Source, SourceInfo> entry in getMapEntrySet(_sourceMap)) {
+        Source source = entry.getKey();
+        if (container.contains(source)) {
+          sourcesToRemove.add(source);
+          newContext._sourceMap[source] = new SourceInfo.con2(entry.getValue());
+        }
+      }
+    }
+    return newContext;
+  }
+  Element getElement(ElementLocation location) {
+    throw new UnsupportedOperationException();
+  }
+  List<AnalysisError> getErrors(Source source) {
+    throw new UnsupportedOperationException();
+  }
+  HtmlElement getHtmlElement(Source source) {
+    throw new UnsupportedOperationException();
+  }
+  SourceKind getKnownKindOf(Source source) {
+    if (source.fullName.endsWith(_HTML_SUFFIX)) {
+      return SourceKind.HTML;
+    }
+    if (!source.fullName.endsWith(_DART_SUFFIX)) {
+      return SourceKind.UNKNOWN;
+    }
+    {
+      if (_libraryElementCache.containsKey(source)) {
+        return SourceKind.LIBRARY;
+      }
+      CompilationUnit unit = _parseCache[source];
+      if (unit != null && hasPartOfDirective(unit)) {
+        return SourceKind.PART;
+      }
+    }
+    return null;
+  }
+  List<Source> getLibrariesContaining(Source source) {
+    {
+      SourceInfo info = _sourceMap[source];
+      if (info == null) {
+        return Source.EMPTY_ARRAY;
+      }
+      return info.librarySources;
+    }
+  }
+  LibraryElement getLibraryElement(Source source) {
+    {
+      LibraryElement element = _libraryElementCache[source];
+      if (element == null) {
+        if (getOrComputeKindOf(source) != SourceKind.LIBRARY) {
+          return null;
+        }
+        LibraryResolver resolver = new LibraryResolver.con1(this);
+        try {
+          element = resolver.resolveLibrary(source, true);
+          if (element != null) {
+            _libraryElementCache[source] = element;
+          }
+        } on AnalysisException catch (exception) {
+          AnalysisEngine.instance.logger.logError2("Could not resolve the library ${source.fullName}", exception);
+        }
+      }
+      return element;
+    }
+  }
+  /**
+   * Return the element model corresponding to the library defined by the given source, or{@code null} if the element model does not yet exist.
+   * @param source the source defining the library whose element model is to be returned
+   * @return the element model corresponding to the library defined by the given source
+   */
+  LibraryElement getLibraryElementOrNull(Source source) {
+    {
+      return _libraryElementCache[source];
+    }
+  }
+  SourceKind getOrComputeKindOf(Source source) {
+    SourceKind kind = getKnownKindOf(source);
+    if (kind != null) {
+      return kind;
+    }
+    try {
+      if (hasPartOfDirective(parse(source))) {
+        return SourceKind.PART;
+      }
+    } on AnalysisException catch (exception) {
+      return SourceKind.UNKNOWN;
+    }
+    return SourceKind.LIBRARY;
+  }
+  List<AnalysisError> getParsingErrors(Source source) {
+    throw new UnsupportedOperationException();
+  }
+  /**
+   * Return a namespace containing mappings for all of the public names defined by the given
+   * library.
+   * @param library the library whose public namespace is to be returned
+   * @return the public namespace of the given library
+   */
+  Namespace getPublicNamespace(LibraryElement library) {
+    Source source8 = library.definingCompilationUnit.source;
+    {
+      Namespace namespace = _publicNamespaceCache[source8];
+      if (namespace == null) {
+        NamespaceBuilder builder = new NamespaceBuilder();
+        namespace = builder.createPublicNamespace(library);
+        _publicNamespaceCache[source8] = namespace;
+      }
+      return namespace;
+    }
+  }
+  /**
+   * Return a namespace containing mappings for all of the public names defined by the library
+   * defined by the given source.
+   * @param source the source defining the library whose public namespace is to be returned
+   * @return the public namespace corresponding to the library defined by the given source
+   */
+  Namespace getPublicNamespace2(Source source) {
+    {
+      Namespace namespace = _publicNamespaceCache[source];
+      if (namespace == null) {
+        LibraryElement library = getLibraryElement(source);
+        if (library == null) {
+          return null;
+        }
+        NamespaceBuilder builder = new NamespaceBuilder();
+        namespace = builder.createPublicNamespace(library);
+        _publicNamespaceCache[source] = namespace;
+      }
+      return namespace;
+    }
+  }
+  List<AnalysisError> getResolutionErrors(Source source) {
+    throw new UnsupportedOperationException();
+  }
+  SourceFactory get sourceFactory => _sourceFactory;
+  void mergeAnalysisContext(AnalysisContext context) {
+    {
+      for (MapEntry<Source, SourceInfo> entry in getMapEntrySet(((context as AnalysisContextImpl))._sourceMap)) {
+        Source newSource = entry.getKey();
+        SourceInfo existingInfo = _sourceMap[newSource];
+        if (existingInfo == null) {
+          _sourceMap[newSource] = new SourceInfo.con2(entry.getValue());
+        } else {
+        }
+      }
+    }
+  }
+  CompilationUnit parse(Source source) {
+    {
+      CompilationUnit unit = _parseCache[source];
+      if (unit == null) {
+        RecordingErrorListener errorListener = new RecordingErrorListener();
+        AnalysisContextImpl_ScanResult scanResult = internalScan(source, errorListener);
+        Parser parser = new Parser(source, errorListener);
+        unit = parser.parseCompilationUnit(scanResult._token);
+        unit.parsingErrors = errorListener.getErrors2(source);
+        unit.lineInfo = new LineInfo(scanResult._lineStarts);
+        _parseCache[source] = unit;
+      }
+      return unit;
+    }
+  }
+  CompilationUnit parse3(Source source, AnalysisErrorListener errorListener) {
+    {
+      CompilationUnit unit = _parseCache[source];
+      if (unit == null) {
+        AnalysisContextImpl_ScanResult scanResult = internalScan(source, errorListener);
+        Parser parser = new Parser(source, errorListener);
+        unit = parser.parseCompilationUnit(scanResult._token);
+        unit.lineInfo = new LineInfo(scanResult._lineStarts);
+        _parseCache[source] = unit;
+      }
+      return unit;
+    }
+  }
+  HtmlParseResult parseHtml(Source source) {
+    {
+      HtmlParseResult result = _htmlParseCache[source];
+      if (result == null) {
+        result = new HtmlParser(source).parse(scanHtml(source));
+        _htmlParseCache[source] = result;
+      }
+      return result;
+    }
+  }
+  /**
+   * Given a table mapping the source for the libraries represented by the corresponding elements to
+   * the elements representing the libraries, record those mappings.
+   * @param elementMap a table mapping the source for the libraries represented by the elements to
+   * the elements representing the libraries
+   */
+  void recordLibraryElements(Map<Source, LibraryElement> elementMap) {
+    {
+      javaMapPutAll(_libraryElementCache, elementMap);
+    }
+  }
+  CompilationUnit resolve(Source source, LibraryElement library) => parse(source);
+  Token scan(Source source, AnalysisErrorListener errorListener) {
+    AnalysisContextImpl_ScanResult result = internalScan(source, errorListener);
+    return result._token;
+  }
+  HtmlScanResult scanHtml(Source source) {
+    HtmlScanner scanner = new HtmlScanner(source);
+    try {
+      source.getContents(scanner);
+    } on JavaException catch (exception) {
+      throw new AnalysisException.con3(exception);
+    }
+    return scanner.result;
+  }
+  void set sourceFactory(SourceFactory sourceFactory2) {
+    this._sourceFactory = sourceFactory2;
+  }
+  Iterable<Source> sourcesToResolve(List<Source> changedSources) {
+    List<Source> librarySources = new List<Source>();
+    for (Source source in changedSources) {
+      if (identical(getOrComputeKindOf(source), SourceKind.LIBRARY)) {
+        librarySources.add(source);
+      }
+    }
+    return librarySources;
+  }
+  /**
+   * Return {@code true} if the given compilation unit has a part-of directive.
+   * @param unit the compilation unit being tested
+   * @return {@code true} if the compilation unit has a part-of directive
+   */
+  bool hasPartOfDirective(CompilationUnit unit) {
+    for (Directive directive in unit.directives) {
+      if (directive is PartOfDirective) {
+        return true;
+      }
+    }
+    return false;
+  }
+  AnalysisContextImpl_ScanResult internalScan(Source source, AnalysisErrorListener errorListener) {
+    AnalysisContextImpl_ScanResult result = new AnalysisContextImpl_ScanResult();
+    Source_ContentReceiver receiver = new Source_ContentReceiver_3(source, errorListener, result);
+    try {
+      source.getContents(receiver);
+    } on JavaException catch (exception) {
+      throw new AnalysisException.con3(exception);
+    }
+    return result;
+  }
+  /**
+   * Note: This method must only be invoked while we are synchronized on {@link #cacheLock}.
+   * @param source the source that has been added
+   */
+  void sourceAvailable(Source source) {
+    SourceInfo existingInfo = _sourceMap[source];
+    if (existingInfo == null) {
+      _sourceMap[source] = new SourceInfo.con1(source, getOrComputeKindOf(source));
+    }
+  }
+  /**
+   * Note: This method must only be invoked while we are synchronized on {@link #cacheLock}.
+   * @param source the source that has been changed
+   */
+  void sourceChanged(Source source) {
+    SourceInfo info = _sourceMap[source];
+    if (info == null) {
+      return;
+    }
+    _parseCache.remove(source);
+    _htmlParseCache.remove(source);
+    _libraryElementCache.remove(source);
+    _publicNamespaceCache.remove(source);
+    for (Source librarySource in info.librarySources) {
+      _libraryElementCache.remove(librarySource);
+      _publicNamespaceCache.remove(librarySource);
+    }
+  }
+  /**
+   * Note: This method must only be invoked while we are synchronized on {@link #cacheLock}.
+   * @param source the source that has been deleted
+   */
+  void sourceDeleted(Source source) {
+    _sourceMap.remove(source);
+    sourceChanged(source);
+  }
+  /**
+   * Note: This method must only be invoked while we are synchronized on {@link #cacheLock}.
+   * @param container the source container specifying the sources that have been deleted
+   */
+  void sourcesDeleted(SourceContainer container) {
+    List<Source> sourcesToRemove = new List<Source>();
+    for (Source source in _sourceMap.keys.toSet()) {
+      if (container.contains(source)) {
+        sourcesToRemove.add(source);
+      }
+    }
+  }
+}
+/**
+ * Instances of the class {@code ScanResult} represent the results of scanning a source.
+ */
+class AnalysisContextImpl_ScanResult {
+  /**
+   * 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_3 implements Source_ContentReceiver {
+  Source source;
+  AnalysisErrorListener errorListener;
+  AnalysisContextImpl_ScanResult result;
+  Source_ContentReceiver_3(this.source, this.errorListener, this.result);
+  accept(CharBuffer contents) {
+    CharBufferScanner scanner = new CharBufferScanner(source, contents, errorListener);
+    result._token = scanner.tokenize();
+    result._lineStarts = scanner.lineStarts;
+  }
+  void accept2(String contents) {
+    StringScanner scanner = new StringScanner(source, contents, errorListener);
+    result._token = scanner.tokenize();
+    result._lineStarts = scanner.lineStarts;
+  }
+}
+/**
+ * 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
+ * within an analysis context.
+ * @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>>();
+  /**
+   * Answer the errors collected by the listener.
+   * @return an array of errors (not {@code null}, contains no {@code null}s)
+   */
+  List<AnalysisError> get errors {
+    Set<MapEntry<Source, List<AnalysisError>>> entrySet2 = getMapEntrySet(_errors);
+    if (entrySet2.length == 0) {
+      return AnalysisError.NO_ERRORS;
+    }
+    List<AnalysisError> resultList = new List<AnalysisError>();
+    for (MapEntry<Source, List<AnalysisError>> entry in entrySet2) {
+      resultList.addAll(entry.getValue());
+    }
+    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
+   * collected by this listener
+   * @return the errors collected by the listener for the passed {@link Source}
+   */
+  List<AnalysisError> getErrors2(Source source) {
+    List<AnalysisError> errorsForSource = _errors[source];
+    if (errorsForSource == null) {
+      return AnalysisError.NO_ERRORS;
+    } else {
+      return new List.from(errorsForSource);
+    }
+  }
+  void onError(AnalysisError event) {
+    Source source9 = event.source;
+    List<AnalysisError> errorsForSource = _errors[source9];
+    if (_errors[source9] == null) {
+      errorsForSource = new List<AnalysisError>();
+      _errors[source9] = errorsForSource;
+    }
+    errorsForSource.add(event);
+  }
+}
+/**
+ * Instances of the class {@code SourceInfo} maintain the information known by an analysis context
+ * about an individual source.
+ * @coverage dart.engine
+ */
+class SourceInfo {
+  /**
+   * The kind of the source.
+   */
+  SourceKind _kind;
+  /**
+   * The sources for the defining compilation units for the libraries containing the source, or{@code null} if the libraries containing the source are not yet known.
+   */
+  List<Source> _librarySources = null;
+  SourceInfo.con1(Source source, SourceKind kind3) {
+    _jtd_constructor_161_impl(source, kind3);
+  }
+  _jtd_constructor_161_impl(Source source, SourceKind kind3) {
+    this._kind = kind3;
+  }
+  /**
+   * Initialize a newly created information holder to hold the same information as the given holder.
+   * @param info the information holder used to initialize this holder
+   */
+  SourceInfo.con2(SourceInfo info) {
+    _jtd_constructor_162_impl(info);
+  }
+  _jtd_constructor_162_impl(SourceInfo info) {
+    _kind = info._kind;
+    _librarySources = new List<Source>.from(info._librarySources);
+  }
+  /**
+   * Add the given source to the list of sources for the defining compilation units for the
+   * libraries containing this source.
+   * @param source the source to be added to the list
+   */
+  void addLibrarySource(Source source) {
+    if (_librarySources == null) {
+      _librarySources = new List<Source>();
+    }
+    _librarySources.add(source);
+  }
+  /**
+   * Return the kind of the source.
+   * @return the kind of the source
+   */
+  SourceKind get kind => _kind;
+  /**
+   * Return the sources for the defining compilation units for the libraries containing this source.
+   * @return the sources for the defining compilation units for the libraries containing this source
+   */
+  List<Source> get librarySources {
+    if (_librarySources == null) {
+      return Source.EMPTY_ARRAY;
+    }
+    return new List.from(_librarySources);
+  }
+  /**
+   * Remove the given source from the list of sources for the defining compilation units for the
+   * libraries containing this source.
+   * @param source the source to be removed to the list
+   */
+  void removeLibrarySource(Source source) {
+    _librarySources.remove(source);
+    if (_librarySources.isEmpty) {
+      _librarySources = null;
+    }
+  }
+  /**
+   * Set the kind of the source to the given kind.
+   * @param kind the kind of the source
+   */
+  void set kind(SourceKind kind4) {
+    this._kind = kind4;
+  }
+}
+/**
+ * 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
+ * information to a file, but can also record the information for later use (such as during testing)
+ * or even ignore the information.
+ * @coverage dart.engine.utilities
+ */
+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
+   * @param exception the exception being logged
+   */
+  void logInformation2(String message, Exception exception);
+}
+/**
+ * Implementation of {@link Logger} that does nothing.
+ */
+class Logger_NullLogger implements Logger {
+  void logError(String message) {
+  }
+  void logError2(String message, Exception exception) {
+  }
+  void logError3(Exception exception) {
+  }
+  void logInformation(String message) {
+  }
+  void logInformation2(String message, Exception exception) {
+  }
+}
\ No newline at end of file
diff --git a/pkg/analyzer_experimental/lib/src/generated/error.dart b/pkg/analyzer_experimental/lib/src/generated/error.dart
new file mode 100644
index 0000000..2693822
--- /dev/null
+++ b/pkg/analyzer_experimental/lib/src/generated/error.dart
@@ -0,0 +1,1461 @@
+// This code was auto-generated, is not intended to be edited, and is subject to
+// significant change. Please see the README file for more information.
+
+library engine.error;
+
+import 'java_core.dart';
+import 'source.dart';
+import 'ast.dart' show ASTNode;
+import 'scanner.dart' show Token;
+
+/**
+ * Instances of the enumeration {@code ErrorSeverity} represent the severity of an {@link ErrorCode}.
+ * @coverage dart.engine.error
+ */
+class 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 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) {
+    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;
+  String toString() => __name;
+}
+/**
+ * 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
+   * @param defaultSource the default source to be used when reporting errors
+   */
+  ErrorReporter(AnalysisErrorListener errorListener, Source defaultSource) {
+    if (errorListener == null) {
+      throw new IllegalArgumentException("An error listener must be provided");
+    } else if (defaultSource == null) {
+      throw new IllegalArgumentException("A default source must be provided");
+    }
+    this._errorListener = errorListener;
+    this._defaultSource = defaultSource;
+    this._source = defaultSource;
+  }
+  /**
+   * 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) {
+    _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 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) {
+    _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.
+   * @param source the source to be used when reporting errors
+   */
+  void set source(Source source7) {
+    this._source = source7 == null ? _defaultSource : source7;
+  }
+}
+/**
+ * Instances of the class {@code AnalysisError} represent an error discovered during the analysis of
+ * some Dart code.
+ * @see AnalysisErrorListener
+ * @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);
+  /**
+   * 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.
+   * @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
+   */
+  AnalysisError.con1(Source source2, ErrorCode errorCode2, List<Object> arguments) {
+    _jtd_constructor_129_impl(source2, errorCode2, arguments);
+  }
+  _jtd_constructor_129_impl(Source source2, ErrorCode errorCode2, List<Object> arguments) {
+    this._source = source2;
+    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
+   * @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
+   */
+  AnalysisError.con2(Source source3, int offset2, int length11, ErrorCode errorCode3, List<Object> arguments) {
+    _jtd_constructor_130_impl(source3, offset2, length11, errorCode3, arguments);
+  }
+  _jtd_constructor_130_impl(Source source3, int offset2, int length11, ErrorCode errorCode3, List<Object> arguments) {
+    this._source = source3;
+    this._offset = offset2;
+    this._length = length11;
+    this._errorCode = errorCode3;
+    this._message = JavaString.format(errorCode3.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 source in which the error occurred, or {@code null} if unknown.
+   * @return the source in which the error occurred
+   */
+  Source get source => _source;
+  int get hashCode {
+    int hashCode = _offset;
+    hashCode ^= (_message != null) ? _message.hashCode : 0;
+    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
+   */
+  void set source(Source source4) {
+    this._source = source4;
+  }
+  String toString() {
+    JavaStringBuilder builder = new JavaStringBuilder();
+    builder.append((_source != null) ? _source.fullName : "<unknown source>");
+    builder.append("(");
+    builder.append(_offset);
+    builder.append("..");
+    builder.append(_offset + _length - 1);
+    builder.append("): ");
+    builder.append(_message);
+    return builder.toString();
+  }
+}
+/**
+ * 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 {
+  /**
+   * 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 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) {
+    this._severity = severity;
+  }
+  /**
+   * Return the severity of this type of error.
+   * @return the severity of this type of error
+   */
+  ErrorSeverity get severity => _severity;
+  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
+ * that caused the error to be generated and for the error message to explain what is wrong and,
+ * when appropriate, how the problem can be corrected.
+ * @coverage dart.engine.error
+ */
+class CompileTimeErrorCode implements ErrorCode {
+  /**
+   * 14.2 Exports: It is a compile-time error if a name <i>N</i> is re-exported by a library
+   * <i>L</i> and <i>N</i> is introduced into the export namespace of <i>L</i> by more than one
+   * export.
+   */
+  static final CompileTimeErrorCode AMBIGUOUS_EXPORT = new CompileTimeErrorCode('AMBIGUOUS_EXPORT', 0, "");
+  /**
+   * 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>
+   */
+  static final CompileTimeErrorCode AMBIGUOUS_IMPORT = new CompileTimeErrorCode('AMBIGUOUS_IMPORT', 1, "");
+  /**
+   * 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, "");
+  /**
+   * 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_DIVIDE_BY_ZERO = new CompileTimeErrorCode('COMPILE_TIME_CONSTANT_RAISES_EXCEPTION_DIVIDE_BY_ZERO', 9, "Cannot divide by zero");
+  /**
+   * 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', 10, "'%s' cannot be used to name a constructor and a method 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', 11, "'%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', 12, "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', 13, "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', 14, "'const' variables must be constant value");
+  /**
+   * 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', 15, "");
+  /**
+   * 12.11.2 Const: If <i>T</i> is a parameterized type <i>S&lt;U<sub>1</sub>, &hellip;,
+   * U<sub>m</sub>&gt;</i>, let <i>R = S</i>; It is a compile time error if <i>S</i> is not a
+   * generic type with <i>m</i> type parameters.
+   * @param typeName the name of the type being referenced (<i>S</i>)
+   * @param argumentCount the number of type arguments provided
+   * @param parameterCount the number of type parameters that were declared
+   */
+  static final CompileTimeErrorCode CONST_WITH_INVALID_TYPE_PARAMETERS = new CompileTimeErrorCode('CONST_WITH_INVALID_TYPE_PARAMETERS', 16, "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', 17, "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', 18, "");
+  /**
+   * 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.
+   * <p>
+   * 12.11.2 Const: If <i>e</i> is of the form <i>const T.id(a<sub>1</sub>, &hellip;, a<sub>n</sub>,
+   * x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip; x<sub>n+k</sub>: a<sub>n+k</sub>)</i> it is a
+   * compile-time error if <i>T</i> is not a class accessible in the current scope, optionally
+   * followed by type arguments.
+   */
+  static final CompileTimeErrorCode CONST_WITH_NON_TYPE = new CompileTimeErrorCode('CONST_WITH_NON_TYPE', 19, "");
+  /**
+   * 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', 20, "");
+  /**
+   * 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>.
+   */
+  static final CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR = new CompileTimeErrorCode('CONST_WITH_UNDEFINED_CONSTRUCTOR', 21, "");
+  /**
+   * 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', 22, "");
+  /**
+   * 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', 23, "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', 24, "");
+  /**
+   * 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', 25, "");
+  /**
+   * 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', 26, "");
+  /**
+   * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
+   * not a library declaration.
+   */
+  static final CompileTimeErrorCode EXPORT_OF_NON_LIBRARY = new CompileTimeErrorCode('EXPORT_OF_NON_LIBRARY', 27, "");
+  /**
+   * 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', 28, "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>
+   * 12.3 Numbers: It is a compile-time error for a class to attempt to extend or implement int.
+   * <p>
+   * 12.3 Numbers: It is a compile-time error for a class to attempt to extend or implement double.
+   * <p>
+   * 12.3 Numbers: It is a compile-time error for any type other than the types int and double to
+   * attempt to extend or implement num.
+   * <p>
+   * 12.4 Booleans: It is a compile-time error for a class to attempt to extend or implement bool.
+   * <p>
+   * 12.5 Strings: It is a compile-time error for a class to attempt to extend or implement String.
+   */
+  static final CompileTimeErrorCode EXTENDS_OR_IMPLEMENTS_DISALLOWED_CLASS = new CompileTimeErrorCode('EXTENDS_OR_IMPLEMENTS_DISALLOWED_CLASS', 29, "");
+  /**
+   * 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, "");
+  /**
+   * 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, "");
+  /**
+   * 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, "");
+  /**
+   * 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, "");
+  /**
+   * 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.
+   */
+  static final CompileTimeErrorCode FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR = new CompileTimeErrorCode('FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR', 34, "");
+  /**
+   * 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.
+   */
+  static final CompileTimeErrorCode FINAL_INITIALIZED_MULTIPLE_TIMES = new CompileTimeErrorCode('FINAL_INITIALIZED_MULTIPLE_TIMES', 35, "");
+  /**
+   * 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.
+   */
+  static final CompileTimeErrorCode FINAL_NOT_INITIALIZED = new CompileTimeErrorCode('FINAL_NOT_INITIALIZED', 36, "");
+  /**
+   * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
+   * name.
+   */
+  static final CompileTimeErrorCode GETTER_AND_METHOD_WITH_SAME_NAME = new CompileTimeErrorCode('GETTER_AND_METHOD_WITH_SAME_NAME', 37, "");
+  /**
+   * 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, "");
+  /**
+   * 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");
+  /**
+   * 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.
+   */
+  static final CompileTimeErrorCode IMPLEMENTS_REPEATED = new CompileTimeErrorCode('IMPLEMENTS_REPEATED', 40, "");
+  /**
+   * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
+   * superinterface of itself.
+   */
+  static final CompileTimeErrorCode IMPLEMENTS_SELF = new CompileTimeErrorCode('IMPLEMENTS_SELF', 41, "");
+  /**
+   * 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, "");
+  /**
+   * 14.1 Imports: It is a compile-time error if the compilation unit found at the specified URI is
+   * not a library declaration.
+   */
+  static final CompileTimeErrorCode IMPORT_OF_NON_LIBRARY = new CompileTimeErrorCode('IMPORT_OF_NON_LIBRARY', 43, "");
+  /**
+   * 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>.
+   */
+  static final CompileTimeErrorCode INCONSITENT_CASE_EXPRESSION_TYPES = new CompileTimeErrorCode('INCONSITENT_CASE_EXPRESSION_TYPES', 44, "");
+  /**
+   * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
+   * compile-time error if <i>id</i> is not the name of an instance variable of the immediately
+   * enclosing class.
+   */
+  static final CompileTimeErrorCode INITIALIZER_FOR_NON_EXISTANT_FIELD = new CompileTimeErrorCode('INITIALIZER_FOR_NON_EXISTANT_FIELD', 45, "");
+  /**
+   * 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', 46, "");
+  /**
+   * 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', 47, "");
+  /**
+   * 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', 48, "");
+  /**
+   * 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', 49, "");
+  /**
+   * 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>.
+   */
+  static final CompileTimeErrorCode INVALID_OVERRIDE_NAMED = new CompileTimeErrorCode('INVALID_OVERRIDE_NAMED', 50, "");
+  /**
+   * 7.1 Instance Methods: It is a compile-time error if an instance method m1 overrides an instance
+   * member <i>m2</i> and <i>m1</i> has fewer optional positional parameters than <i>m2</i>.
+   */
+  static final CompileTimeErrorCode INVALID_OVERRIDE_POSITIONAL = new CompileTimeErrorCode('INVALID_OVERRIDE_POSITIONAL', 51, "");
+  /**
+   * 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>.
+   */
+  static final CompileTimeErrorCode INVALID_OVERRIDE_REQUIRED = new CompileTimeErrorCode('INVALID_OVERRIDE_REQUIRED', 52, "");
+  /**
+   * 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', 53, "");
+  /**
+   * 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', 54, "");
+  /**
+   * 12.6 Lists: It is a compile time error if the type argument of a constant list literal includes
+   * a type parameter.
+   */
+  static final CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_LIST = new CompileTimeErrorCode('INVALID_TYPE_ARGUMENT_IN_CONST_LIST', 55, "");
+  /**
+   * 12.7 Maps: It is a compile time error if the type arguments of a constant map literal include a
+   * type parameter.
+   */
+  static final CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_MAP = new CompileTimeErrorCode('INVALID_TYPE_ARGUMENT_IN_CONST_MAP', 56, "");
+  /**
+   * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
+   * error if <i>k</i>'s initializer list contains an initializer for a variable that is not an
+   * instance variable declared in the immediately surrounding class.
+   */
+  static final CompileTimeErrorCode INVALID_VARIABLE_IN_INITIALIZER = new CompileTimeErrorCode('INVALID_VARIABLE_IN_INITIALIZER', 57, "");
+  /**
+   * 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.
+   * <p>
+   * 13.14 Continue: It is a compile-time error if no such statement or case clause
+   * <i>s<sub>E</sub></i> exists within the innermost function in which <i>s<sub>c</sub></i> occurs.
+   * @param labelName the name of the unresolvable label
+   */
+  static final CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = new CompileTimeErrorCode('LABEL_IN_OUTER_SCOPE', 58, "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.
+   * <p>
+   * 13.14 Continue: It is a compile-time error if no such statement or case clause
+   * <i>s<sub>E</sub></i> exists within the innermost function in which <i>s<sub>c</sub></i> occurs.
+   * @param labelName the name of the unresolvable label
+   */
+  static final CompileTimeErrorCode LABEL_UNDEFINED = new CompileTimeErrorCode('LABEL_UNDEFINED', 59, "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', 60, "");
+  /**
+   * 9 Mixins: It is a compile-time error if a declared or derived mixin explicitly declares a
+   * constructor.
+   */
+  static final CompileTimeErrorCode MIXIN_DECLARES_CONSTRUCTOR = new CompileTimeErrorCode('MIXIN_DECLARES_CONSTRUCTOR', 61, "");
+  /**
+   * 9 Mixins: It is a compile-time error if a mixin is derived from a class whose superclass is not
+   * Object.
+   */
+  static final CompileTimeErrorCode MIXIN_INHERITS_FROM_NOT_OBJECT = new CompileTimeErrorCode('MIXIN_INHERITS_FROM_NOT_OBJECT', 62, "");
+  /**
+   * 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', 63, "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', 64, "");
+  /**
+   * 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', 65, "");
+  /**
+   * 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', 66, "");
+  /**
+   * 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', 67, "");
+  /**
+   * 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.
+   * @param typeName the name of the type being referenced (<i>S</i>)
+   * @param argumentCount the number of type arguments provided
+   * @param parameterCount the number of type parameters that were declared
+   */
+  static final CompileTimeErrorCode NEW_WITH_INVALID_TYPE_PARAMETERS = new CompileTimeErrorCode('NEW_WITH_INVALID_TYPE_PARAMETERS', 68, "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', 69, "");
+  /**
+   * 13.9 Switch: Given a switch statement of the form <i>switch (e) { label<sub>11</sub> &hellip;
+   * label<sub>1j1</sub> case e<sub>1</sub>: s<sub>1</sub> &hellip; label<sub>n1</sub> &hellip;
+   * label<sub>njn</sub> case e<sub>n</sub>: s<sub>n</sub> default: s<sub>n+1</sub>}</i> or the form
+   * <i>switch (e) { label<sub>11</sub> &hellip; label<sub>1j1</sub> case e<sub>1</sub>:
+   * s<sub>1</sub> &hellip; label<sub>n1</sub> &hellip; label<sub>njn</sub> case e<sub>n</sub>:
+   * s<sub>n</sub>}</i>, it is a compile-time error if the expressions <i>e<sub>k</sub></i> are not
+   * compile-time constants, for all <i>1 &lt;= k &lt;= n</i>.
+   */
+  static final CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION = new CompileTimeErrorCode('NON_CONSTANT_CASE_EXPRESSION', 70, "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', 71, "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', 72, "'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', 73, "The keys in a 'const' 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', 74, "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', 75, "");
+  /**
+   * 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', 76, "");
+  /**
+   * 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', 77, "");
+  /**
+   * 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', 78, "");
+  /**
+   * 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', 79, "");
+  /**
+   * 14.3 Parts: It is a compile time error if the contents of the URI are not a valid part
+   * declaration.
+   */
+  static final CompileTimeErrorCode PART_OF_NON_PART = new CompileTimeErrorCode('PART_OF_NON_PART', 80, "");
+  /**
+   * 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', 81, "");
+  /**
+   * 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', 82, "");
+  /**
+   * 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', 83, "");
+  /**
+   * 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', 84, "");
+  /**
+   * 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', 85, "");
+  /**
+   * 8.1 Superinterfaces: It is a compile-time error if an interface is a superinterface of itself.
+   */
+  static final CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = new CompileTimeErrorCode('RECURSIVE_INTERFACE_INHERITANCE', 86, "");
+  /**
+   * 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', 87, "");
+  /**
+   * 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', 88, "");
+  /**
+   * 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', 89, "");
+  /**
+   * 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', 90, "");
+  /**
+   * 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', 91, "");
+  /**
+   * 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', 92, "");
+  /**
+   * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
+   * <i>super.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip;
+   * x<sub>n+k</sub>: a<sub>n+k</sub>)</i>. It is a compile-time error if a super method invocation
+   * occurs in a top-level function or variable initializer, in an instance variable initializer or
+   * initializer list, in class Object, in a factory constructor, or in a static method or variable
+   * initializer.
+   */
+  static final CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = new CompileTimeErrorCode('SUPER_IN_INVALID_CONTEXT', 93, "");
+  /**
+   * 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', 94, "");
+  /**
+   * 12.8 Throw: It is a compile-time error if an expression of the form throw; is not enclosed
+   * within a on-catch clause.
+   */
+  static final CompileTimeErrorCode THROW_WITHOUT_VALUE_OUTSIDE_ON = new CompileTimeErrorCode('THROW_WITHOUT_VALUE_OUTSIDE_ON', 95, "");
+  /**
+   * 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.
+   * <p>
+   * 12.32 Type Cast: It is a compile-time error if <i>T</i> is a parameterized type of the form
+   * <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', 96, "");
+  /**
+   * 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', 97, "");
+  /**
+   * 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
+   * <i>k</i>'s initializer list unless it has already been initialized by one of the following
+   * means:
+   * <ol>
+   * <li>Initialization at the declaration of <i>f</i>.
+   * <li>Initialization by means of an initializing formal of <i>k</i>.
+   * </ol>
+   * or a compile-time error occurs.
+   */
+  static final CompileTimeErrorCode UNINITIALIZED_FINAL_FIELD = new CompileTimeErrorCode('UNINITIALIZED_FINAL_FIELD', 98, "");
+  /**
+   * 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.
+   * <p>
+   * 14.3 Parts: It is a compile-time error if <i>s</i> is not a compile-time constant, or if
+   * <i>s</i> involves string interpolation.
+   * <p>
+   * 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', 99, "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.
+   */
+  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = new CompileTimeErrorCode('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 100, "");
+  /**
+   * 7.3 Setters: It is a compile-time error if a setter’s formal parameter list does not include
+   * exactly one required formal parameter <i>p</i>.
+   */
+  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = new CompileTimeErrorCode('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 101, "");
+  /**
+   * 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
+   * <i>m</i> type arguments where <i>m != n</i>.
+   * <p>
+   * 12.31 Type Test: It is a compile-time error if <i>T</i> is a parameterized type of the form
+   * <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', 102, "");
+  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, COMPILE_TIME_CONSTANT_RAISES_EXCEPTION_DIVIDE_BY_ZERO, 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_OR_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, INCONSITENT_CASE_EXPRESSION_TYPES, INITIALIZER_FOR_NON_EXISTANT_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_VARIABLE_IN_INITIALIZER, 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, RETURN_IN_GENERATIVE_CONSTRUCTOR, STATIC_TOP_LEVEL_FUNCTION, STATIC_TOP_LEVEL_VARIABLE, SUPER_IN_INVALID_CONTEXT, SUPER_INITIALIZER_IN_OBJECT, THROW_WITHOUT_VALUE_OUTSIDE_ON, 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;
+  /**
+   * 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) {
+    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;
+  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
+ * the error to be generated and for the error message to explain what is wrong and, when
+ * appropriate, how the problem can be corrected.
+ * @coverage dart.engine.error
+ */
+class StaticWarningCode implements ErrorCode {
+  /**
+   * 12.11.1 New: It is a static warning if the static type of <i>a<sub>i</sub>, 1 &lt;= i &lt;= n+
+   * k</i> may not be assigned to the type of the corresponding formal parameter of the constructor
+   * <i>T.id</i> (respectively <i>T</i>).
+   * <p>
+   * 12.11.2 Const: It is a static warning if the static type of <i>a<sub>i</sub>, 1 &lt;= i &lt;=
+   * n+ k</i> may not be assigned to the type of the corresponding formal parameter of the
+   * constructor <i>T.id</i> (respectively <i>T</i>).
+   * <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>.
+   * <p>
+   * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub>, 1 &lt;= i &lt;= l</i>,
+   * must have a corresponding named parameter in the set <i>{p<sub>n+1</sub>, &hellip;
+   * p<sub>n+k</sub>}</i> or a static warning occurs. It is a static warning if
+   * <i>T<sub>m+j</sub></i> may not be assigned to <i>S<sub>r</sub></i>, where <i>r = q<sub>j</sub>,
+   * 1 &lt;= j &lt;= l</i>.
+   */
+  static final StaticWarningCode ARGUMENT_TYPE_NOT_ASSIGNABLE = new StaticWarningCode('ARGUMENT_TYPE_NOT_ASSIGNABLE', 0, "");
+  /**
+   * 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, "");
+  /**
+   * 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, "");
+  /**
+   * 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, "");
+  /**
+   * 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
+   * of the link will be <i>c</i>. It is a static warning if uri is not the URI of a dart library
+   * <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, "");
+  /**
+   * 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, "");
+  /**
+   * 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, "");
+  /**
+   * 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, "");
+  /**
+   * 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, "");
+  /**
+   * 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, "");
+  /**
+   * 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>.
+   */
+  static final StaticWarningCode CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER = new StaticWarningCode('CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER', 10, "");
+  /**
+   * 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>.
+   */
+  static final StaticWarningCode CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER = new StaticWarningCode('CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER', 11, "");
+  /**
+   * 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, "");
+  /**
+   * 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, "");
+  /**
+   * 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");
+  /**
+   * 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");
+  /**
+   * 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>.
+   */
+  static final StaticWarningCode FIELD_INITIALIZER_WITH_INVALID_TYPE = new StaticWarningCode('FIELD_INITIALIZER_WITH_INVALID_TYPE', 16, "");
+  /**
+   * 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, "");
+  /**
+   * 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>.
+   */
+  static final StaticWarningCode INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC = new StaticWarningCode('INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC', 18, "");
+  /**
+   * 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, "");
+  /**
+   * 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>.
+   */
+  static final StaticWarningCode INVALID_OVERRIDE_GETTER_TYPE = new StaticWarningCode('INVALID_OVERRIDE_GETTER_TYPE', 20, "");
+  /**
+   * 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>.
+   */
+  static final StaticWarningCode INVALID_OVERRIDE_RETURN_TYPE = new StaticWarningCode('INVALID_OVERRIDE_RETURN_TYPE', 21, "");
+  /**
+   * 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>.
+   */
+  static final StaticWarningCode INVALID_OVERRIDE_SETTER_RETURN_TYPE = new StaticWarningCode('INVALID_OVERRIDE_SETTER_RETURN_TYPE', 22, "");
+  /**
+   * 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, "");
+  /**
+   * 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, "");
+  /**
+   * 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");
+  /**
+   * 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.
+   */
+  static final StaticWarningCode NEW_WITH_NON_TYPE = new StaticWarningCode('NEW_WITH_NON_TYPE', 26, "");
+  /**
+   * 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 NEW_WITH_UNDEFINED_CONSTRUCTOR = new StaticWarningCode('NEW_WITH_UNDEFINED_CONSTRUCTOR', 27, "");
+  /**
+   * 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>.
+   */
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER', 28, "");
+  /**
+   * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
+   * abstract method.
+   */
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_METHOD = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_METHOD', 29, "");
+  /**
+   * 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, "");
+  /**
+   * 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
+   * <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.
+   */
+  static final StaticWarningCode NON_TYPE_IN_CATCH_CLAUSE = new StaticWarningCode('NON_TYPE_IN_CATCH_CLAUSE', 31, "");
+  /**
+   * 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, "");
+  /**
+   * 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, "");
+  /**
+   * 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>.
+   */
+  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, "");
+  /**
+   * 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'");
+  /**
+   * 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>.
+   */
+  static final StaticWarningCode REDIRECT_TO_INVALID_RETURN_TYPE = new StaticWarningCode('REDIRECT_TO_INVALID_RETURN_TYPE', 37, "");
+  /**
+   * 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, "");
+  /**
+   * 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, "");
+  /**
+   * 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:
+   * <ol>
+   * <li><i>f</i> is not a generative constructor.
+   * <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, "");
+  /**
+   * 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, "");
+  /**
+   * 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, "");
+  /**
+   * 12.17 Getter Invocation: It is a static warning if there is no class <i>C</i> in the enclosing
+   * lexical scope of <i>i</i>, or if <i>C</i> does not declare, implicitly or explicitly, a getter
+   * named <i>m</i>.
+   */
+  static final StaticWarningCode UNDEFINED_GETTER = new StaticWarningCode('UNDEFINED_GETTER', 43, "");
+  /**
+   * 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', 44, "");
+  /**
+   * 12.18 Assignment: It is as static warning if an assignment of the form <i>v = e</i> occurs
+   * inside a top level or static function (be it function, method, getter, or setter) or variable
+   * initializer and there is no declaration <i>d</i> with name <i>v=</i> in the lexical scope
+   * enclosing the assignment.
+   * <p>
+   * 12.18 Assignment: It is a static warning if there is no class <i>C</i> in the enclosing lexical
+   * scope of the assignment, or if <i>C</i> does not declare, implicitly or explicitly, a setter
+   * <i>v=</i>.
+   */
+  static final StaticWarningCode UNDEFINED_SETTER = new StaticWarningCode('UNDEFINED_SETTER', 45, "");
+  /**
+   * 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>.
+   */
+  static final StaticWarningCode UNDEFINED_STATIC_METHOD_OR_GETTER = new StaticWarningCode('UNDEFINED_STATIC_METHOD_OR_GETTER', 46, "");
+  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_GETTER, UNDEFINED_IDENTIFIER, UNDEFINED_SETTER, UNDEFINED_STATIC_METHOD_OR_GETTER];
+  final String __name;
+  final int __ordinal;
+  int get ordinal => __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) {
+    this._message = message;
+  }
+  ErrorSeverity get errorSeverity => ErrorType.STATIC_WARNING.severity;
+  String get message => _message;
+  ErrorType get type => ErrorType.STATIC_WARNING;
+  bool needsRecompilation() => true;
+  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 {
+  /**
+   * 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);
+}
+/**
+ * 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
+ * that caused the error to be generated and for the error message to explain what is wrong and,
+ * when appropriate, how the problem can be corrected.
+ * @coverage dart.engine.error
+ */
+class StaticTypeWarningCode implements 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
+   * <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
+   * is <i>m<sub>x</sub></i>, if it exists; otherwise:
+   * <ol>
+   * <li>If all of <i>m<sub>1</sub>, &hellip; m<sub>k</sub></i> have the same number <i>r</i> of
+   * required parameters and the same set of named parameters <i>s</i>, then let <i>h = max(
+   * numberOfOptionalPositionals( m<sub>i</sub> ) ), 1 &lt;= i &lt;= k</i>. <i>I</i> has a method
+   * named <i>n</i>, with <i>r</i> required parameters of type dynamic, <i>h</i> optional positional
+   * parameters of type dynamic, named parameters <i>s</i> of type dynamic and return type dynamic.
+   * <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, "");
+  /**
+   * 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
+   * static type of <i>e</i>.
+   * <p>
+   * 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>C.v</i>. The static type of the expression <i>C.v = e</i> is
+   * the static type of <i>e</i>.
+   * <p>
+   * 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 the static type of <i>e<sub>2</sub></i> may not be assigned to <i>T</i>.
+   * @param lhsTypeName the name of the left hand side type
+   * @param rhsTypeName the name of the right hand side type
+   */
+  static final StaticTypeWarningCode INVALID_ASSIGNMENT = new StaticTypeWarningCode('INVALID_ASSIGNMENT', 2, "The type '%s' can't be assigned a '%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>,
+   * &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i>, where <i>e<sub>f</sub></i> is an expression.
+   * <p>
+   * It is a static type warning if the static type <i>F</i> of <i>e<sub>f</sub></i> may not be
+   * assigned to a function type.
+   * <p>
+   * 12.15.1 Ordinary Invocation: 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>, &hellip;
+   * x<sub>n+k</sub>: a<sub>n+k</sub>)</i>.
+   * <p>
+   * 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>. If <i>T.m</i> exists, it is a static warning
+   * if the type <i>F</i> of <i>T.m</i> may not be assigned to a function type. If <i>T.m</i> does
+   * not exist, or if <i>F</i> is not a function type, the static type of <i>i</i> is dynamic.
+   * <p>
+   * 12.15.3 Static Invocation: It is a static type warning if the type <i>F</i> of <i>C.m</i> may
+   * not be assigned to a function type.
+   * @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.
+   * <p>
+   * 13.5 If: It is a static type warning if the type of the expression <i>b</i> may not be assigned
+   * to bool.
+   * <p>
+   * 13.7 While: It is a static type warning if the type of <i>e</i> may not be assigned to bool.
+   * <p>
+   * 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.
+   */
+  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");
+  /**
+   * 12.11 Instance Creation: It is a static type warning if any of the type arguments to a
+   * constructor of a generic type <i>G</i> invoked by a new expression or a constant object
+   * expression are not subtypes of the bounds of the corresponding formal type parameters of
+   * <i>G</i>.
+   * @param boundedTypeName the name of the type used in the instance creation that should be
+   * limited by the bound as specified in the class declaration
+   * @param boundingTypeName the name of the bounding type
+   */
+  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>
+   * 15.8 Parameterized Types: If <i>S</i> is the static type of a member <i>m</i> of <i>G</i>, then
+   * the static type of the member <i>m</i> of <i>G&lt;A<sub>1</sub>, &hellip; A<sub>n</sub>&gt;</i>
+   * is <i>[A<sub>1</sub>, &hellip;, A<sub>n</sub>/T<sub>1</sub>, &hellip;, T<sub>n</sub>]S</i>
+   * where <i>T<sub>1</sub>, &hellip; T<sub>n</sub></i> are the formal type parameters of <i>G</i>.
+   * Let <i>B<sub>i</sub></i> be the bounds of <i>T<sub>i</sub>, 1 &lt;= i &lt;= n</i>. It is a
+   * static type warning if <i>A<sub>i</sub></i> is not a subtype of <i>[A<sub>1</sub>, &hellip;,
+   * 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, "");
+  /**
+   * 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>.
+   */
+  static final StaticTypeWarningCode UNDEFINED_GETTER = new StaticTypeWarningCode('UNDEFINED_GETTER', 11, "There is no such getter '%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>.
+   * @see #INACCESSIBLE_SETTER
+   */
+  static final StaticTypeWarningCode UNDEFINED_SETTER = new StaticTypeWarningCode('UNDEFINED_SETTER', 12, "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;
+   * x<sub>n+k</sub>: a<sub>n+k</sub>)</i>. It is a static type warning if <i>S</i> does not have an
+   * accessible instance member named <i>m</i>.
+   * @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', 13, "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.
+   * @param typeName the name of the type being referenced (<i>G</i>)
+   * @param argumentCount the number of type arguments provided
+   * @param parameterCount the number of type parameters that were declared
+   */
+  static final StaticTypeWarningCode WRONG_NUMBER_OF_TYPE_ARGUMENTS = new StaticTypeWarningCode('WRONG_NUMBER_OF_TYPE_ARGUMENTS', 14, "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_GETTER, UNDEFINED_SETTER, UNDEFINED_SUPER_METHOD, WRONG_NUMBER_OF_TYPE_ARGUMENTS];
+  final String __name;
+  final int __ordinal;
+  int get ordinal => __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) {
+    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;
+  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
new file mode 100644
index 0000000..1114485
--- /dev/null
+++ b/pkg/analyzer_experimental/lib/src/generated/html.dart
@@ -0,0 +1,1333 @@
+// This code was auto-generated, is not intended to be edited, and is subject to
+// significant change. Please see the README file for more information.
+
+library engine.html;
+
+import 'dart:collection';
+import 'java_core.dart';
+import 'source.dart';
+import 'error.dart';
+import 'instrumentation.dart';
+import 'element.dart' show HtmlElementImpl;
+
+/**
+ * Instances of the class {@code Token} represent a token that was scanned from the input. Each
+ * token knows which token follows it, acting as the head of a linked list of tokens.
+ * @coverage dart.engine.html
+ */
+class Token {
+  /**
+   * The offset from the beginning of the file to the first character in the token.
+   */
+  int _offset = 0;
+  /**
+   * The previous token in the token stream.
+   */
+  Token _previous;
+  /**
+   * The next token in the token stream.
+   */
+  Token _next;
+  /**
+   * The type of the token.
+   */
+  TokenType _type;
+  /**
+   * The lexeme represented by this token.
+   */
+  String _value;
+  /**
+   * Initialize a newly created token.
+   * @param type the token type (not {@code null})
+   * @param offset the offset from the beginning of the file to the first character in the token
+   */
+  Token.con1(TokenType type, int offset) {
+    _jtd_constructor_147_impl(type, offset);
+  }
+  _jtd_constructor_147_impl(TokenType type, int offset) {
+    _jtd_constructor_148_impl(type, offset, type.lexeme);
+  }
+  /**
+   * 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
+   * @param value the lexeme represented by this token (not {@code null})
+   */
+  Token.con2(TokenType type4, int offset3, String value7) {
+    _jtd_constructor_148_impl(type4, offset3, value7);
+  }
+  _jtd_constructor_148_impl(TokenType type4, int offset3, String value7) {
+    this._type = type4;
+    this._value = value7;
+    this._offset = offset3;
+  }
+  /**
+   * Return the offset from the beginning of the file to the character after last character of the
+   * token.
+   * @return the offset from the beginning of the file to the first character after last character
+   * of the token
+   */
+  int get end => _offset + length;
+  /**
+   * Return the number of characters in the node's source range.
+   * @return the number of characters in the node's source range
+   */
+  int get length => lexeme.length;
+  /**
+   * Return the lexeme that represents this token.
+   * @return the lexeme (not {@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
+   * have a length of zero ({@code 0}).
+   * @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.
+   * @param token the next token in the token stream
+   * @return the token that was passed in
+   */
+  Token setNext(Token token) {
+    _next = token;
+    token.previous = this;
+    return token;
+  }
+  String toString() => lexeme;
+  /**
+   * Set the previous token in the token stream to the given token.
+   * @param previous the previous token in the token stream
+   */
+  void set previous(Token previous2) {
+    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}).
+   */
+  HtmlUnit _unit;
+  HtmlParseResult(Token token, List<int> lineStarts, HtmlUnit unit) : super(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
+ * a {@link XmlTagNode} will also cause all of the contained {@link XmlAttributeNode}s and{@link XmlTagNode}s to be visited.
+ * <p>
+ * Subclasses that override a visit method must either invoke the overridden visit method or must
+ * explicitly ask the visited node to visit its children. Failure to do so will cause the children
+ * of the visited node to not be visited.
+ * @coverage dart.engine.html
+ */
+class RecursiveXmlVisitor<R> implements XmlVisitor<R> {
+  R visitHtmlUnit(HtmlUnit node) {
+    node.visitChildren(this);
+    return null;
+  }
+  R visitXmlAttributeNode(XmlAttributeNode node) {
+    node.visitChildren(this);
+    return null;
+  }
+  R visitXmlTagNode(XmlTagNode node) {
+    node.visitChildren(this);
+    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
+   * unit this will be equal to the length of the unit's source.
+   * @return the offset of the character just past the node's source range
+   */
+  int get end => offset + length;
+  /**
+   * Return the last token included in this node's source range.
+   * @return the last token or {@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
+   */
+  int get length {
+    Token beginToken4 = beginToken;
+    Token endToken4 = endToken;
+    if (beginToken4 == null || endToken4 == null) {
+      return -1;
+    }
+    return endToken4.offset + endToken4.length - beginToken4.offset;
+  }
+  /**
+   * Return the offset from the beginning of the file to the first character in the node's source
+   * range.
+   * @return the offset from the beginning of the file to the first character in the node's source
+   * range
+   */
+  int get offset {
+    Token beginToken5 = beginToken;
+    if (beginToken5 == null) {
+      return -1;
+    }
+    return beginToken.offset;
+  }
+  /**
+   * Return this node's parent node, or {@code null} if this node is the root of an AST structure.
+   * <p>
+   * Note that the relationship between an AST node and its parent node may change over the lifetime
+   * of a node.
+   * @return the parent of this node, or {@code null} if none
+   */
+  XmlNode get parent => _parent;
+  /**
+   * 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
+   * @return the nodes that were made children of this node
+   */
+  List<XmlNode> becomeParentOf(List<XmlNode> children) {
+    if (children != null) {
+      for (JavaIterator<XmlNode> iter = new JavaIterator(children); iter.hasNext;) {
+        XmlNode node = iter.next();
+        node.parent = this;
+      }
+    }
+    return children;
+  }
+  /**
+   * Make this node the parent of the given child node.
+   * @param child the node that will become a child of this node
+   * @return the node that was made a child of this node
+   */
+  XmlNode becomeParentOf2(XmlNode child) {
+    if (child != null) {
+      XmlNode node = child;
+      node.parent = this;
+    }
+    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
+   */
+  void set parent(XmlNode newParent) {
+    _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
+ * pattern primarily as a dispatch mechanism (and hence don't need to recursively visit a whole
+ * structure) and that only need to visit a small number of node types.
+ */
+class SimpleXmlVisitor<R> implements XmlVisitor<R> {
+  R visitHtmlUnit(HtmlUnit htmlUnit) => null;
+  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.
+ * @coverage dart.engine.html
+ */
+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
+   */
+  AbstractScanner(Source source) {
+    this._source = source;
+    _tokens = new Token.con1(TokenType.EOF, -1);
+    _tokens.setNext(_tokens);
+    _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
+   * the source code has been scanned.
+   * @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
+   */
+  Token tokenize() {
+    scan();
+    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.
+   * @param start the offset to the beginning of the string, relative to the start of the file
+   * @param endDelta the number of character after the current location to be included in the
+   * string, or the number of characters before the current location to be excluded if the
+   * offset is negative
+   * @return the specified substring of the source code
+   */
+  String getString(int start, int endDelta);
+  /**
+   * Return the character at the current position without changing the current position.
+   * @return the character at the current position
+   */
+  int peek();
+  /**
+   * Record the fact that we are at the beginning of a new line in the source.
+   */
+  void recordStartOfLine() {
+    _lineStarts.add(offset);
+  }
+  void appendEofToken() {
+    Token eofToken = new Token.con1(TokenType.EOF, offset);
+    eofToken.setNext(eofToken);
+    _tail = _tail.setNext(eofToken);
+  }
+  Token emit(Token token) {
+    _tail.setNext(token);
+    _tail = token;
+    return token;
+  }
+  Token emit2(TokenType type, int start) => emit(new Token.con1(type, start));
+  Token emit3(TokenType type, int start, int count) => emit(new Token.con2(type, start, getString(start, count)));
+  Token firstToken() => _tokens.next;
+  int recordStartOfLineAndAdvance(int c) {
+    if (c == 0xD) {
+      c = advance();
+      if (c == 0xA) {
+        c = advance();
+      }
+      recordStartOfLine();
+    } else if (c == 0xA) {
+      c = advance();
+      recordStartOfLine();
+    } else {
+      c = advance();
+    }
+    return c;
+  }
+  void scan() {
+    bool inBrackets = false;
+    bool passThrough = false;
+    int c = advance();
+    while (c >= 0) {
+      int start = offset;
+      if (c == 0x3C) {
+        c = advance();
+        if (c == 0x21) {
+          c = advance();
+          if (c == 0x2D && peek() == 0x2D) {
+            c = advance();
+            int dashCount = 1;
+            while (c >= 0) {
+              if (c == 0x2D) {
+                dashCount++;
+              } else if (c == 0x3E && dashCount >= 2) {
+                c = advance();
+                break;
+              } else {
+                dashCount = 0;
+              }
+              c = recordStartOfLineAndAdvance(c);
+            }
+            emit3(TokenType.COMMENT, start, -1);
+            if (_tail.length < 7) {
+            }
+          } else {
+            while (c >= 0) {
+              if (c == 0x3E) {
+                c = advance();
+                break;
+              }
+              c = recordStartOfLineAndAdvance(c);
+            }
+            emit3(TokenType.DECLARATION, start, -1);
+            if (!_tail.lexeme.endsWith(">")) {
+            }
+          }
+        } else if (c == 0x3F) {
+          while (c >= 0) {
+            if (c == 0x3F) {
+              c = advance();
+              if (c == 0x3E) {
+                c = advance();
+                break;
+              }
+            } else {
+              c = recordStartOfLineAndAdvance(c);
+            }
+          }
+          emit3(TokenType.DIRECTIVE, start, -1);
+          if (_tail.length < 4) {
+          }
+        } else if (c == 0x2F) {
+          emit2(TokenType.LT_SLASH, start);
+          inBrackets = true;
+          c = advance();
+        } else {
+          inBrackets = true;
+          emit2(TokenType.LT, start);
+          while (Character.isWhitespace(c)) {
+            c = recordStartOfLineAndAdvance(c);
+          }
+          if (Character.isLetterOrDigit(c)) {
+            int tagStart = offset;
+            c = advance();
+            while (Character.isLetterOrDigit(c) || c == 0x2D || c == 0x5F) {
+              c = advance();
+            }
+            emit3(TokenType.TAG, tagStart, -1);
+            String tag = _tail.lexeme;
+            for (String str in _passThroughElements) {
+              if (str == tag) {
+                passThrough = true;
+                break;
+              }
+            }
+          }
+        }
+      } else if (c == 0x3E) {
+        emit2(TokenType.GT, start);
+        inBrackets = false;
+        c = advance();
+        if (passThrough) {
+          while (c >= 0 && (c != 0x3C || peek() != 0x2F)) {
+            c = recordStartOfLineAndAdvance(c);
+          }
+          if (start + 1 < offset) {
+            emit3(TokenType.TEXT, start + 1, -1);
+          }
+          passThrough = false;
+        }
+      } else if (c == 0x2F && peek() == 0x3E) {
+        advance();
+        emit2(TokenType.SLASH_GT, start);
+        inBrackets = false;
+        c = advance();
+      } else if (!inBrackets) {
+        c = recordStartOfLineAndAdvance(c);
+        while (c != 0x3C && c >= 0) {
+          c = recordStartOfLineAndAdvance(c);
+        }
+        emit3(TokenType.TEXT, start, -1);
+      } else if (c == 0x22 || c == 0x27) {
+        int endQuote = c;
+        c = advance();
+        while (c >= 0) {
+          if (c == endQuote) {
+            c = advance();
+            break;
+          }
+          c = recordStartOfLineAndAdvance(c);
+        }
+        emit3(TokenType.STRING, start, -1);
+      } else if (c == 0x3D) {
+        emit2(TokenType.EQ, start);
+        c = advance();
+      } else if (Character.isWhitespace(c)) {
+        do {
+          c = recordStartOfLineAndAdvance(c);
+        } while (Character.isWhitespace(c));
+      } else if (Character.isLetterOrDigit(c)) {
+        c = advance();
+        while (Character.isLetterOrDigit(c) || c == 0x2D || c == 0x5F) {
+          c = advance();
+        }
+        emit3(TokenType.TAG, start, -1);
+      } else {
+        emit3(TokenType.TEXT, start, 0);
+        c = advance();
+      }
+    }
+  }
+}
+/**
+ * Instances of {@code HtmlScanResult} hold the result of scanning an HTML file.
+ * @coverage dart.engine.html
+ */
+class HtmlScanResult {
+  /**
+   * The first token in the token stream (not {@code null}).
+   */
+  Token _token;
+  /**
+   * The line start information that was produced.
+   */
+  List<int> _lineStarts;
+  HtmlScanResult(Token token, List<int> lineStarts) {
+    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;
+  /**
+   * 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
+   * @param string the string from which characters will be read
+   */
+  StringScanner(Source source, String string) : super(source) {
+    this._string = string;
+    this._stringLength = string.length;
+    this._charOffset = -1;
+  }
+  int get offset => _charOffset;
+  void set offset(int offset12) {
+    _charOffset = offset12;
+  }
+  int advance() {
+    if (++_charOffset < _stringLength) {
+      return _string.codeUnitAt(_charOffset);
+    }
+    _charOffset = _stringLength;
+    return -1;
+  }
+  String getString(int start, int endDelta) => _string.substring(start, _charOffset + 1 + endDelta);
+  int peek() {
+    if (_charOffset + 1 < _stringLength) {
+      return _string.codeUnitAt(_charOffset + 1);
+    }
+    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
+ */</