anchor.diff:     * analysis context, so at some point the unit might become resolved.
      */
     CompilationUnit get unit {
  -    AnalysisErrorListener errorListener = AnalysisErrorListener.NULL_LISTENER;
  -
  -    CharSequenceReader reader = new CharSequenceReader(content);
  -    Scanner scanner = new Scanner(source, reader, errorListener);
  -    scanner.scanGenericMethodComments = driver._analysisOptions.strongMode;
  -    Token token = scanner.tokenize();
  -    LineInfo lineInfo = new LineInfo(scanner.lineStarts);
  -
  -    Parser parser = new Parser(source, errorListener);
  -    parser.parseGenericMethodComments = driver._analysisOptions.strongMode;
  -    _unit = parser.parseCompilationUnit(token);
  -    _unit.lineInfo = lineInfo;
  -
  +    if (_unit == null) {
  +      AnalysisErrorListener errorListener = AnalysisErrorListener.NULL_LISTENER;
  +
  +      CharSequenceReader reader = new CharSequenceReader(content);
  +      Scanner scanner = new Scanner(source, reader, errorListener);
  +      scanner.scanGenericMethodComments = driver._analysisOptions.strongMode;
  +      Token token = scanner.tokenize();
  +      LineInfo lineInfo = new LineInfo(scanner.lineStarts);
  +
  +      Parser parser = new Parser(source, errorListener);
  +      parser.parseGenericMethodComments = driver._analysisOptions.strongMode;
  +      _unit = parser.parseCompilationUnit(token);
  +      _unit.lineInfo = lineInfo;
  +    }
       return _unit;
  +  }
  +
  +  /**
  +   * Return the unlinked bundle for the current file state.
  +   *
  +   * If the file [contentHash] is cached, try to load the bundle with this
  +   * hash. Otherwise, read the content, compute the new hash and try to find
  +   * the existing bundle, or parse the content and compute a new bundle.
  +   */
  +  PackageBundle get unlinked {
  +    String key = '$contentHash.unlinked';
  +    List<int> bytes = driver._byteStore.get(key);
  +    if (bytes == null) {
  +      driver._logger.run('Create unlinked for $this', () {
  +        UnlinkedUnitBuilder unlinkedUnit = serializeAstUnlinked(unit);
  +        PackageBundleAssembler assembler = new PackageBundleAssembler();
  +        assembler.addUnlinkedUnitWithHash(
  +            uri.toString(), unlinkedUnit, contentHash);
  +        bytes = assembler.assemble().toBuffer();
  +        driver._byteStore.put(key, bytes);
  +      });
  +    }
  +    return new PackageBundle.fromBuffer(bytes);
     }
   
     Uri get uri => source.uri;
  
positive.code:   }
  
    /**
     * Return the unlinked bundle of [file] for the current file state, or `null`.
     */
    PackageBundle _getCurrentUnlinked(_File file) {
      String key = '${file.currentContentHash}.unlinked';
      List<int> bytes = _byteStore.get(key);
      return bytes != null ? new PackageBundle.fromBuffer(bytes) : null;
    }
  
    /**
     * Return the unlinked bundle of [file] for the current file state.
     *
     * Return [_getCurrentUnlinked] or read the [file] content is read, compute
     * the content hash and update the current file state accordingly. Parse the
     * content into the [CompilationUnit] and serialize into a new unlinked
     * bundle. The bundle is then put into the [_byteStore] and returned.
     */
    PackageBundle _getUnlinked(_File file) {
      // By accessing 'contentHash' we ensure that the current file state
      // has some version of the file content hash, so we will be able to
      // use it to attempt to get the current unlinked bundle.
      String key = '${file.contentHash}.unlinked';
      return _getCurrentUnlinked(file) ??
          _logger.run('Create unlinked for $file', () {
            UnlinkedUnitBuilder unlinkedUnit = serializeAstUnlinked(file.unit);
            PackageBundleAssembler assembler = new PackageBundleAssembler();
            assembler.addUnlinkedUnitWithHash(
                file.uri.toString(), unlinkedUnit, key);
            List<int> bytes = assembler.assemble().toBuffer();
            _byteStore.put(key, bytes);
            return new PackageBundle.fromBuffer(bytes);
          });
    }
  
    /**
     * Verify the API signatures for the changed files, and decide which linked
     * libraries should be invalidated, and files reanalyzed.
     *
  
negative.code:     return driver._fileContentHashMap[path];
    }
  
    /**
     * Return the unlinked bundle for the current file state, or `null`.
     */
    PackageBundle get currentUnlinked {
      String hash = currentContentHash;
      if (hash != null) {
        String key = '$hash.unlinked';
        List<int> bytes = driver._byteStore.get(key);
        if (bytes != null) {
          return new PackageBundle.fromBuffer(bytes);
        }
      }
      return null;
    }
  
    String get path => source.fullName;
  
    /**
  