anchor.diff:    }
   
     /**
  -   * Return the [_File] for the given [path] in [_sourceFactory].
  -   */
  -  _File _fileForPath(String path) {
  -    Source fileSource = _resourceProvider.getFile(path).createSource();
  -    Uri uri = _sourceFactory.restoreUri(fileSource);
  -    Source source = _resourceProvider.getFile(path).createSource(uri);
  -    return new _File.forResolution(this, source);
  -  }
  -
  -  /**
  -   * If we know the dependency signature for the [file], try to load the
  -   * analysis result from the cache. Return `null` if not found.
  -   */
  -  AnalysisResult _getCachedAnalysisResult(_File file) {
  -    String key = _getResolvedUnitKey(file);
  -    if (key != null) {
  -      List<int> bytes = _byteStore.get(key);
  -      if (bytes != null) {
  -        var unit = new AnalysisDriverResolvedUnit.fromBuffer(bytes);
  -        List<AnalysisError> errors = unit.errors
  -            .map((error) => new AnalysisError.forValues(
  -                file.source,
  -                error.offset,
  -                error.length,
  -                ErrorCode.byUniqueName(error.uniqueName),
  -                error.message,
  -                error.correction))
  -            .toList();
  -        return new AnalysisResult(
  -            file.path, file.uri, null, file.contentHash, null, errors);
  -      }
  +   * If we know the result [key] for the [file], try to load the analysis
  +   * result from the cache. Return `null` if not found.
  +   */
  +  AnalysisResult _getCachedAnalysisResult(_File file, String key) {
  +    List<int> bytes = _byteStore.get(key);
  +    if (bytes != null) {
  +      var unit = new AnalysisDriverResolvedUnit.fromBuffer(bytes);
  +      List<AnalysisError> errors = unit.errors
  +          .map((error) => new AnalysisError.forValues(
  +              file.source,
  +              error.offset,
  +              error.length,
  +              ErrorCode.byUniqueName(error.uniqueName),
  +              error.message,
  +              error.correction))
  +          .toList();
  +      return new AnalysisResult(
  +          file.path, file.uri, null, file.contentHash, null, errors);
       }
       return null;
     }
  
positive.code:    */
    final CompilationUnit unit;
  
    factory _File.forLinking(AnalysisDriver driver, Source source) {
      // If we have enough cached information, use it.
      String contentHash = driver._fileContentHashMap[source.fullName];
      if (contentHash != null) {
        String key = '$contentHash.unlinked';
        List<int> bytes = driver._byteStore.get(key);
        if (bytes != null) {
          PackageBundle unlinked = new PackageBundle.fromBuffer(bytes);
          return new _File._(driver, source, null, contentHash, unlinked, null);
        }
      }
      // Otherwise, read the source, parse and build a new unlinked bundle.
      return new _File.forResolution(driver, source);
    }
  
    factory _File.forResolution(AnalysisDriver driver, Source source) {
      String path = source.fullName;
      // Read the content.
      String content;
  
negative.code:       String oldSignature = _fileApiSignatureMap[path];
        // Compute the new API signature.
        // _File.forResolution() also updates the content hash in the cache.
        Source source = _sourceForPath(path);
        _File newFile = new _File.forResolution(this, source);
        String newSignature = newFile.unlinked.apiSignature;
        // If the old API signature is not null, then the file was used to
        // compute at least one dependency signature. If the new API signature
  