Include superclass rules in baseline profile rules

Bug: b/349914130
Change-Id: If8a3c5aa346339580aa877c078e41b2f3847bc4e
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfile.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfile.java
index a8bce12..16058e4 100644
--- a/src/main/java/com/android/tools/r8/profile/art/ArtProfile.java
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfile.java
@@ -154,6 +154,9 @@
   }
 
   public ArtProfile rewrittenWithLens(AppView<?> appView, NamingLens lens) {
+    if (lens.isIdentityLens()) {
+      return this;
+    }
     DexItemFactory dexItemFactory = appView.dexItemFactory();
     assert !lens.isIdentityLens();
     return transform(
diff --git a/src/main/java/com/android/tools/r8/profile/art/NonEmptyArtProfileCollection.java b/src/main/java/com/android/tools/r8/profile/art/NonEmptyArtProfileCollection.java
index c98371b..926bab4 100644
--- a/src/main/java/com/android/tools/r8/profile/art/NonEmptyArtProfileCollection.java
+++ b/src/main/java/com/android/tools/r8/profile/art/NonEmptyArtProfileCollection.java
@@ -81,19 +81,18 @@
         return;
       }
     }
-    NonEmptyArtProfileCollection collection =
-        appView.getNamingLens().isIdentityLens()
-            ? this
-            : rewrittenWithLens(appView, appView.getNamingLens());
     InternalOptions options = appView.options();
     Collection<ArtProfileForRewriting> inputs =
         options.getArtProfileOptions().getArtProfilesForRewriting();
     assert !inputs.isEmpty();
-    assert collection.artProfiles.size() == inputs.size();
+    assert artProfiles.size() == inputs.size();
     Iterator<ArtProfileForRewriting> inputIterator = inputs.iterator();
-    for (ArtProfile artProfile : collection.artProfiles) {
+    for (ArtProfile artProfile : artProfiles) {
       ArtProfileForRewriting input = inputIterator.next();
-      artProfile.supplyConsumer(input.getResidualArtProfileConsumer(), options.reporter);
+      artProfile
+          .toProfileWithSuperclasses(appView)
+          .rewrittenWithLens(appView, appView.getNamingLens())
+          .supplyConsumer(input.getResidualArtProfileConsumer(), options.reporter);
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/profile/art/DesugaredLibraryArtProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/DesugaredLibraryArtProfileRewritingTest.java
index 811cb53..39ef47d 100644
--- a/src/test/java/com/android/tools/r8/profile/art/DesugaredLibraryArtProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/DesugaredLibraryArtProfileRewritingTest.java
@@ -113,6 +113,9 @@
             libraryDesugaringSpecification.functionPrefix(parameters) + ".util.function.Consumer");
     assertThat(consumerClassSubject, isPresent());
 
+    ClassSubject baseStreamClassSubject = inspector.clazz("j$.util.stream.BaseStream");
+    assertThat(baseStreamClassSubject, isPresentAndRenamed(compilationSpecification.isL8Shrink()));
+
     ClassSubject streamClassSubject = inspector.clazz("j$.util.stream.Stream");
     assertThat(streamClassSubject, isPresentAndNotRenamed());
 
@@ -124,7 +127,10 @@
                 && libraryDesugaringSpecification == LibraryDesugaringSpecification.JDK8));
     assertEquals(consumerClassSubject.asTypeSubject(), forEachMethodSubject.getParameter(0));
 
