Version 2.17.0-147.0.dev

Merge commit 'c16d5f01bd3a036b957d6ac00381cea1aa75adee' into 'dev'
diff --git a/pkg/_fe_analyzer_shared/test/macros/api/api_test_data.dart b/pkg/_fe_analyzer_shared/test/macros/api/api_test_data.dart
index 82c2e5f..b0fca36 100644
--- a/pkg/_fe_analyzer_shared/test/macros/api/api_test_data.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/api/api_test_data.dart
@@ -12,6 +12,14 @@
 @ClassMacro()
 abstract class Class2 {}
 
+@ClassMacro()
+class Class3 extends Class2 {}
+
+mixin Mixin {}
+
+@ClassMacro()
+class Class4 extends Class1 with Mixin {}
+
 @FunctionMacro()
 void topLevelFunction1(Class1 a, {Class1? b, required Class2? c}) {}
 
diff --git a/pkg/_fe_analyzer_shared/test/macros/api/api_test_expectations.dart b/pkg/_fe_analyzer_shared/test/macros/api/api_test_expectations.dart
index b43d1e6..388a6cc 100644
--- a/pkg/_fe_analyzer_shared/test/macros/api/api_test_expectations.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/api/api_test_expectations.dart
@@ -5,8 +5,10 @@
 import 'package:_fe_analyzer_shared/src/macros/api.dart';
 
 const Map<String, ClassData> expectedClassData = {
-  'Class1': ClassData(),
-  'Class2': ClassData(isAbstract: true),
+  'Class1': ClassData(superclassOf: 'Object'),
+  'Class2': ClassData(isAbstract: true, superclassOf: 'Object'),
+  'Class3': ClassData(superclassOf: 'Class2', superSuperclassOf: 'Object'),
+  'Class4': ClassData(superclassOf: 'Class1', superSuperclassOf: 'Object'),
 };
 
 const Map<String, FunctionData> expectedFunctionData = {
@@ -61,12 +63,25 @@
   checkTypeAnnotation(expected.type, declaration.type, '$context.type');
 }
 
-void checkClassDeclaration(ClassDeclaration declaration) {
+Future<void> checkClassDeclaration(ClassDeclaration declaration,
+    {ClassIntrospector? classIntrospector}) async {
   String name = declaration.identifier.name;
   ClassData? expected = expectedClassData[name];
   if (expected != null) {
     expect(expected.isAbstract, declaration.isAbstract, '$name.isAbstract');
     expect(expected.isExternal, declaration.isExternal, '$name.isExternal');
+    if (classIntrospector != null) {
+      ClassDeclaration? superclassOf =
+          await classIntrospector.superclassOf(declaration);
+      expect(expected.superclassOf, superclassOf?.identifier.name,
+          '$name.superclassOf');
+      if (superclassOf != null) {
+        ClassDeclaration? superSuperclassOf =
+            await classIntrospector.superclassOf(superclassOf);
+        expect(expected.superSuperclassOf, superSuperclassOf?.identifier.name,
+            '$name.superSuperclassOf');
+      }
+    }
     // TODO(johnniwinther): Test more properties when there are supported.
   } else {
     throw 'Unexpected class declaration "${name}"';
@@ -109,8 +124,14 @@
 class ClassData {
   final bool isAbstract;
   final bool isExternal;
+  final String superclassOf;
+  final String? superSuperclassOf;
 
-  const ClassData({this.isAbstract: false, this.isExternal: false});
+  const ClassData(
+      {this.isAbstract: false,
+      this.isExternal: false,
+      required this.superclassOf,
+      this.superSuperclassOf});
 }
 
 class FunctionData {
diff --git a/pkg/_fe_analyzer_shared/test/macros/api/api_test_macro.dart b/pkg/_fe_analyzer_shared/test/macros/api/api_test_macro.dart
index 2110615..de593f8 100644
--- a/pkg/_fe_analyzer_shared/test/macros/api/api_test_macro.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/api/api_test_macro.dart
@@ -13,18 +13,18 @@
   const ClassMacro();
 
   FutureOr<void> buildTypesForClass(
-      ClassDeclaration clazz, TypeBuilder builder) {
-    checkClassDeclaration(clazz);
+      ClassDeclaration clazz, TypeBuilder builder) async {
+    await checkClassDeclaration(clazz);
   }
 
   FutureOr<void> buildDeclarationsForClass(
-      ClassDeclaration clazz, ClassMemberDeclarationBuilder builder) {
-    checkClassDeclaration(clazz);
+      ClassDeclaration clazz, ClassMemberDeclarationBuilder builder) async {
+    await checkClassDeclaration(clazz, classIntrospector: builder);
   }
 
   FutureOr<void> buildDefinitionForClass(
-      ClassDeclaration clazz, ClassDefinitionBuilder builder) {
-    checkClassDeclaration(clazz);
+      ClassDeclaration clazz, ClassDefinitionBuilder builder) async {
+    await checkClassDeclaration(clazz, classIntrospector: builder);
   }
 }
 
diff --git a/tools/VERSION b/tools/VERSION
index 7ade7c2..ffed01d 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 146
+PRERELEASE 147
 PRERELEASE_PATCH 0
\ No newline at end of file