anchor.diff:    print('${listener.numExceptions} exceptions in '
         '${listener.groupedExceptions.length} categories');
     print('Exception categories:');
  -  var sortedExceptions = listener.groupedExceptions.entries.toList();
  -  sortedExceptions.sort((e1, e2) => e2.value.length.compareTo(e1.value.length));
  +  var sortedExceptions = listener.groupedExceptions.entries
  +      .map((entry) => MapEntry(
  +          entry.key,
  +          entry.value.entries.toList()
  +            ..sort((e1, e2) => e2.value.compareTo(e1.value))))
  +      .toList()
  +        ..sort((e1, e2) => e2.value.length.compareTo(e1.value.length));
     for (var entry in sortedExceptions) {
  -    print('  ${entry.key} (x${entry.value.length})');
  +    final packages =
  +        entry.value.map((entry) => "${entry.key} x${entry.value}").join(', ');
  +    print('  ${entry.key} ($packages)');
     }
   
     if (categoryOfInterest == null) {
  
positive.code:         print(detail);
        }
      }
      (groupedExceptions[category] ??= []).add(detail);
      ++numExceptions;
    }
  
  
negative.code:   assert(listener.numExceptions == 0);
    for (var package in packages) {
      print('Migrating $package');
      listener.currentPackage = package.name;
      var testUri = thisSdkUri.resolve(package.packagePath);
      var contextCollection = AnalysisContextCollectionImpl(
          includedPaths: [testUri.toFilePath()], sdkPath: sdk.sdkPath);
  