[api_summary] Include mixins in textual API summaries (#2417)
diff --git a/pkgs/api_summary/lib/src/api_description.dart b/pkgs/api_summary/lib/src/api_description.dart
index 7f88e35..9899c65 100644
--- a/pkgs/api_summary/lib/src/api_description.dart
+++ b/pkgs/api_summary/lib/src/api_description.dart
@@ -260,6 +260,7 @@
           case InterfaceElement(
             :final typeParameters,
             :final supertype,
+            :final mixins,
             :final interfaces,
           ):
             final instanceDescription = <Object?>[
@@ -284,6 +285,11 @@
                 ..._describeType(supertype),
               ]);
             }
+            if (mixins.isNotEmpty) {
+              instanceDescription.addAll(
+                mixins.map(_describeType).separatedBy(prefix: ' with '),
+              );
+            }
             if (element is MixinElement &&
                 element.superclassConstraints.isNotEmpty) {
               instanceDescription.addAll(
diff --git a/pkgs/api_summary/test/api_description_test.dart b/pkgs/api_summary/test/api_description_test.dart
index 0fa98b4..c860d46 100644
--- a/pkgs/api_summary/test/api_description_test.dart
+++ b/pkgs/api_summary/test/api_description_test.dart
@@ -36,6 +36,28 @@
     super.setUp();
   }
 
+  Future<void> test_class_mixins() async {
+    final summary = await _build({
+      '$testPackageLibPath/file.dart': '''
+mixin M1 {}
+mixin M2 {}
+class C1 extends Object with M1 {}
+class C2 extends Object with M2 implements M1 {}
+''',
+    });
+    expect(summary, '''
+package:test/file.dart:
+  C1 (class extends Object with M1):
+    new (constructor: C1 Function())
+  C2 (class extends Object with M2 implements M1):
+    new (constructor: C2 Function())
+  M1 (mixin on Object)
+  M2 (mixin on Object)
+dart:core:
+  Object (referenced)
+''');
+  }
+
   Future<void> test_class_modifiers() async {
     final summary = await _build({
       '$testPackageLibPath/file.dart': '''