New analyzer snapshot.

Extracts SdkLibrariesReader_LibraryBuilder into sdk.dart library.
https://code.google.com/p/dart/issues/detail?id=14791

R=brianwilkerson@google.com, devoncarew@google.com
BUG=

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

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31939 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index 15763a7..324c06b 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/analyzer/lib/src/generated/ast.dart
@@ -10009,7 +10009,7 @@
    */
   Element validateElement(ASTNode parent, Type expectedClass, Element element) {
     if (!isInstanceOf(element, expectedClass)) {
-      AnalysisEngine.instance.logger.logInformation2("Internal error: attempting to set the name of a ${parent.runtimeType.toString()} to a ${element.runtimeType.toString()}", new JavaException());
+      AnalysisEngine.instance.logger.logInformation3("Internal error: attempting to set the name of a ${parent.runtimeType.toString()} to a ${element.runtimeType.toString()}", new JavaException());
       return null;
     }
     return element;
@@ -12369,6 +12369,25 @@
 
   Element visitIdentifier(Identifier node) {
     ASTNode parent = node.parent;
+    // Type name in InstanceCreationExpression
+    {
+      ASTNode typeNameCandidate = parent;
+      // new prefix.node[.constructorName]()
+      if (typeNameCandidate is PrefixedIdentifier) {
+        PrefixedIdentifier prefixedIdentifier = typeNameCandidate as PrefixedIdentifier;
+        if (identical(prefixedIdentifier.identifier, node)) {
+          typeNameCandidate = prefixedIdentifier.parent;
+        }
+      }
+      // new typeName[.constructorName]()
+      if (typeNameCandidate is TypeName) {
+        TypeName typeName = typeNameCandidate as TypeName;
+        if (typeName.parent is ConstructorName) {
+          ConstructorName constructorName = typeName.parent as ConstructorName;
+          return constructorName.staticElement;
+        }
+      }
+    }
     // Extra work to map Constructor Declarations to their associated Constructor Elements
     if (parent is ConstructorDeclaration) {
       ConstructorDeclaration decl = parent;
@@ -12771,7 +12790,7 @@
       node.accept(this);
     } on NodeLocator_NodeFoundException catch (exception) {
     } on JavaException catch (exception) {
-      AnalysisEngine.instance.logger.logInformation2("Unable to locate element at offset (${_startOffset} - ${_endOffset})", exception);
+      AnalysisEngine.instance.logger.logInformation3("Unable to locate element at offset (${_startOffset} - ${_endOffset})", exception);
       return null;
     }
     return _foundNode;
@@ -12792,7 +12811,7 @@
       throw exception;
     } on JavaException catch (exception) {
       // Ignore the exception and proceed in order to visit the rest of the structure.
-      AnalysisEngine.instance.logger.logInformation2("Exception caught while traversing an AST structure.", exception);
+      AnalysisEngine.instance.logger.logInformation3("Exception caught while traversing an AST structure.", exception);
     }
     if (start <= _startOffset && _endOffset <= end) {
       _foundNode = node;
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 1e1c3b4..a63861f 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -1739,11 +1739,8 @@
     }
   }
 
-  /**
-   * Invalidate all of the information associated with the compilation unit.
-   */
   void invalidateAllInformation() {
-    setState(SourceEntry.LINE_INFO, CacheState.INVALID);
+    super.invalidateAllInformation();
     _sourceKind = SourceKind.UNKNOWN;
     _sourceKindState = CacheState.INVALID;
     _parseErrors = AnalysisError.NO_ERRORS;
@@ -2579,11 +2576,8 @@
     return copy;
   }
 
