anchor.diff:        {required int argumentCount,
         int leadingCollections = 0,
         int trailingCollections = 0})
  -      : super._(leadingCollections, trailingCollections) {
  -    if (collectionRule != null) {
  -      // Don't split inside collections if there are leading collections and
  -      // we split before the first argument.
  -      if (leadingCollections > 0) {
  -        addConstraint(1, collectionRule, Rule.unsplit);
  -      }
  -
  -      // If we're only splitting before the non-collection arguments, the
  -      // intent is to split inside the collections, so force that here.
  -      if (leadingCollections > 0 || trailingCollections > 0) {
  -        addConstraint(argumentCount + 1, collectionRule, 1);
  -      }
  -
  -      // Split before a single argument. If it's in the middle of the collection
  -      // arguments, don't allow them to split.
  -      for (var argument = 0; argument < leadingCollections; argument++) {
  -        var value = argumentCount - argument + 1;
  -        addConstraint(value, collectionRule, Rule.unsplit);
  -      }
  -
  -      for (var argument = argumentCount - trailingCollections;
  -          argument < argumentCount;
  -          argument++) {
  -        var value = argumentCount - argument + 1;
  -        addConstraint(value, collectionRule, Rule.unsplit);
  -      }
  +      : _leadingCollections = leadingCollections,
  +        _trailingCollections = trailingCollections {
  +    // Don't split inside collections if there are leading collections and
  +    // we split before the first argument.
  +    if (leadingCollections > 0) {
  +      addConstraint(1, collectionRule!, Rule.unsplit);
  +    }
  +
  +    // If we're only splitting before the non-collection arguments, the
  +    // intent is to split inside the collections, so force that here.
  +    if (leadingCollections > 0 || trailingCollections > 0) {
  +      addConstraint(argumentCount + 1, collectionRule!, 1);
  +    }
  +
  +    // Split before a single argument. If it's in the middle of the collection
  +    // arguments, don't allow them to split.
  +    for (var argument = 0; argument < leadingCollections; argument++) {
  +      var value = argumentCount - argument + 1;
  +      addConstraint(value, collectionRule!, Rule.unsplit);
  +    }
  +
  +    for (var argument = argumentCount - trailingCollections;
  +        argument < argumentCount;
  +        argument++) {
  +      var value = argumentCount - argument + 1;
  +      addConstraint(value, collectionRule!, Rule.unsplit);
       }
     }
   
  
positive.code:   /// arguments in the list. It must be provided if [leadingCollections] or
    /// [trailingCollections] is non-zero.
    NamedRule(
        Rule? collectionRule, int leadingCollections, int trailingCollections)
        : super._(leadingCollections, trailingCollections) {
      if (leadingCollections > 0 || trailingCollections > 0) {
        // Split only before the first argument. Don't allow the collections to
        // split.
  
negative.code:   /// This and [_leadingCollections] cannot both be positive.
    final int _trailingCollections;
  
    /// Creates a new rule for a positional argument list.
    ///
    /// [argumentCount] is the number of arguments that will be added to the rule
  