anchor.diff:    final String pattern;
   
     // The resulting matching rule. `null` if the pattern was empty or invalid.
  -  final _IgnoreRule rule;
  +  final _IgnoreRule? rule;
   
     // An invalid pattern is also considered empty.
     bool get empty => rule == null;
     bool get valid => exception == null;
   
     // For invalid patterns this contains a description of the problem.
  -  final FormatException exception;
  +  final FormatException? exception;
   
     _IgnoreParseResult(this.pattern, this.rule) : exception = null;
     _IgnoreParseResult.invalid(this.pattern, this.exception) : rule = null;
  
positive.code:   Ignore(
      Iterable<String> patterns, {
      bool ignoreCase = false,
      void Function(String pattern, FormatException exception) onInvalidPattern,
    }) : _rules = _parseIgnorePatterns(
            patterns,
            ignoreCase,
  
negative.code:   if (first == end) return _IgnoreParseResult.empty(pattern);
  
    var current = first;
    String? peekChar() => current >= end ? null : pattern[current];
  
    var expr = '';
  
    // Parses the inside of a [] range. Returns the value as a RegExp character
    // range, or null if the pattern was broken.
    String? parseCharacterRange() {
      var characterRange = '';
      var first = true;
      for (;;) {
  