anchor.diff:            int colNumber = int.parse(groups[5]);
             try {
               File source = new File(filename);
  -            List<String> sourceLines = source.readAsLinesSync();
  +            List<String> sourceLines = cache.getSourceFor(source);
               if (lineNumber > sourceLines.length)
                 throw new FileChanged();
               String sourceLine = sourceLines[lineNumber-1];
  
positive.code: 
      Set<String> changedFiles = new Set<String>(); // files about which we've complained that they changed
  
      int membersMissingDocumentation = 0;
      List<String> errorLines = output.toString().split('\n');
      for (String errorLine in errorLines) {
  
negative.code:     return '${severity.toLowerCase().padLeft(7)} $sep $message $sep $relativePath:$startLine:$startColumn';
    }
  }
  
  class _SourceCache {
    _SourceCache(this.cacheSize);
  
    final int cacheSize;
    final Map<String, List<String>> _lines = new LinkedHashMap<String, List<String>>();
  
    List<String> getSourceFor(File file) {
      if (!_lines.containsKey(file.path)) {
        if (_lines.length >= cacheSize)
          _lines.remove(_lines.keys.first);
        _lines[file.path] = file.readAsLinesSync();
      }
  
      return _lines[file.path];
    }
  }
  