Reland "Move syntetic finalization over repackaging"

This reverts commit 284526834c2c4bf28197566e9ca131c4d39b77cb.

Change-Id: I5a6ed0db31c917f33ebb242af712d72752e32518
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 885ada8..e237dcc 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -70,7 +70,6 @@
 import com.android.tools.r8.naming.signature.GenericSignatureRewriter;
 import com.android.tools.r8.optimize.ClassAndMemberPublicizer;
 import com.android.tools.r8.optimize.MemberRebindingAnalysis;
-import com.android.tools.r8.optimize.MemberRebindingIdentityLens;
 import com.android.tools.r8.optimize.MemberRebindingIdentityLensFactory;
 import com.android.tools.r8.optimize.VisibilityBridgeRemover;
 import com.android.tools.r8.optimize.bridgehoisting.BridgeHoisting;
@@ -712,9 +711,15 @@
         assert !options.isShrinking();
       }
 
-      MemberRebindingIdentityLens memberRebindingLens =
-          MemberRebindingIdentityLensFactory.create(appView, executorService);
-      appView.setGraphLens(memberRebindingLens);
+      // Insert a member rebinding oracle in the graph to ensure that all subsequent rewritings of
+      // the application has an applied oracle for looking up non-rebound references.
+      appView.setGraphLens(MemberRebindingIdentityLensFactory.create(appView, executorService));
+
+      if (appView.appInfo().hasLiveness()) {
+        SyntheticFinalization.finalizeWithLiveness(appView.withLiveness(), executorService);
+      } else {
+        SyntheticFinalization.finalizeWithClassHierarchy(appView, executorService);
+      }
 
       // Read any -applymapping input to allow for repackaging to not relocate the classes.
       timing.begin("read -applymapping file");
@@ -728,24 +733,13 @@
         RepackagingLens lens =
             new Repackaging(appView.withLiveness()).run(appBuilder, executorService, timing);
         if (lens != null) {
-          // Specify to use the member rebinding lens as the parent lens during the rewriting. This
-          // is needed to ensure that the rebound references are available during lens lookups.
-          // TODO(b/168282032): This call-site should not have to think about the parent lens that
-          //  is used for the rewriting. Once the new member rebinding lens replaces the old member
-          //  rebinding analysis it should be possible to clean this up.
-          appView.rewriteWithLensAndApplication(
-              lens, appBuilder.build(), memberRebindingLens.getPrevious());
+          appView.rewriteWithLensAndApplication(lens, appBuilder.build());
         }
       }
       if (appView.appInfo().hasLiveness()) {
         assert Repackaging.verifyIdentityRepackaging(appView.withLiveness());
       }
 
-      if (appView.appInfo().hasLiveness()) {
-        SyntheticFinalization.finalizeWithLiveness(appView.withLiveness(), executorService);
-      } else {
-        SyntheticFinalization.finalizeWithClassHierarchy(appView, executorService);
-      }
 
       // Clear the reference type lattice element cache. This is required since class merging may
       // need to build IR.
diff --git a/src/main/java/com/android/tools/r8/graph/AppView.java b/src/main/java/com/android/tools/r8/graph/AppView.java
index b740f3d..db99838 100644
--- a/src/main/java/com/android/tools/r8/graph/AppView.java
+++ b/src/main/java/com/android/tools/r8/graph/AppView.java
@@ -795,6 +795,7 @@
     while (firstUnappliedLens.getPrevious() != appliedLens) {
       GraphLens previousLens = firstUnappliedLens.getPrevious();
       assert previousLens.isNonIdentityLens();
+      assert previousLens != appView.codeLens();
       firstUnappliedLens = previousLens.asNonIdentityLens();
     }
 
@@ -802,22 +803,24 @@
     // TODO(b/182129249): Once the member rebinding phase has been removed, the MemberRebindingLens
     //  should be removed and all uses of FieldRebindingIdentityLens should be replaced by
     //  MemberRebindingIdentityLens.