-  /**
-   * Invalidate all of the information associated with the HTML file.
-   */
   void invalidateAllInformation() {
-    setState(SourceEntry.LINE_INFO, CacheState.INVALID);
+    super.invalidateAllInformation();
     _parseErrors = AnalysisError.NO_ERRORS;
     _parseErrorsState = CacheState.INVALID;
     _parsedUnit = null;
@@ -2849,6 +2843,14 @@
   }
 
   /**
+   * Invalidate all of the information associated with this source.
+   */
+  void invalidateAllInformation() {
+    _lineInfo = null;
+    _lineInfoState = CacheState.INVALID;
+  }
+
+  /**
    * Set the most recent time at which the state of the source matched the state represented by this
    * entry to the given time.
    *
@@ -3069,6 +3071,12 @@
   Map<Source, ChangeNoticeImpl> _pendingNotices = new Map<Source, ChangeNoticeImpl>();
 
   /**
+   * A set containing information about the tasks that have been performed since the last change
+   * notification. Used to detect infinite loops in [performAnalysisTask].
+   */
+  Set<String> _recentTasks = new Set<String>();
+
+  /**
    * The object used to synchronize access to all of the caches. The rules related to the use of
    * this lock object are
    *
@@ -3110,6 +3118,7 @@
       return;
     }
     {
+      _recentTasks.clear();
       //
       // First, compute the list of sources that have been removed.
       //
@@ -3137,6 +3146,7 @@
         // that might have been referencing the not-yet-existing source that was just added. Longer
         // term we need to keep track of which libraries are referencing non-existing sources and
         // only re-analyze those libraries.
+        logInformation("Added Dart sources, invalidating all resolution information");
         for (MapEntry<Source, SourceEntry> mapEntry in _cache.entrySet()) {
           SourceEntry sourceEntry = mapEntry.getValue();
           if (!mapEntry.getKey().isInSystemLibrary && sourceEntry is DartEntry) {
@@ -3714,10 +3724,18 @@
     int getStart = JavaSystem.currentTimeMillis();
     AnalysisTask task = nextTaskAnalysisTask;
     int getEnd = JavaSystem.currentTimeMillis();
+    if (task == null && validateCacheConsistency()) {
+      task = nextTaskAnalysisTask;
+    }
     if (task == null) {
       return new AnalysisResult(getChangeNotices(true), getEnd - getStart, null, -1);
     }
-    //System.out.println(task);
+    String taskDescriptor = task.toString();
+    if (_recentTasks.add(taskDescriptor)) {
+      logInformation("Performing task: ${taskDescriptor}");
+    } else {
+      logInformation("*** Performing repeated task: ${taskDescriptor}");
+    }
     int performStart = JavaSystem.currentTimeMillis();
     try {
       task.perform(_resultRecorder);
@@ -3819,6 +3837,7 @@
 
   void setChangedContents(Source source, String contents, int offset, int oldLength, int newLength) {
     {
+      _recentTasks.clear();
       String originalContents = _sourceFactory.setContents(source, contents);
       if (contents != null) {
         if (contents != originalContents) {
@@ -3836,6 +3855,7 @@
 
   void setContents(Source source, String contents) {
     {
+      _recentTasks.clear();
       String originalContents = _sourceFactory.setContents(source, contents);
       if (contents != null) {
         if (contents != originalContents) {
@@ -3954,11 +3974,14 @@
             }
           }
         } else {
+          PrintStringWriter writer = new PrintStringWriter();
+          writer.println("Library resolution results discarded for");
           for (Library library in resolvedLibraries) {
             for (Source source in library.compilationUnitSources) {
               DartEntry dartEntry = getReadableDartEntry(source);
               if (dartEntry != null) {
                 int resultTime = library.getModificationTime(source);
+                writer.println("  ${debuggingString(source)}; sourceTime = ${source.modificationStamp}, resultTime = ${resultTime}, cacheTime = ${dartEntry.modificationTime}");
                 DartEntryImpl dartCopy = dartEntry.writableCopy;
                 if (thrownException == null || resultTime >= 0) {
                   //
@@ -3979,9 +4002,12 @@
                 if (source == unitSource) {
                   unitEntry = dartCopy;
                 }
+              } else {
+                writer.println("  ${debuggingString(source)}; sourceTime = ${source.modificationStamp}, no entry");
               }
             }
           }
+          logInformation(writer.toString());
         }
       }
     }
@@ -4289,6 +4315,15 @@
   }
 
   /**
+   * Return a string with debugging information about the given source (the full name and
+   * modification stamp of the source).
+   *
+   * @param source the source for which a debugging string is to be produced
+   * @return debugging information about the given source
+   */
+  String debuggingString(Source source) => "'${source.fullName}' [${source.modificationStamp}]";
+
+  /**
    * Return an array containing all of the change notices that are waiting to be returned. If there
    * are no notices, then return either `null` or an empty array, depending on the value of
    * the argument.
@@ -4845,8 +4880,9 @@
    * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock].
    *
    * @param librarySource the source of the library being invalidated
+   * @param writer the writer to which debugging information should be written
    */
