anchor.diff:      List<CodeLine> codeLines;
       Coverage coverage = new Coverage();
       List<Annotation> annotations = <Annotation>[];
  +
       String code = info.code;
       TraceGraph graph = createTraceGraph(info, coverage);
  -    Set<js.Node> mappedNodes = new Set<js.Node>();
  -    for (TraceStep step in graph.steps) {
  -      int offset;
  -      if (options.contains(USE_NEW_SOURCE_INFO)) {
  -        offset = step.offset.subexpressionOffset;
  -      } else {
  -        offset = info.jsCodePositions[step.node].startPosition;
  -      }
  -      if (offset != null) {
  -        int id = step.sourceLocation != null
  -            ? WITH_SOURCE_INFO : WITHOUT_SOURCE_INFO;
  -        annotations.add(
  -            new Annotation(id, offset, null));
  -      }
  -    }
  -    if (!options.contains(USE_NEW_SOURCE_INFO)) {
  -      for (js.Node node in info.nodeMap.nodes) {
  -        if (!mappedNodes.contains(node)) {
  -          int offset = info.jsCodePositions[node].startPosition;
  +    if (addAnnotations) {
  +      Set<js.Node> mappedNodes = new Set<js.Node>();
  +      for (TraceStep step in graph.steps) {
  +        int offset;
  +        if (options.contains(USE_NEW_SOURCE_INFO)) {
  +          offset = step.offset.subexpressionOffset;
  +        } else {
  +          offset = info.jsCodePositions[step.node].startPosition;
  +        }
  +        if (offset != null) {
  +          int id = step.sourceLocation != null
  +              ? WITH_SOURCE_INFO : WITHOUT_SOURCE_INFO;
             annotations.add(
  -                      new Annotation(ADDITIONAL_SOURCE_INFO, offset, null));
  +              new Annotation(id, offset, null));
  +        }
  +      }
  +      if (!options.contains(USE_NEW_SOURCE_INFO)) {
  +        for (js.Node node in info.nodeMap.nodes) {
  +          if (!mappedNodes.contains(node)) {
  +            int offset = info.jsCodePositions[node].startPosition;
  +            annotations.add(
  +                        new Annotation(ADDITIONAL_SOURCE_INFO, offset, null));
  +          }
           }
         }
       }
  
positive.code:   sb.write('''
  <div class="header" style="left: 0px;">[${options1.join(',')}]</div>
  <div class="header" style="right: 0px;">[${options2.join(',')}]</div>
  <div style="position:absolute;top:22px;width:100%;height:18px;">
    <span class="identical1">&nbsp;&nbsp;&nbsp;</span> 
    <span class="identical2">&nbsp;&nbsp;&nbsp;</span>
    identical blocks
    <span class="corresponding1">&nbsp;&nbsp;&nbsp;</span>
    <span class="corresponding2">&nbsp;&nbsp;&nbsp;</span> 
    corresponding blocks
    <span style="$WITH_SOURCE_INFO_STYLE">&nbsp;&nbsp;&nbsp;</span>
    offset with source information
    <span style="$WITHOUT_SOURCE_INFO_STYLE">&nbsp;&nbsp;&nbsp;</span>
    offset without source information
    <span style="$ADDITIONAL_SOURCE_INFO_STYLE">&nbsp;&nbsp;&nbsp;</span>
    offset with unneeded source information
  </div>
  <table style="position:absolute;top:40px;width:100%;"><tr>
  ''');
  
    void addCell(String content) {
  
negative.code: /// Compute [CodeLine]s and [Coverage] for [filename] using the given [options].
  Future<CodeLinesResult> computeCodeLines(
      List<String> options,
      String filename,
      {bool addAnnotations: true}) async {
    SourceMapProcessor processor = new SourceMapProcessor(filename);
    List<SourceMapInfo> sourceMapInfoList =
        await processor.process(options, perElement: false);
  