-    NonIdentityGraphLens appliedMemberRebindingLens =
-        firstUnappliedLens.findPrevious(
-            previous ->
-                previous.isMemberRebindingLens() || previous.isMemberRebindingIdentityLens());
-    GraphLens newMemberRebindingLens;
-    if (appliedMemberRebindingLens != null) {
-      newMemberRebindingLens =
-          appliedMemberRebindingLens.isMemberRebindingLens()
-              ? appliedMemberRebindingLens
-                  .asMemberRebindingLens()
-                  .toRewrittenFieldRebindingLens(appView, appliedLens)
-              : appliedMemberRebindingLens
-                  .asMemberRebindingIdentityLens()
-                  .toRewrittenMemberRebindingIdentityLens(appView, appliedLens);
-    } else {
-      newMemberRebindingLens = GraphLens.getIdentityLens();
+    GraphLens newMemberRebindingLens = GraphLens.getIdentityLens();
+    if (!firstUnappliedLens.isMemberRebindingLens()
+        && !firstUnappliedLens.isMemberRebindingIdentityLens()) {
+      NonIdentityGraphLens appliedMemberRebindingLens =
+          firstUnappliedLens.findPreviousUntil(
+              previous ->
+                  previous.isMemberRebindingLens() || previous.isMemberRebindingIdentityLens(),
+              previous -> previous == appView.codeLens());
+      if (appliedMemberRebindingLens != null) {
+        newMemberRebindingLens =
+            appliedMemberRebindingLens.isMemberRebindingLens()
+                ? appliedMemberRebindingLens
+                    .asMemberRebindingLens()
+                    .toRewrittenFieldRebindingLens(appView, appliedLens)
+                : appliedMemberRebindingLens
+                    .asMemberRebindingIdentityLens()
+                    .toRewrittenMemberRebindingIdentityLens(appView, appliedLens);
+      }
     }
 
     firstUnappliedLens.withAlternativeParentLens(
diff --git a/src/main/java/com/android/tools/r8/graph/GraphLens.java b/src/main/java/com/android/tools/r8/graph/GraphLens.java
index 952c31d..188211d 100644
--- a/src/main/java/com/android/tools/r8/graph/GraphLens.java
+++ b/src/main/java/com/android/tools/r8/graph/GraphLens.java
@@ -400,7 +400,7 @@
 
   public abstract DexType lookupType(DexType type, GraphLens applied);
 
-  // This overload can be used when the graph lens is known to be context insensitive.
+  @Deprecated
   public final DexMethod lookupMethod(DexMethod method) {
     assert verifyIsContextFreeForMethod(method);
     return lookupMethod(method, null, null).getReference();
@@ -410,22 +410,47 @@
     return lookupMethod(method, context.getReference(), Type.DIRECT);
   }
 
+  public final MethodLookupResult lookupInvokeDirect(
+      DexMethod method, ProgramMethod context, GraphLens codeLens) {
+    return lookupMethod(method, context.getReference(), Type.DIRECT, codeLens);
+  }
+
   public final MethodLookupResult lookupInvokeInterface(DexMethod method, ProgramMethod context) {
     return lookupMethod(method, context.getReference(), Type.INTERFACE);
   }
 
+  public final MethodLookupResult lookupInvokeInterface(
+      DexMethod method, ProgramMethod context, GraphLens codeLens) {
+    return lookupMethod(method, context.getReference(), Type.INTERFACE, codeLens);
+  }
+
   public final MethodLookupResult lookupInvokeStatic(DexMethod method, ProgramMethod context) {
     return lookupMethod(method, context.getReference(), Type.STATIC);
   }
 
+  public final MethodLookupResult lookupInvokeStatic(
+      DexMethod method, ProgramMethod context, GraphLens codeLens) {
+    return lookupMethod(method, context.getReference(), Type.STATIC, codeLens);
+  }
+
   public final MethodLookupResult lookupInvokeSuper(DexMethod method, ProgramMethod context) {
     return lookupMethod(method, context.getReference(), Type.SUPER);
   }
 
+  public final MethodLookupResult lookupInvokeSuper(
+      DexMethod method, ProgramMethod context, GraphLens codeLens) {
+    return lookupMethod(method, context.getReference(), Type.SUPER, codeLens);
+  }
+
   public final MethodLookupResult lookupInvokeVirtual(DexMethod method, ProgramMethod context) {
     return lookupMethod(method, context.getReference(), Type.VIRTUAL);
   }
 
+  public final MethodLookupResult lookupInvokeVirtual(
+      DexMethod method, ProgramMethod context, GraphLens codeLens) {
+    return lookupMethod(method, context.getReference(), Type.VIRTUAL, codeLens);
+  }
+
   public final MethodLookupResult lookupMethod(DexMethod method, DexMethod context, Type type) {
     return lookupMethod(method, context, type, null);
   }
@@ -816,6 +841,13 @@
       return previous.isNonIdentityLens() ? previous.asNonIdentityLens().find(predicate) : null;
     }
 
+    public final <T extends NonIdentityGraphLens> T findPreviousUntil(
+        Predicate<NonIdentityGraphLens> predicate,
+        Predicate<NonIdentityGraphLens> stoppingCriterion) {
+      T found = findPrevious(predicate.or(stoppingCriterion));
+      return (found == null || stoppingCriterion.test(found)) ? null : found;
+    }
+
     public final void withAlternativeParentLens(GraphLens lens, Action action) {
       GraphLens oldParent = getPrevious();
       previousLens = lens;
diff --git a/src/main/java/com/android/tools/r8/repackaging/RepackagingAnnotationTracer.java b/src/main/java/com/android/tools/r8/repackaging/RepackagingAnnotationTracer.java
index f52b8b7..d119f1c 100644
--- a/src/main/java/com/android/tools/r8/repackaging/RepackagingAnnotationTracer.java
+++ b/src/main/java/com/android/tools/r8/repackaging/RepackagingAnnotationTracer.java
@@ -13,16 +13,19 @@
 import com.android.tools.r8.graph.DexEncodedAnnotation;
 import com.android.tools.r8.graph.DexMethodHandle;
 import com.android.tools.r8.graph.DexValue;
+import com.android.tools.r8.graph.GraphLens;
 import com.android.tools.r8.graph.ParameterAnnotationsList;
 
 public class RepackagingAnnotationTracer {
 
   private final AppInfoWithClassHierarchy appInfo;
+  private final GraphLens graphLens;
   private final RepackagingUseRegistry registry;
 
   public RepackagingAnnotationTracer(
       AppView<? extends AppInfoWithClassHierarchy> appView, RepackagingUseRegistry registry) {
     this.appInfo = appView.appInfo();
+    this.graphLens = appView.graphLens();
     this.registry = registry;
   }
 
@@ -39,7 +42,7 @@
   }
 
   private void traceEncodedAnnotation(DexEncodedAnnotation annotation) {
-    registry.registerTypeReference(annotation.type);
+    registry.registerTypeReference(annotation.type, graphLens);
     annotation.forEachElement(this::traceAnnotationElement);
   }
 
@@ -94,11 +97,14 @@
         break;
 
       case METHOD_TYPE:
-        value.asDexValueMethodType().getValue().forEachType(registry::registerTypeReference);
+        value
+            .asDexValueMethodType()
+            .getValue()
+            .forEachType(type -> registry.registerTypeReference(type, graphLens));
         break;
 
       case TYPE:
-        registry.registerTypeReference(value.asDexValueType().getValue());
+        registry.registerTypeReference(value.asDexValueType().getValue(), graphLens);
         break;
 
       default:
diff --git a/src/main/java/com/android/tools/r8/repackaging/RepackagingConstraintGraph.java b/src/main/java/com/android/tools/r8/repackaging/RepackagingConstraintGraph.java
index 9854d69..e17be11 100644
--- a/src/main/java/com/android/tools/r8/repackaging/RepackagingConstraintGraph.java
+++ b/src/main/java/com/android/tools/r8/repackaging/RepackagingConstraintGraph.java
@@ -105,8 +105,8 @@
         new RepackagingUseRegistry(appView, this, clazz, libraryBoundaryNode);
 
     // Trace the references to the immediate super types.
-    registry.registerTypeReference(clazz.getSuperType());
-    clazz.interfaces.forEach(registry::registerTypeReference);
+    registry.registerTypeReference(clazz.getSuperType(), appView.graphLens());
+    clazz.interfaces.forEach(type -> registry.registerTypeReference(type, appView.graphLens()));
 
     // Trace the references from the class annotations.
     new RepackagingAnnotationTracer(appView, registry).trace(clazz.annotations());
@@ -114,10 +114,10 @@
     // Trace the references in the nest host and/or members.
     if (clazz.isInANest()) {
       if (clazz.isNestHost()) {
-        clazz.forEachNestMember(registry::registerTypeReference);
+        clazz.forEachNestMember(type -> registry.registerTypeReference(type, appView.graphLens()));
       } else {
         assert clazz.isNestMember();
-        registry.registerTypeReference(clazz.getNestHost());
+        registry.registerTypeReference(clazz.getNestHost(), appView.graphLens());
       }
     }
 
@@ -139,7 +139,7 @@
         new RepackagingUseRegistry(appView, this, field, libraryBoundaryNode);
 
     // Trace the type of the field.
-    registry.registerTypeReference(field.getReference().getType());
+    registry.registerTypeReference(field.getReference().getType(), appView.graphLens());
 
     // Trace the references in the field annotations.
     new RepackagingAnnotationTracer(appView, registry).trace(field.getDefinition().annotations());
@@ -151,7 +151,9 @@
         new RepackagingUseRegistry(appView, this, method, libraryBoundaryNode);
 
     // Trace the type references in the method signature.
-    definition.getProto().forEachType(registry::registerTypeReference);
+    definition
+        .getProto()
+        .forEachType(type -> registry.registerTypeReference(type, appView.graphLens()));
 
     // Check if this overrides a package-private method.
     DexClass superClass =
diff --git a/src/main/java/com/android/tools/r8/repackaging/RepackagingUseRegistry.java b/src/main/java/com/android/tools/r8/repackaging/RepackagingUseRegistry.java
index 5c5a857..1339cbf 100644
--- a/src/main/java/com/android/tools/r8/repackaging/RepackagingUseRegistry.java
+++ b/src/main/java/com/android/tools/r8/repackaging/RepackagingUseRegistry.java
@@ -9,6 +9,7 @@
 import com.android.tools.r8.graph.AccessFlags;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.ClassAccessFlags;
+import com.android.tools.r8.graph.Code;
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexClassAndMember;
 import com.android.tools.r8.graph.DexField;
@@ -16,6 +17,7 @@
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.EnclosingMethodAttribute;
+import com.android.tools.r8.graph.GraphLens;
 import com.android.tools.r8.graph.InitClassLens;
 import com.android.tools.r8.graph.InnerClassAttribute;
 import com.android.tools.r8.graph.MemberResolutionResult;
@@ -36,10 +38,13 @@
 
   private final AppInfoWithLiveness appInfo;
   private final InternalOptions options;
+  private final GraphLens graphLens;
   private final RepackagingConstraintGraph constraintGraph;
   private final InitClassLens initClassLens;
   private final RepackagingConstraintGraph.Node node;
   private final RepackagingConstraintGraph.Node missingTypeNode;
+  private final GraphLens codeLens;
+  private final ProgramMethod methodContext;
 
   public RepackagingUseRegistry(
       AppView<AppInfoWithLiveness> appView,
@@ -51,8 +56,18 @@
     this.options = appView.options();
     this.constraintGraph = constraintGraph;
     this.initClassLens = appView.initClassLens();
+    this.graphLens = appView.graphLens();
     this.node = constraintGraph.getNode(context.getDefinition());
     this.missingTypeNode = missingTypeNode;
+    GraphLens codeLens = appView.graphLens();
+    if (context.isMethod()) {
+      Code code = context.asMethod().getDefinition().getCode();
+      if (code != null) {
+        codeLens = code.getCodeLens(appView);
+      }
+    }
+    this.codeLens = codeLens;
+    methodContext = context.isMethod() ? context.asMethod() : null;
   }
 
   private boolean isOnlyAccessibleFromSamePackage(DexClass referencedClass) {
@@ -60,11 +75,8 @@
     if (accessFlags.isPackagePrivate()) {
       return true;
     }
-    if (accessFlags.isProtected()
-        && !appInfo.isSubtype(getContext().getContextType(), referencedClass.getType())) {
-      return true;
-    }
-    return false;
+    return accessFlags.isProtected()
+        && !appInfo.isSubtype(getContext().getContextType(), referencedClass.getType());
   }
 
   private boolean isOnlyAccessibleFromSamePackage(
@@ -92,7 +104,7 @@
   }
 
   public void registerFieldAccess(DexField field) {
-    registerMemberAccess(appInfo.resolveField(field), false);
+    registerMemberAccess(appInfo.resolveField(graphLens.lookupField(field)), false);
   }
 
   public ProgramMethod registerMethodReference(DexMethod method) {
@@ -189,32 +201,46 @@
 
   @Override
   public void registerInitClass(DexType type) {
-    registerFieldAccess(initClassLens.getInitClassField(type));
+    registerMemberAccess(
+        appInfo.resolveField(initClassLens.getInitClassField(graphLens.lookupClassType(type))),
+        false);
   }
 
   @Override
   public void registerInvokeVirtual(DexMethod invokedMethod) {
-    registerMemberAccessForInvoke(appInfo.resolveMethod(invokedMethod, false));
+    registerMemberAccessForInvoke(
+        appInfo.resolveMethod(
+            graphLens.lookupInvokeVirtual(invokedMethod, methodContext, codeLens).getReference(),
+            false));
   }
 
   @Override
   public void registerInvokeDirect(DexMethod invokedMethod) {
-    registerMemberAccessForInvoke(appInfo.unsafeResolveMethodDueToDexFormat(invokedMethod));
+    registerMemberAccessForInvoke(
+        appInfo.unsafeResolveMethodDueToDexFormat(
+            graphLens.lookupInvokeDirect(invokedMethod, methodContext, codeLens).getReference()));
   }
 
   @Override
   public void registerInvokeStatic(DexMethod invokedMethod) {
-    registerMemberAccessForInvoke(appInfo.unsafeResolveMethodDueToDexFormat(invokedMethod));
+    registerMemberAccessForInvoke(
+        appInfo.unsafeResolveMethodDueToDexFormat(
+            graphLens.lookupInvokeStatic(invokedMethod, methodContext, codeLens).getReference()));
   }
 
   @Override
   public void registerInvokeInterface(DexMethod invokedMethod) {
-    registerMemberAccessForInvoke(appInfo.resolveMethod(invokedMethod, true));
+    registerMemberAccessForInvoke(
+        appInfo.resolveMethod(
+            graphLens.lookupInvokeInterface(invokedMethod, methodContext, codeLens).getReference(),
+            true));
   }
 
   @Override
   public void registerInvokeSuper(DexMethod invokedMethod) {
-    registerMemberAccessForInvoke(appInfo.unsafeResolveMethodDueToDexFormat(invokedMethod));
+    registerMemberAccessForInvoke(
+        appInfo.unsafeResolveMethodDueToDexFormat(
+            graphLens.lookupInvokeSuper(invokedMethod, methodContext, codeLens).getReference()));
   }
 
   @Override
@@ -229,7 +255,7 @@
 
   @Override
   public void registerNewInstance(DexType type) {
-    registerTypeAccess(type);
+    registerTypeAccess(graphLens.lookupClassType(type));
   }
 
   @Override
@@ -244,12 +270,16 @@
 
   @Override
   public void registerTypeReference(DexType type) {
-    registerTypeAccess(type);
+    registerTypeReference(type, codeLens);
+  }
+
+  public void registerTypeReference(DexType type, GraphLens applied) {
+    registerTypeAccess(graphLens.lookupType(type, applied));
   }
 
   @Override
   public void registerInstanceOf(DexType type) {
-    registerTypeAccess(type);
+    registerTypeAccess(graphLens.lookupType(type));
   }
 
   public void registerEnclosingMethodAttribute(EnclosingMethodAttribute enclosingMethodAttribute) {
diff --git a/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingLambdaRepackageTest.java b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingLambdaRepackageTest.java
index c85c55b..6c799bd 100644
--- a/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingLambdaRepackageTest.java
+++ b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingLambdaRepackageTest.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.naming.applymapping;
 
-import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.NeverClassInline;
 import com.android.tools.r8.NeverInline;
@@ -50,14 +50,8 @@
             .addApplyMapping(firstRunResult.proguardMap())
             .compile()
             .run(parameters.getRuntime(), Main.class);
-    if (parameters.isDexRuntime()) {
-      // TODO(b/218793832): Should be the same map.
-      assertNotEquals(firstRunResult.proguardMap(), secondRunResult.proguardMap());
-    }
-    secondRunResult
-        .assertSuccessWithOutputLinesIf(parameters.isCfRuntime(), "Hello World")
-        // TODO(b/218793832): Should not fail with an error.
-        .assertFailureWithErrorThatThrowsIf(parameters.isDexRuntime(), IllegalAccessError.class);
+    assertEquals(firstRunResult.proguardMap(), secondRunResult.proguardMap());
+    secondRunResult.assertSuccessWithOutputLines("Hello World");
   }
 
   @NeverClassInline
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageWithSyntheticItemTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageWithSyntheticItemTest.java
index 1a3bfca..7611b1c 100644
--- a/src/test/java/com/android/tools/r8/repackage/RepackageWithSyntheticItemTest.java
+++ b/src/test/java/com/android/tools/r8/repackage/RepackageWithSyntheticItemTest.java
@@ -64,11 +64,7 @@
                       .filter(item -> item.getFinalName().startsWith("foo"))
                       .collect(Collectors.toList());
               assertEquals(1, classesStartingWithfoo.size());
-              // TODO(b/172014416): We should not be able to look this up through the repackage name
-              String expectedOriginalNamePrefix =
-                  isFlattenPackageHierarchy()
-                      ? "foo.a.RepackageWithSyntheticItemTest$A"
-                      : "foo.RepackageWithSyntheticItemTest$A";
+              String expectedOriginalNamePrefix = typeName(A.class) + "$$ExternalSyntheticLambda0";
               assertThat(
                   classesStartingWithfoo.get(0).getOriginalName(),
                   containsString(expectedOriginalNamePrefix));
diff --git a/src/test/java/com/android/tools/r8/shaking/KeepAnnotatedMemberTest.java b/src/test/java/com/android/tools/r8/shaking/KeepAnnotatedMemberTest.java
index f85290d..369d584 100644
--- a/src/test/java/com/android/tools/r8/shaking/KeepAnnotatedMemberTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/KeepAnnotatedMemberTest.java
@@ -10,7 +10,6 @@
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.R8;
@@ -292,8 +291,7 @@
             .apply(this::configureHorizontalClassMerging)
             .compile()
             .graphInspector();
-    assertRetainedClassesEqual(
-        referenceInspector, ifHasMemberThenKeepClassInspector, true, true, true, true);
+    assertRetainedClassesEqual(referenceInspector, ifHasMemberThenKeepClassInspector);
   }
 
   private void configureHorizontalClassMerging(R8FullTestBuilder testBuilder) {
@@ -313,58 +311,27 @@
 
   private void assertRetainedClassesEqual(
       GraphInspector referenceResult, GraphInspector conditionalResult) {
-    assertRetainedClassesEqual(referenceResult, conditionalResult, false, false, false, false);
-  }
-
-  private void assertRetainedClassesEqual(
-      GraphInspector referenceResult,
-      GraphInspector conditionalResult,
-      boolean expectReferenceIsLarger,
-      boolean expectReferenceIsLargerOnlyBySynthetics,
-      boolean expectConditionalIsLarger,
-      boolean expectConditionalIsLargerOnlyBySynthetics) {
     Set<String> referenceClasses =
         new TreeSet<>(
             referenceResult.codeInspector().allClasses().stream()
                 .map(FoundClassSubject::getOriginalName)
                 .collect(Collectors.toSet()));
-
     Set<String> conditionalClasses =
         conditionalResult.codeInspector().allClasses().stream()
             .map(FoundClassSubject::getOriginalName)
             .collect(Collectors.toSet());
-    {
-      Set<String> notInReference =
-          new TreeSet<>(Sets.difference(conditionalClasses, referenceClasses));
-      if (expectConditionalIsLarger) {
-        assertFalse("Expected classes in -if rule to retain more.", notInReference.isEmpty());
-        if (expectConditionalIsLargerOnlyBySynthetics) {
-          assertAllClassesAreSynthetics(notInReference);
-        }
-      } else {
-        assertEquals(
-            "Classes in -if rule that are not in -keepclassmembers rule",
-            Collections.emptySet(),
-            notInReference);
-      }
-    }
-    {
-      Set<String> notInConditional =
-          new TreeSet<>(Sets.difference(referenceClasses, conditionalClasses));
-      if (expectReferenceIsLarger) {
-        assertFalse(
-            "Expected classes in -keepclassmembers rule to retain more.",
-            notInConditional.isEmpty());
-        if (expectReferenceIsLargerOnlyBySynthetics) {
-          assertAllClassesAreSynthetics(notInConditional);
-        }
-      } else {
-        assertEquals(
-            "Classes in -keepclassmembers rule that are not in -if rule",
-            Collections.emptySet(),
-            notInConditional);
-      }
-    }
+    Set<String> notInReference =
+        new TreeSet<>(Sets.difference(conditionalClasses, referenceClasses));
+    assertEquals(
+        "Classes in -if rule that are not in -keepclassmembers rule",
+        Collections.emptySet(),
+        notInReference);
+    Set<String> notInConditional =
+        new TreeSet<>(Sets.difference(referenceClasses, conditionalClasses));
+    assertEquals(
+        "Classes in -keepclassmembers rule that are not in -if rule",
+        Collections.emptySet(),
+        notInConditional);
   }
 
   private void assertAllClassesAreSynthetics(Set<String> classNames) {