anchor.diff:    String infoFile,
     String coverageFile,
   ) async {
  -  var info = await infoFromFile(infoFile);
  -  var coverageRaw = jsonDecode(File(coverageFile).readAsStringSync());
  +  final info = await infoFromFile(infoFile);
  +  final coverageRaw = jsonDecode(File(coverageFile).readAsStringSync());
     // The value associated with each coverage item isn't used for now.
  -  var coverage = coverageRaw.keys.toSet();
  +  final coverage = coverageRaw.keys.toSet();
  +
  +  // Ensure that a used class's super, mixed in, and implemented classes are
  +  // correctly marked as used.
  +  final seen = <ClassInfo>{};
  +  void collectSupers(ClassInfo c) {
  +    if (seen.contains(c)) return;
  +    seen.add(c);
  +    coverage.add(qualifiedName(c));
  +    c.supers.forEach(collectSupers);
  +  }
  +
  +  for (final c in info.classes) {
  +    if (coverage.contains(qualifiedName(c))) {
  +      c.supers.forEach(collectSupers);
  +    }
  +  }
   
     int totalProgramSize = info.program!.size;
     int totalLibSize = info.libraries.fold(0, (n, lib) => n + lib.size);
  
positive.code:     var used = coverage.contains(name);
  
      var groupName = libraryGroupName(i);
      (packageData[groupName] ??= PackageInfo()).add(i, used: used);
  
      if (used) {
        usedCode += i.size;
  
negative.code:     usedRatio = usedSize / totalSize;
    }
  }
  
  class RuntimeClassInfo {
    late String scheme;
    late String package;
    late String? path;
    late String name;
  
    late num size;
    late bool used;
    late bool inMainUnit;
    late ClassInfo info;
  
    bool annotated = false;
  
    RuntimeClassInfo();
  
    /// Ingests the output from Angular's info generator.
    ///
    /// Example: 'fully:qualified/path/to/file.dart - ClassName'
    RuntimeClassInfo.fromAngularInfo(String input) {
      final colonIndex = input.indexOf(':');
      if (colonIndex < 0) {
        throw ArgumentError('AngularInfo format cannot accept undefined schemes.'
            ' No scheme found for: $input');
      }
      final slashIndex = input.indexOf('/');
      final spaceIndex = input.indexOf(' ');
      final separatorSize = ' - '.length;
      scheme = input.substring(0, colonIndex);
      if (slashIndex < 0) {
        path = null;
        package = input.substring(colonIndex + 1, spaceIndex);
      } else {
        package = input.substring(colonIndex + 1, slashIndex);
        path = input.substring(slashIndex + 1, spaceIndex);
      }
      name = input.substring(spaceIndex + separatorSize, input.length);
    }
  
    String get key =>
        '$package${path == null ? '' : '/$path'}:$name'.replaceAll('/lib/', '/');
  
    void annotateWithClassInfo(ClassInfo i, {bool used = true}) {
      size = i.size;
      this.used = used;
      inMainUnit = i.outputUnit!.name == 'main';
      info = i;
      annotated = true;
    }
  
    @override
    String toString() {
      return '$package/$path - $name';
    }
  }
  