anchor.diff:        'unlinked summarize + parse',
         unlinkedSummarizeTimer.elapsedMicroseconds +
             parseTimer.elapsedMicroseconds);
  +}
  +
  +/// Simple container for a mapping from URI string to an unlinked summary.
  +class UnlinkedSummaries {
  +  final summariesByUri = <String, UnlinkedUnit>{};
  +
  +  /// Get the unlinked summary for the given URI, and report a warning if it
  +  /// can't be found.
  +  UnlinkedUnit getUnit(String uri) {
  +    var result = summariesByUri[uri];
  +    if (result == null) {
  +      print('Warning: no summary found for: $uri');
  +    }
  +    return result;
  +  }
  +}
  +
  +/// Generates unlinkmed summaries for all files in [files], and returns them in
  +/// an [UnlinkedSummaries] container.
  +UnlinkedSummaries generateUnlinkedSummaries(Set<Source> files) {
  +  var unlinkedSummaries = new UnlinkedSummaries();
  +  for (var source in files) {
  +    unlinkedSummaries.summariesByUri[source.uri.toString()] =
  +        unlinkedSummarize(source);
  +  }
  +  return unlinkedSummaries;
   }
   
   /// Produces prelinked summaries for every file in [files] and reports the time
  
positive.code: import 'package:analyzer/src/generated/source_io.dart';
  import 'package:analyzer/src/summary/format.dart';
  import 'package:analyzer/src/summary/idl.dart';
  import 'package:analyzer/src/summary/prelink.dart';
  import 'package:analyzer/src/summary/summarize_ast.dart';
  import 'package:kernel/analyzer/loader.dart';
  import 'package:kernel/kernel.dart';
  
negative.code:   scanTotalChars = 0;
    parseTimer = new Stopwatch();
    unlinkedSummarizeTimer = new Stopwatch();
    generateUnlinkedSummaries(files);
  
    if (old != scanTotalChars) print('input size changed? ${old} chars');
    report("scan", scanTimer.elapsedMicroseconds);
  