-    profileInspector.assertContainsMethodRule(forEachMethodSubject).assertContainsNoOtherRules();
+    profileInspector
+        .assertContainsClassRules(streamClassSubject, baseStreamClassSubject)
+        .assertContainsMethodRule(forEachMethodSubject)
+        .assertContainsNoOtherRules();
   }
 
   static class Main {
diff --git a/src/test/java/com/android/tools/r8/profile/art/IncludeTransitiveSuperClassesInArtProfileTest.java b/src/test/java/com/android/tools/r8/profile/art/IncludeTransitiveSuperClassesInArtProfileTest.java
index 8843a1d..322c207 100644
--- a/src/test/java/com/android/tools/r8/profile/art/IncludeTransitiveSuperClassesInArtProfileTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/IncludeTransitiveSuperClassesInArtProfileTest.java
@@ -42,9 +42,14 @@
         .compile()
         .inspectResidualArtProfile(
             (profile, inspector) ->
-                // TODO(b/349914130): Augment profile with transitive super classes.
                 profile
-                    .assertContainsClassRules(getFinalReference(C.class, inspector))
+                    .assertContainsClassRules(
+                        getFinalReference(A.class, inspector),
+                        getFinalReference(B.class, inspector),
+                        getFinalReference(C.class, inspector),
+                        getFinalReference(I.class, inspector),
+                        getFinalReference(J.class, inspector),
+                        getFinalReference(K.class, inspector))
                     .assertContainsNoOtherRules());
   }
 
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/ApiOutlineProfileRewritingShardTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/ApiOutlineProfileRewritingShardTest.java
index 709703c..aa6d410 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/ApiOutlineProfileRewritingShardTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/ApiOutlineProfileRewritingShardTest.java
@@ -17,6 +17,7 @@
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.profile.art.model.ExternalArtProfile;
 import com.android.tools.r8.profile.art.utils.ArtProfileInspector;
+import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.synthesis.SyntheticItemsTestUtils;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
@@ -145,6 +146,7 @@
 
     // Verify the residual profile contains the outline method and its holder when present.
     profileInspector