-  void invalidateLibraryResolution(Source librarySource) {
+  void invalidateLibraryResolution(Source librarySource, PrintStringWriter writer) {
     // TODO(brianwilkerson) This could be optimized. There's no need to flush all of these caches if
     // the public namespace hasn't changed, which will be a fairly common case. The question is
     // whether we can afford the time to compute the namespace to look for differences.
@@ -4854,15 +4890,23 @@
     if (libraryEntry != null) {
       List<Source> includedParts = libraryEntry.getValue(DartEntry.INCLUDED_PARTS);
       DartEntryImpl libraryCopy = libraryEntry.writableCopy;
+      int oldTime = libraryCopy.modificationTime;
       libraryCopy.invalidateAllResolutionInformation();
       libraryCopy.setState(DartEntry.INCLUDED_PARTS, CacheState.INVALID);
       _cache.put(librarySource, libraryCopy);
+      if (writer != null) {
+        writer.println("  Invalidated library source: ${debuggingString(librarySource)} (previously modified at ${oldTime})");
+      }
       for (Source partSource in includedParts) {
         SourceEntry partEntry = _cache.get(partSource);
         if (partEntry is DartEntry) {
           DartEntryImpl partCopy = partEntry.writableCopy;
+          oldTime = partCopy.modificationTime;
           partCopy.invalidateAllResolutionInformation();
           _cache.put(partSource, partCopy);
+          if (writer != null) {
+            writer.println("  Invalidated part source: ${debuggingString(partSource)} (previously modified at ${oldTime})");
+          }
         }
       }
     }
@@ -4898,6 +4942,29 @@
   }
 
   /**
+   * Log the given debugging information.
+   *
+   * @param message the message to be added to the log
+   */
+  void logInformation(String message) {
+    AnalysisEngine.instance.logger.logInformation(message);
+  }
+
+  /**
+   * Log the given debugging information.
+   *
+   * @param message the message to be added to the log
+   * @param exception the exception to be included in the log entry
+   */
+  void logInformation2(String message, Exception exception) {
+    if (exception == null) {
+      AnalysisEngine.instance.logger.logInformation(message);
+    } else {
+      AnalysisEngine.instance.logger.logInformation3(message, exception);
+    }
+  }
+
+  /**
    * Given a cache entry and a library element, record the library element and other information
    * gleaned from the element in the cache entry.
    *
@@ -4963,6 +5030,7 @@
         _cache.put(source, dartCopy);
         dartEntry = dartCopy;
       } else {
+        logInformation2("Generated errors discarded for ${debuggingString(source)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${dartEntry.modificationTime}", thrownException);
         DartEntryImpl dartCopy = dartEntry.writableCopy;
         if (thrownException == null || resultTime >= 0) {
           //
@@ -5060,6 +5128,7 @@
           _cache.put(unitSource, dartCopy);
           dartEntry = dartCopy;
         } else {
+          logInformation2("Generated hints discarded for ${debuggingString(unitSource)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${dartEntry.modificationTime}", thrownException);
           if (identical(dartEntry.getState2(DartEntry.HINTS, librarySource), CacheState.IN_PROCESS)) {
             DartEntryImpl dartCopy = dartEntry.writableCopy;
             if (thrownException == null || resultTime >= 0) {
@@ -5166,6 +5235,7 @@
         _cache.put(source, dartCopy);
         dartEntry = dartCopy;
       } else {
+        logInformation2("Parse results discarded for ${debuggingString(source)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${dartEntry.modificationTime}", thrownException);
         DartEntryImpl dartCopy = dartEntry.writableCopy;
         if (thrownException == null || resultTime >= 0) {
           //
@@ -5241,6 +5311,7 @@
         _cache.put(source, htmlCopy);
         htmlEntry = htmlCopy;
       } else {
+        logInformation2("Parse results discarded for ${debuggingString(source)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${htmlEntry.modificationTime}", thrownException);
         HtmlEntryImpl htmlCopy = (sourceEntry as HtmlEntry).writableCopy;
         if (thrownException == null || resultTime >= 0) {
           //
@@ -5320,6 +5391,7 @@
         _cache.put(unitSource, dartCopy);
         dartEntry = dartCopy;
       } else {
+        logInformation2("Resolution results discarded for ${debuggingString(unitSource)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${dartEntry.modificationTime}", thrownException);
         DartEntryImpl dartCopy = dartEntry.writableCopy;
         if (thrownException == null || resultTime >= 0) {
           //
@@ -5394,6 +5466,7 @@
         _cache.put(source, htmlCopy);
         htmlEntry = htmlCopy;
       } else {
+        logInformation2("Resolution results discarded for ${debuggingString(source)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${htmlEntry.modificationTime}", thrownException);
         HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
         if (thrownException == null || resultTime >= 0) {
           //
@@ -5438,10 +5511,14 @@
     SourceEntry sourceEntry = _cache.get(source);
     if (sourceEntry == null) {
       sourceEntry = createSourceEntry(source);
+      logInformation("Added new source: ${debuggingString(source)}");
     } else {
       SourceEntryImpl sourceCopy = sourceEntry.writableCopy;
+      int oldTime = sourceCopy.modificationTime;
       sourceCopy.modificationTime = source.modificationStamp;
+      // TODO(brianwilkerson) Understand why we're not invalidating the cache.
       _cache.put(source, sourceCopy);
+      logInformation("Added new source: ${debuggingString(source)} (previously modified at ${oldTime})");
     }
     return sourceEntry is DartEntry;
   }
@@ -5456,13 +5533,20 @@
     if (sourceEntry == null || sourceEntry.modificationTime == source.modificationStamp) {
       // Either we have removed this source, in which case we don't care that it is changed, or we
       // have already invalidated the cache and don't need to invalidate it again.
+      if (sourceEntry == null) {
+        logInformation("Modified source, but there is no entry: ${debuggingString(source)}");
+      } else {
+        logInformation("Modified source, but modification time matches: ${debuggingString(source)}");
+      }
       return;
     }
     if (sourceEntry is HtmlEntry) {
       HtmlEntryImpl htmlCopy = sourceEntry.writableCopy;
+      int oldTime = htmlCopy.modificationTime;
       htmlCopy.modificationTime = source.modificationStamp;
       htmlCopy.invalidateAllInformation();
       _cache.put(source, htmlCopy);
+      logInformation("Modified HTML source: ${debuggingString(source)} (previously modified at ${oldTime})");
     } else if (sourceEntry is DartEntry) {
       List<Source> containingLibraries = getLibrariesContaining(source);
       Set<Source> librariesToInvalidate = new Set<Source>();
@@ -5472,14 +5556,18 @@
           librariesToInvalidate.add(dependentLibrary);
         }
       }
+      PrintStringWriter writer = new PrintStringWriter();
+      int oldTime = sourceEntry.modificationTime;
+      writer.println("Modified Dart source: ${debuggingString(source)} (previously modified at ${oldTime})");
       for (Source library in librariesToInvalidate) {
         //    for (Source library : containingLibraries) {
-        invalidateLibraryResolution(library);
+        invalidateLibraryResolution(library, writer);
       }
       DartEntryImpl dartCopy = sourceEntry.writableCopy;
       dartCopy.modificationTime = source.modificationStamp;
       dartCopy.invalidateAllInformation();
       _cache.put(source, dartCopy);
+      logInformation(writer.toString());
     }
   }
 
@@ -5489,6 +5577,8 @@
    * @param source the source that has been deleted
    */
   void sourceRemoved(Source source) {
+    PrintStringWriter writer = new PrintStringWriter();
+    writer.println("Removed source: ${debuggingString(source)}");
     SourceEntry sourceEntry = _cache.get(source);
     if (sourceEntry is DartEntry) {
       Set<Source> libraries = new Set<Source>();
@@ -5499,10 +5589,39 @@
         }
       }
       for (Source librarySource in libraries) {
-        invalidateLibraryResolution(librarySource);
+        invalidateLibraryResolution(librarySource, writer);
       }
     }
     _cache.remove(source);
