anchor.diff:    int numRequiredAnnotationsAdded = 0;
   
     int numDeadCodeSegmentsFound = 0;
  +
  +  _Listener(this.categoryOfInterest);
   
     @override
     void addEdit(SingleNullabilityFix fix, SourceEdit edit) {
  
positive.code:   for (var entry in sortedExceptions) {
      print('  ${entry.key} (x${entry.value.length})');
    }
  }
  
  /// Set this to a non-null value to cause any exception to be printed in full
  /// if its category contains the string.
  const String categoryOfInterest = null;
  
  /// Set this to `true` to cause just the exception nodes to be printed when
  /// `categoryOfInterest` is non-null.  Set this to `false` to cause the full
  /// stack trace to be printed.
  const bool printExceptionNodeOnly = false;
  
  class _Listener implements NullabilityMigrationListener {
    final groupedExceptions = <String, List<String>>{};
  
    int numExceptions = 0;
  
negative.code: import 'package:analyzer_plugin/protocol/protocol_common.dart';
  import 'package:nnbd_migration/nnbd_migration.dart';
  
  main(List<String> args) async {
    if (args.length > 1) {
      throw 'invalid args. Specify *one* argument to get exceptions of interest.';
    }
  
    warnOnNoAssertions();
    String categoryOfInterest = args.isEmpty ? null : args.single;
    var rootUri = Platform.script.resolve('../../..');
    var listener = _Listener(categoryOfInterest);
    for (var testPath in [
      'third_party/pkg/charcode',
      'third_party/pkg/collection',
  