anchor.diff:  
         if (beforeMatch.trim().isEmpty) {
           // The comment is on its own line, so it refers to the next line.
  -        ignoreInfo.addAll(lineNumber + 1, codes);
  +        ignoreInfo._addAll(lineNumber + 1, codes);
         } else {
           // The comment sits next to code, so it refers to its own line.
  -        ignoreInfo.addAll(lineNumber, codes);
  +        ignoreInfo._addAll(lineNumber, codes);
         }
       }
       for (Match match in fileMatches) {
  
positive.code:           .group(1)
            .split(',')
            .map((String code) => code.trim().toLowerCase());
        ignoreInfo.addAllForFile(codes);
      }
      return ignoreInfo;
    }
  
negative.code:   final Set<String> _ignoreForFileSet = new HashSet<String>();
  
    /// Whether this info object defines any ignores.
    bool get hasIgnores => _ignoreMap.isNotEmpty || _ignoreForFileSet.isNotEmpty;
  
    /// Ignore these [errorCodes] at [line].
    void _addAll(int line, Iterable<String> errorCodes) {
      _ignoreMap.putIfAbsent(line, () => new List<String>()).addAll(errorCodes);
    }
  
    /// Ignore these [errorCodes] in the whole file.
    void _addAllForFile(Iterable<String> errorCodes) {
      _ignoreForFileSet.addAll(errorCodes);
    }
  
  