+    logInformation(writer.toString());
+  }
+
+  /**
+   * Check the cache for any invalid entries (entries whose modification time does not match the
+   * modification time of the source associated with the entry). Invalid entries will be marked as
+   * invalid so that the source will be re-analyzed.
+   *
+   * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock].
+   *
+   * @return `true` if at least one entry was invalid
+   */
+  bool validateCacheConsistency() {
+    int consistencyCheckStart = JavaSystem.nanoTime();
+    int inconsistentCount = 0;
+    {
+      for (MapEntry<Source, SourceEntry> entry in _cache.entrySet()) {
+        Source source = entry.getKey();
+        SourceEntry sourceEntry = entry.getValue();
+        int sourceTime = source.modificationStamp;
+        if (sourceTime != sourceEntry.modificationTime) {
+          sourceChanged(source);
+          inconsistentCount++;
+        }
+      }
+    }
+    int consistencyCheckEnd = JavaSystem.nanoTime();
+    logInformation("Consistency check found ${inconsistentCount} inconsistent entries in ${((consistencyCheckEnd - consistencyCheckStart) / 1000000.0)} ms");
+    return inconsistentCount > 0;
   }
 }
 
@@ -7185,7 +7304,7 @@
       safelyPerform();
     } on AnalysisException catch (exception) {
       _thrownException = exception;
-      AnalysisEngine.instance.logger.logInformation2("Task failed: ${taskDescription}", exception);
+      AnalysisEngine.instance.logger.logInformation3("Task failed: ${taskDescription}", exception);
     }
     return accept(visitor);
   }