+        .assertContainsClassRule(Reference.classFromClass(mainClass))
         .assertContainsMethodRule(MethodReferenceUtils.mainMethod(mainClass))
         .applyIf(
             !isLibraryClassAlwaysPresent(),
@@ -172,8 +174,11 @@
 
     // Verify the residual profile contains the outline method and its holder when present.
     profileInspector
-        .assertContainsMethodRule(MethodReferenceUtils.mainMethod(Main.class))
-        .assertContainsMethodRule(MethodReferenceUtils.mainMethod(OtherMain.class))
+        .assertContainsClassRules(
+            Reference.classFromClass(Main.class), Reference.classFromClass(OtherMain.class))
+        .assertContainsMethodRules(
+            MethodReferenceUtils.mainMethod(Main.class),
+            MethodReferenceUtils.mainMethod(OtherMain.class))
         .applyIf(
             !isLibraryClassAlwaysPresent(),
             i ->
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/ApiOutlineProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/ApiOutlineProfileRewritingTest.java
index acd0d3f..12d2ef4 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/ApiOutlineProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/ApiOutlineProfileRewritingTest.java
@@ -18,6 +18,7 @@
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.profile.art.model.ExternalArtProfile;
 import com.android.tools.r8.profile.art.utils.ArtProfileInspector;
+import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.synthesis.SyntheticItemsTestUtils;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.MethodReferenceUtils;
@@ -146,6 +147,7 @@
 
     // Verify the residual profile contains the outline method and its holder when present.
     profileInspector
+        .assertContainsClassRule(Reference.classFromClass(Main.class))
         .assertContainsMethodRule(MethodReferenceUtils.mainMethod(Main.class))
         .applyIf(
             !isLibraryClassAlwaysPresent,
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/BackportProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/BackportProfileRewritingTest.java
index c3d0996..3a3b463 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/BackportProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/BackportProfileRewritingTest.java
@@ -13,6 +13,7 @@
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.profile.art.model.ExternalArtProfile;
 import com.android.tools.r8.profile.art.utils.ArtProfileInspector;
+import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.synthesis.SyntheticItemsTestUtils;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.InternalOptions.InlinerOptions;
@@ -96,6 +97,7 @@
 
     // Verify residual profile contains the backported method and its holder.
     profileInspector
+        .assertContainsClassRule(Reference.classFromClass(Main.class))
         .assertContainsMethodRules(MethodReferenceUtils.mainMethod(Main.class))
         .applyIf(
             isBackportingObjectsNonNull,
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/DefaultInterfaceMethodProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/DefaultInterfaceMethodProfileRewritingTest.java
index c5adb71..c9db8f6 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/DefaultInterfaceMethodProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/DefaultInterfaceMethodProfileRewritingTest.java
@@ -95,7 +95,9 @@
       MethodSubject interfaceMethodSubject = iClassSubject.uniqueMethodWithOriginalName("m");
       assertThat(interfaceMethodSubject, isPresent());
 
-      profileInspector.assertContainsMethodRule(interfaceMethodSubject);
+      profileInspector
+          .assertContainsClassRule(iClassSubject)
+          .assertContainsMethodRule(interfaceMethodSubject);
     } else {
       ClassSubject iClassSubject = inspector.clazz(I.class);
       assertThat(iClassSubject, isPresent());
@@ -125,7 +127,8 @@
       assertThat(movedMethodSubject, isPresent());
 
       profileInspector
-          .assertContainsClassRule(companionClassSubject)
+          .assertContainsClassRules(
+              aClassSubject, bClassSubject, iClassSubject, companionClassSubject)
           .assertContainsMethodRules(
               interfaceMethodSubject,
               aForwardingMethodSubject,
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/EnumUnboxingUtilityMethodProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/EnumUnboxingUtilityMethodProfileRewritingTest.java
index 04133ca..74cd8dd 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/EnumUnboxingUtilityMethodProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/EnumUnboxingUtilityMethodProfileRewritingTest.java
@@ -99,7 +99,9 @@
 
     profileInspector
         .assertContainsClassRules(
-            enumUnboxingLocalUtilityClassSubject, enumUnboxingSharedUtilityClassSubject)
+            mainClassSubject,
+            enumUnboxingLocalUtilityClassSubject,
+            enumUnboxingSharedUtilityClassSubject)
         .assertContainsMethodRules(
             mainClassSubject.mainMethod(),
             localGreetMethodSubject,
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/HorizontallyMergedConstructorMethodProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/HorizontallyMergedConstructorMethodProfileRewritingTest.java
index faea413..c909872 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/HorizontallyMergedConstructorMethodProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/HorizontallyMergedConstructorMethodProfileRewritingTest.java
@@ -76,6 +76,7 @@
       assertThat(syntheticConstructorSubject, isPresent());
 
       profileInspector
+          .assertContainsClassRule(aClassSubject)
           .assertContainsMethodRules(syntheticConstructorSubject)
           .applyIf(
               this == A_CONSTRUCTOR,
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/HorizontallyMergedVirtualMethodProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/HorizontallyMergedVirtualMethodProfileRewritingTest.java
index e4196f3..0ef50da 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/HorizontallyMergedVirtualMethodProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/HorizontallyMergedVirtualMethodProfileRewritingTest.java
@@ -70,6 +70,7 @@
       assertEquals(aClassSubject.asTypeSubject(), syntheticBridgeMethodSubject.getParameter(0));
 
       profileInspector
+          .assertContainsClassRule(aClassSubject)
           .assertContainsMethodRules(movedMethodSubject, syntheticBridgeMethodSubject)
           .assertContainsNoOtherRules();
     }
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/InvokeSpecialToVirtualMethodProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/InvokeSpecialToVirtualMethodProfileRewritingTest.java
index 0b423ed..08803aa 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/InvokeSpecialToVirtualMethodProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/InvokeSpecialToVirtualMethodProfileRewritingTest.java
@@ -132,6 +132,7 @@
 
     // Verify residual profile contains private synthetic method when present.
     profileInspector
+        .assertContainsClassRule(mainClassSubject)
         .assertContainsMethodRules(mMethodSubject, mMovedMethodSubject)
         .assertContainsNoOtherRules();
   }
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/LambdaStaticLibraryMethodImplementationProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/LambdaStaticLibraryMethodImplementationProfileRewritingTest.java
index 6eac7c2..56731cd 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/LambdaStaticLibraryMethodImplementationProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/LambdaStaticLibraryMethodImplementationProfileRewritingTest.java
@@ -4,8 +4,8 @@
 
 package com.android.tools.r8.profile.art.completeness;
 
+import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsentIf;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.notIf;
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import com.android.tools.r8.TestBase;
@@ -75,7 +75,7 @@
   }
 
   private void inspectD8(ArtProfileInspector profileInspector, CodeInspector inspector) {
-    inspect(profileInspector, inspector, false, false);
+    inspect(profileInspector, inspector, false, false, false);
   }
 
   private void inspectR8(ArtProfileInspector profileInspector, CodeInspector inspector) {
@@ -83,37 +83,44 @@
         profileInspector,
         inspector,
         parameters.canHaveNonReboundConstructorInvoke(),
-        parameters.isCfRuntime());
+        parameters.isCfRuntime(),
+        true);
   }
 
   public void inspect(
       ArtProfileInspector profileInspector,
       CodeInspector inspector,
       boolean canHaveNonReboundConstructorInvoke,
-      boolean canUseLambdas) {
+      boolean canUseLambdas,
+      boolean isR8) {
     ClassSubject mainClassSubject = inspector.clazz(Main.class);
     assertThat(mainClassSubject, isPresent());
 
     MethodSubject mainMethodSubject = mainClassSubject.mainMethod();
     assertThat(mainMethodSubject, isPresent());
 
+    ClassSubject setSupplierClassSubject = inspector.clazz(SetSupplier.class);
+    assertThat(setSupplierClassSubject, isAbsentIf(!canUseLambdas && isR8));
+
     // Check the presence of the lambda class and its methods.
     ClassSubject lambdaClassSubject =
         inspector.clazz(SyntheticItemsTestUtils.syntheticLambdaClass(Main.class, 0));
-    assertThat(lambdaClassSubject, notIf(isPresent(), canUseLambdas));
+    assertThat(lambdaClassSubject, isAbsentIf(canUseLambdas));
 
     MethodSubject lambdaInitializerSubject = lambdaClassSubject.uniqueInstanceInitializer();
-    assertThat(lambdaInitializerSubject, notIf(isPresent(), canUseLambdas));
+    assertThat(lambdaInitializerSubject, isAbsentIf(canUseLambdas));
 
     MethodSubject lambdaMainMethodSubject =
         lambdaClassSubject.uniqueMethodThatMatches(FoundMethodSubject::isVirtual);
-    assertThat(lambdaMainMethodSubject, notIf(isPresent(), canUseLambdas));
+    assertThat(lambdaMainMethodSubject, isAbsentIf(canUseLambdas));
 
-    if (canUseLambdas) {
-      profileInspector.assertContainsMethodRule(mainMethodSubject);
-    } else {
+    profileInspector
+        .assertContainsClassRules(mainClassSubject)
+        .assertContainsMethodRule(mainMethodSubject);
+    if (!canUseLambdas) {
       profileInspector
           .assertContainsClassRules(lambdaClassSubject)
+          .applyIf(!isR8, i -> i.assertContainsClassRule(setSupplierClassSubject))
           .assertContainsMethodRules(
               mainMethodSubject, lambdaInitializerSubject, lambdaMainMethodSubject);
     }
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/MovedPrivateInterfaceMethodProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/MovedPrivateInterfaceMethodProfileRewritingTest.java
index 632fc0b..53ab39f 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/MovedPrivateInterfaceMethodProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/MovedPrivateInterfaceMethodProfileRewritingTest.java
@@ -125,6 +125,7 @@
       assertThat(privateInterfaceMethodSubject, isPresent());
 
       profileInspector
+          .assertContainsClassRule(iClassSubject)
           .assertContainsMethodRule(privateInterfaceMethodSubject)
           .assertContainsNoOtherRules();
     } else {
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/MovedStaticInterfaceMethodProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/MovedStaticInterfaceMethodProfileRewritingTest.java
index ebf293e..7d06408 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/MovedStaticInterfaceMethodProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/MovedStaticInterfaceMethodProfileRewritingTest.java
@@ -141,6 +141,7 @@
       assertThat(staticInterfaceMethodSubject, isPresent());
 
       profileInspector
+          .assertContainsClassRule(iClassSubject)
           .assertContainsMethodRule(staticInterfaceMethodSubject)
           .assertContainsNoOtherRules();
     } else {
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/NestBasedAccessBridgesProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/NestBasedAccessBridgesProfileRewritingTest.java
index f296a71..5756f2e 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/NestBasedAccessBridgesProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/NestBasedAccessBridgesProfileRewritingTest.java
@@ -104,7 +104,12 @@
 
   private void inspectD8(ArtProfileInspector profileInspector, CodeInspector inspector)
       throws Exception {
-    inspect(profileInspector, inspector, false, parameters.canUseNestBasedAccessesWhenDesugaring());
+    inspect(
+        profileInspector,
+        inspector,
+        false,
+        parameters.canUseNestBasedAccessesWhenDesugaring(),
+        false);
   }
 
   private void inspectR8(ArtProfileInspector profileInspector, CodeInspector inspector)
@@ -113,14 +118,16 @@
         profileInspector,
         inspector,
         parameters.canHaveNonReboundConstructorInvoke(),
-        parameters.canUseNestBasedAccesses());
+        parameters.canUseNestBasedAccesses(),
+        true);
   }
 
   private void inspect(
       ArtProfileInspector profileInspector,
       CodeInspector inspector,
       boolean canHaveNonReboundConstructorInvoke,
-      boolean canUseNestBasedAccesses)
+      boolean canUseNestBasedAccesses,
+      boolean isR8)
       throws Exception {
     ClassSubject nestMemberClassSubject = inspector.clazz(NestMember.class);
     assertThat(nestMemberClassSubject, isPresent());
@@ -197,8 +204,12 @@
     // Verify the residual profile contains the synthetic nest based access bridges and the
     // synthetic constructor argument class.
     profileInspector
+        .assertContainsClassRule(Reference.classFromClass(Main.class))
         .assertContainsMethodRule(MethodReferenceUtils.mainMethod(Main.class))
         .applyIf(
+            !isR8 || parameters.isDexRuntime(),
+            i -> i.assertContainsClassRule(nestMemberClassSubject))
+        .applyIf(
             !canUseNestBasedAccesses,
             i ->
                 i.assertContainsMethodRules(
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/OutlineOptimizationProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/OutlineOptimizationProfileRewritingTest.java
index 1c0ac50..0c4ceca 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/OutlineOptimizationProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/OutlineOptimizationProfileRewritingTest.java
@@ -12,6 +12,7 @@
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.profile.art.model.ExternalArtProfile;
 import com.android.tools.r8.profile.art.utils.ArtProfileInspector;
+import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.synthesis.SyntheticItemsTestUtils;
 import com.android.tools.r8.utils.InternalOptions.InlinerOptions;
 import com.android.tools.r8.utils.MethodReferenceUtils;
@@ -70,6 +71,7 @@
 
     // TODO(b/265729283): Should contain the outline class and method.
     profileInspector
+        .assertContainsClassRule(Reference.classFromClass(Main.class))
         .assertContainsMethodRule(MethodReferenceUtils.mainMethod(Main.class))
         .assertContainsNoOtherRules();
   }
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/RecordProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/RecordProfileRewritingTest.java
index cbab790..f0cd1ab 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/RecordProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/RecordProfileRewritingTest.java
@@ -300,7 +300,7 @@
         toStringMethodSubject, ifThen(!canUseRecords, invokesMethod(toStringHelperMethodSubject)));
 
     profileInspector
-        .assertContainsClassRule(personRecordClassSubject)
+        .assertContainsClassRules(mainClassSubject, personRecordClassSubject)
         .assertContainsMethodRules(
             mainMethodSubject,
             personInstanceInitializerSubject,
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/SyntheticLambdaClassProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/SyntheticLambdaClassProfileRewritingTest.java
index 53fb532..a919381 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/SyntheticLambdaClassProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/SyntheticLambdaClassProfileRewritingTest.java
@@ -134,11 +134,13 @@
         switch (this) {
           case MAIN_METHOD:
             profileInspector
+                .assertContainsClassRule(mainClassSubject)
                 .assertContainsMethodRule(mainMethodSubject)
                 .assertContainsNoOtherRules();
             break;
           case IMPLEMENTATION_METHOD:
             profileInspector
+                .assertContainsClassRule(mainClassSubject)
                 .assertContainsMethodRules(
                     lambdaImplementationMethod, otherLambdaImplementationMethod)
                 .assertContainsNoOtherRules();
@@ -153,7 +155,8 @@
             // with their initializers. Since Main.lambda$main$*() is not in the art profile, the
             // interface method implementation does not need to be included in the profile.
             profileInspector
-                .assertContainsClassRules(lambdaClassSubject, otherLambdaClassSubject)
+                .assertContainsClassRules(
+                    mainClassSubject, lambdaClassSubject, otherLambdaClassSubject)
                 .assertContainsMethodRules(mainMethodSubject)
                 .applyIf(
                     !canHaveNonReboundConstructorInvoke,
@@ -166,6 +169,8 @@
             // Since Main.lambda$main$*() is in the art profile, so should the two accessibility
             // bridges be along with the main virtual methods of the lambda classes.
             profileInspector
+                .assertContainsClassRules(
+                    mainClassSubject, lambdaClassSubject, otherLambdaClassSubject)
                 .assertContainsMethodRules(
                     lambdaImplementationMethod,
                     lambdaMainMethodSubject,
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/TwrCloseResourceDuplicationProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/TwrCloseResourceDuplicationProfileRewritingTest.java
index b8db6f5..f840c33f 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/TwrCloseResourceDuplicationProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/TwrCloseResourceDuplicationProfileRewritingTest.java
@@ -159,11 +159,13 @@
         barClassSubject.uniqueMethodWithOriginalName("$closeResource");
     assertThat(barCloseResourceMethodSubject, isPresent());
 
-    profileInspector.assertContainsMethodRules(
-        fooMethodSubject,
-        fooCloseResourceMethodSubject,
-        barMethodSubject,
-        barCloseResourceMethodSubject);
+    profileInspector
+        .assertContainsClassRules(fooClassSubject, barClassSubject)
+        .assertContainsMethodRules(
+            fooMethodSubject,
+            fooCloseResourceMethodSubject,
+            barMethodSubject,
+            barCloseResourceMethodSubject);
 
     // There is 1 backport, 2 synthetic API outlines, and 3 twr classes for both Foo and Bar.
     for (JavaExampleClassProxy clazz : ImmutableList.of(FOO, BAR)) {
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/VerticalClassMergingBridgeProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/VerticalClassMergingBridgeProfileRewritingTest.java
index 4493de9..10b893b 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/VerticalClassMergingBridgeProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/VerticalClassMergingBridgeProfileRewritingTest.java
@@ -78,6 +78,7 @@
     assertThat(syntheticBridgeMethodSubject, isPresent());
 
     profileInspector
+        .assertContainsClassRule(bClassSubject)
         .assertContainsMethodRules(movedMethodSubject, syntheticBridgeMethodSubject)
         .assertContainsNoOtherRules();
   }
diff --git a/src/test/java/com/android/tools/r8/profile/art/format/ArtProfileWithCommentsAndWhitespaceTest.java b/src/test/java/com/android/tools/r8/profile/art/format/ArtProfileWithCommentsAndWhitespaceTest.java
index c5fdf6c..77ffaf9 100644
--- a/src/test/java/com/android/tools/r8/profile/art/format/ArtProfileWithCommentsAndWhitespaceTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/format/ArtProfileWithCommentsAndWhitespaceTest.java
@@ -100,7 +100,10 @@
   }
 
   private void inspectResidualArtProfile(ArtProfileInspector profileInspector) {
-    profileInspector.assertContainsMethodRule(MAIN_METHOD_REFERENCE).assertContainsNoOtherRules();
+    profileInspector
+        .assertContainsClassRule(MAIN_METHOD_REFERENCE.getHolderClass())
+        .assertContainsMethodRule(MAIN_METHOD_REFERENCE)
+        .assertContainsNoOtherRules();
   }
 
   static class Main {
diff --git a/src/test/java/com/android/tools/r8/profile/art/format/ArtProfileWithFlagsInAnyOrderTest.java b/src/test/java/com/android/tools/r8/profile/art/format/ArtProfileWithFlagsInAnyOrderTest.java
index 45ab398..f4a074d 100644
--- a/src/test/java/com/android/tools/r8/profile/art/format/ArtProfileWithFlagsInAnyOrderTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/format/ArtProfileWithFlagsInAnyOrderTest.java
@@ -114,6 +114,7 @@
 
   private void inspectResidualArtProfile(ArtProfileInspector profileInspector) {
     profileInspector
+        .assertContainsClassRule(MAIN_METHOD_REFERENCE.getHolderClass())
         .inspectMethodRule(
             MAIN_METHOD_REFERENCE,
             ruleInspector -> ruleInspector.assertIsHot().assertIsStartup().assertIsPostStartup())