@@ -8330,7 +8449,7 @@
    * @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);
+  void logInformation3(String message, Exception exception);
 }
 
 /**
@@ -8349,6 +8468,6 @@
   void logInformation(String message) {
   }
 
-  void logInformation2(String message, Exception exception) {
+  void logInformation3(String message, Exception exception) {
   }
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/java_core.dart b/pkg/analyzer/lib/src/generated/java_core.dart
index 574cba4..255ea31 100644
--- a/pkg/analyzer/lib/src/generated/java_core.dart
+++ b/pkg/analyzer/lib/src/generated/java_core.dart
@@ -2,11 +2,20 @@
 
 import "dart:math" as math;
 
+final Stopwatch nanoTimeStopwatch = new Stopwatch();
+
 class JavaSystem {
   static int currentTimeMillis() {
     return (new DateTime.now()).millisecondsSinceEpoch;
   }
 
+  static int nanoTime() {
+    if (!nanoTimeStopwatch.isRunning) {
+      nanoTimeStopwatch.start();
+    }
+    return nanoTimeStopwatch.elapsedMicroseconds * 1000;
+  }
+
   static void arraycopy(List src, int srcPos, List dest, int destPos, int length) {
     for (int i = 0; i < length; i++) {
       dest[destPos + i] = src[srcPos + i];
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index f8b90e9..b6edb95 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -264,6 +264,10 @@
         // process annotations
         NodeList<Annotation> annotations = _classDeclaration.metadata;
         for (Annotation annotation in annotations) {
+          // verify annotation
+          if (annotation.arguments == null) {
+            continue;
+          }
           this._annotation = annotation;
           // @NgFilter
           if (isAngularAnnotation2(_NG_FILTER)) {
diff --git a/pkg/analyzer/lib/src/generated/sdk.dart b/pkg/analyzer/lib/src/generated/sdk.dart
index 9697515..82d89fb 100644
--- a/pkg/analyzer/lib/src/generated/sdk.dart
+++ b/pkg/analyzer/lib/src/generated/sdk.dart
@@ -8,6 +8,7 @@
 library engine.sdk;
 
 import 'source.dart' show ContentCache, Source, UriKind;
+import 'ast.dart';
 import 'engine.dart' show AnalysisContext;
 
 /**
@@ -194,6 +195,87 @@
   }
 }
 
+class SdkLibrariesReader_LibraryBuilder extends RecursiveASTVisitor<Object> {
+  /**
+   * The prefix added to the name of a library to form the URI used in code to reference the
+   * library.
+   */
+  static String _LIBRARY_PREFIX = "dart:";
+
+  /**
+   * The name of the optional parameter used to indicate whether the library is an implementation
+   * library.
+   */
+  static String _IMPLEMENTATION = "implementation";
+
+  /**
+   * The name of the optional parameter used to indicate whether the library is documented.
+   */
+  static String _DOCUMENTED = "documented";
+
+  /**
+   * The name of the optional parameter used to specify the category of the library.
+   */
+  static String _CATEGORY = "category";
+
+  /**
+   * The name of the optional parameter used to specify the platforms on which the library can be
+   * used.
+   */
+  static String _PLATFORMS = "platforms";
+
+  /**
+   * The value of the [PLATFORMS] parameter used to specify that the library can
+   * be used on the VM.
+   */
+  static String _VM_PLATFORM = "VM_PLATFORM";
+
+  /**
+   * The library map that is populated by visiting the AST structure parsed from the contents of
+   * the libraries file.
+   */
+  final LibraryMap librariesMap = new LibraryMap();
+
+  Object visitMapLiteralEntry(MapLiteralEntry node) {
+    String libraryName = null;
+    Expression key = node.key;
+    if (key is SimpleStringLiteral) {
+      libraryName = "${_LIBRARY_PREFIX}${key.value}";
+    }
+    Expression value = node.value;
+    if (value is InstanceCreationExpression) {
+      SdkLibraryImpl library = new SdkLibraryImpl(libraryName);
+      List<Expression> arguments = value.argumentList.arguments;
+      for (Expression argument in arguments) {
+        if (argument is SimpleStringLiteral) {
+          library.path = argument.value;
+        } else if (argument is NamedExpression) {
+          String name = argument.name.label.name;
+          Expression expression = argument.expression;
+          if (name == _CATEGORY) {
+            library.category = (expression as SimpleStringLiteral).value;
+          } else if (name == _IMPLEMENTATION) {
+            library.implementation = (expression as BooleanLiteral).value;
+          } else if (name == _DOCUMENTED) {
+            library.documented = (expression as BooleanLiteral).value;
+          } else if (name == _PLATFORMS) {
+            if (expression is SimpleIdentifier) {
+              String identifier = expression.name;
+              if (identifier == _VM_PLATFORM) {
+                library.setVmLibrary();
+              } else {
+                library.setDart2JsLibrary();
+              }
+            }
+          }
+        }
+      }
+      librariesMap.setLibrary(libraryName, library);
+    }
+    return null;
+  }
+}
+
 /**
  * Instances of the class `LibraryMap` map Dart library URI's to the [SdkLibraryImpl
  ].
diff --git a/pkg/analyzer/lib/src/generated/sdk_io.dart b/pkg/analyzer/lib/src/generated/sdk_io.dart
index eaca50f..c083950 100644
--- a/pkg/analyzer/lib/src/generated/sdk_io.dart
+++ b/pkg/analyzer/lib/src/generated/sdk_io.dart
@@ -190,27 +190,6 @@
     _analysisContext.applyChanges(changeSet);
   }
 
-  /**
-   * Initialize a newly created SDK to represent the Dart SDK installed in the given directory.
-   *
-   * Added in order to test AnalysisContextImpl2.
-   *
-   * @param sdkDirectory the directory containing the SDK
-   */
-  DirectoryBasedDartSdk.con1(JavaFile sdkDirectory, bool ignored) {
-    this._sdkDirectory = sdkDirectory.getAbsoluteFile();
-    initializeSdk();
-    initializeLibraryMap();
-    _analysisContext = new AnalysisContextImpl();
-    _analysisContext.sourceFactory = new SourceFactory.con2([new DartUriResolver(this)]);
-    List<String> uris = this.uris;
-    ChangeSet changeSet = new ChangeSet();
-    for (String uri in uris) {
-      changeSet.added(_analysisContext.sourceFactory.forUri(uri));
-    }
-    _analysisContext.applyChanges(changeSet);
-  }
-
   Source fromEncoding(ContentCache contentCache, UriKind kind, Uri uri) => new FileBasedSource.con2(contentCache, new JavaFile.fromUri(uri), kind);
 
   AnalysisContext get context => _analysisContext;
@@ -479,85 +458,4 @@
     }
     return libraryBuilder.librariesMap;
   }
-}
-
-class SdkLibrariesReader_LibraryBuilder extends RecursiveASTVisitor<Object> {
-  /**
-   * The prefix added to the name of a library to form the URI used in code to reference the
-   * library.
-   */
-  static String _LIBRARY_PREFIX = "dart:";
-
-  /**
-   * The name of the optional parameter used to indicate whether the library is an implementation
-   * library.
-   */
-  static String _IMPLEMENTATION = "implementation";
-
-  /**
-   * The name of the optional parameter used to indicate whether the library is documented.
-   */
-  static String _DOCUMENTED = "documented";
-
-  /**
-   * The name of the optional parameter used to specify the category of the library.
-   */
-  static String _CATEGORY = "category";
-
-  /**
-   * The name of the optional parameter used to specify the platforms on which the library can be
-   * used.
-   */
-  static String _PLATFORMS = "platforms";
-
-  /**
-   * The value of the [PLATFORMS] parameter used to specify that the library can
-   * be used on the VM.
-   */
-  static String _VM_PLATFORM = "VM_PLATFORM";
-
-  /**
-   * The library map that is populated by visiting the AST structure parsed from the contents of
-   * the libraries file.
-   */
-  final LibraryMap librariesMap = new LibraryMap();
-
-  Object visitMapLiteralEntry(MapLiteralEntry node) {
-    String libraryName = null;
-    Expression key = node.key;
-    if (key is SimpleStringLiteral) {
-      libraryName = "${_LIBRARY_PREFIX}${key.value}";
-    }
-    Expression value = node.value;
-    if (value is InstanceCreationExpression) {
-      SdkLibraryImpl library = new SdkLibraryImpl(libraryName);
-      List<Expression> arguments = value.argumentList.arguments;
-      for (Expression argument in arguments) {
-        if (argument is SimpleStringLiteral) {
-          library.path = argument.value;
-        } else if (argument is NamedExpression) {
-          String name = argument.name.label.name;
-          Expression expression = argument.expression;
-          if (name == _CATEGORY) {
-            library.category = (expression as SimpleStringLiteral).value;
-          } else if (name == _IMPLEMENTATION) {
-            library.implementation = (expression as BooleanLiteral).value;
-          } else if (name == _DOCUMENTED) {
-            library.documented = (expression as BooleanLiteral).value;
-          } else if (name == _PLATFORMS) {
-            if (expression is SimpleIdentifier) {
-              String identifier = expression.name;
-              if (identifier == _VM_PLATFORM) {
-                library.setVmLibrary();
-              } else {
-                library.setDart2JsLibrary();
-              }
-            }
-          }
-        }
-      }
-      librariesMap.setLibrary(libraryName, library);
-    }
-    return null;
-  }
 }
\ No newline at end of file
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 5c2b129a..5bc18ae 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.11.7
+version: 0.11.8
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: http://www.dartlang.org
diff --git a/tests/co19/co19-analyzer2.status b/tests/co19/co19-analyzer2.status
index 464640f..53a5aea 100644
--- a/tests/co19/co19-analyzer2.status
+++ b/tests/co19/co19-analyzer2.status
@@ -4,6 +4,8 @@
 
 [ $compiler == dart2analyzer ]
 
+LibTest/core/RegExp/firstMatch_A01_t01: Fail
+
 # invalid argument for constant constructor
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t02: fail
 
diff --git a/tests/language/language_analyzer.status b/tests/language/language_analyzer.status
index c4886a9..11f4106 100644
--- a/tests/language/language_analyzer.status
+++ b/tests/language/language_analyzer.status
@@ -2,7 +2,7 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-[ $compiler == dartanalyzer ]
+[ $compiler == dart2analyzer ]
 # Runtime negative test. No static errors or warnings.
 closure_call_wrong_argument_count_negative_test: skip
 
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index 0cdd781..c4886a9 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -2,7 +2,7 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-[ $compiler == dart2analyzer ]
+[ $compiler == dartanalyzer ]
 # Runtime negative test. No static errors or warnings.
 closure_call_wrong_argument_count_negative_test: skip
 
@@ -336,6 +336,9 @@
 mixin_type_parameters_super_extends_test: StaticWarning
 mixin_type_parameters_super_test: StaticWarning
 mixin_with_two_implicit_constructors_test: StaticWarning
+mixin_bound_test: StaticWarning
+mixin_invalid_bound_test/none: StaticWarning # legitimate StaticWarning, cannot be annotated
+mixin_invalid_bound2_test/none: StaticWarning # legitimate StaticWarning, cannot be annotated
 named_constructor_test/01: StaticWarning
 named_constructor_test/03: StaticWarning
 named_parameters2_test: StaticWarning