Strengthen L8 assertions

Bug: b/243129774
Change-Id: I420208aeed6c2a9b7daa5ade07eb8cc139e2a535
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibrarySpecification.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibrarySpecification.java
index 233374b..de42de1 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibrarySpecification.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibrarySpecification.java
@@ -10,6 +10,7 @@
 import com.android.tools.r8.utils.Timing;
 import java.io.IOException;
 import java.util.List;
+import java.util.Set;
 
 public interface DesugaredLibrarySpecification {
 
@@ -31,6 +32,8 @@
 
   List<String> getExtraKeepRules();
 
+  Set<String> getMaintainTypeOrPrefixForTesting();
+
   AndroidApiLevel getRequiredCompilationApiLevel();
 
   MachineDesugaredLibrarySpecification toMachineSpecification(DexApplication app, Timing timing)
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java
index 2dcf7a4..b316972 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java
@@ -31,7 +31,6 @@
 import com.android.tools.r8.ir.desugar.desugaredlibrary.apiconversion.DesugaredLibraryWrapperSynthesizerEventConsumer.DesugaredLibraryL8ProgramWrapperSynthesizerEventConsumer;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.CustomConversionDescriptor;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineDesugaredLibrarySpecification;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.WrapperDescriptor;
 import com.android.tools.r8.ir.synthetic.apiconverter.NullableConversionCfCodeProvider;
 import com.android.tools.r8.ir.synthetic.apiconverter.NullableConversionCfCodeProvider.ArrayConversionCfCodeProvider;
 import com.android.tools.r8.ir.synthetic.apiconverter.WrapperConstructorCfCodeProvider;
@@ -727,22 +726,8 @@
   }
 
   private DexClass getWrapperContext(DexClass context, WrapperKind kind) {
-    if (kind != WrapperKind.VIVIFIED_WRAPPER) {
-      return context;
-    }
-    WrapperDescriptor descriptor =
-        appView.options().machineDesugaredLibrarySpecification.getWrappers().get(context.type);
-    assert descriptor != null;
-    if (descriptor.hasNonPublicAccess()) {
-      return appView
-          .getSyntheticItems()
-          .ensureFixedClasspathClassFromType(
-              kinds -> kinds.VIVIFIED,
-              vivifiedTypeFor(context.type),
-              appView,
-              ignored -> {},
-              ignored -> {});
-    }
+    // A different context can be specified here, so that the wrapper is prefixed by a different
+    // class than the context.
     return context;
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecification.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecification.java
index 49cc5f6..325cdb0 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecification.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecification.java
@@ -10,6 +10,7 @@
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.Timing;
 import java.util.List;
+import java.util.Set;
 
 public class HumanDesugaredLibrarySpecification implements DesugaredLibrarySpecification {
 
@@ -73,6 +74,11 @@
   }
 
   @Override
+  public Set<String> getMaintainTypeOrPrefixForTesting() {
+    return rewritingFlags.getMaintainPrefix();
+  }
+
+  @Override
   public List<String> getExtraKeepRules() {
     return topLevelFlags.getExtraKeepRules();
   }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyDesugaredLibrarySpecification.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyDesugaredLibrarySpecification.java
index cd236c0..3507445 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyDesugaredLibrarySpecification.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyDesugaredLibrarySpecification.java
@@ -15,6 +15,7 @@
 import com.android.tools.r8.ir.desugar.desugaredlibrary.specificationconversion.LegacyToHumanSpecificationConverter;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.Timing;
+import com.google.common.collect.ImmutableSet;
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
@@ -111,6 +112,11 @@
   }
 
   @Override
+  public Set<String> getMaintainTypeOrPrefixForTesting() {
+    return ImmutableSet.of();
+  }
+
+  @Override
   public String getJsonSource() {
     return topLevelFlags.getJsonSource();
   }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java
index 0278766..dc24bff 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java
@@ -21,6 +21,7 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.function.Consumer;
+import java.util.stream.Collectors;
 
 public class MachineDesugaredLibrarySpecification implements DesugaredLibrarySpecification {
 
@@ -103,6 +104,13 @@
     return topLevelFlags.getExtraKeepRules();
   }
 
+  @Override
+  public Set<String> getMaintainTypeOrPrefixForTesting() {
+    return rewritingFlags.getMaintainType().stream()
+        .map(DexType::toString)
+        .collect(Collectors.toSet());
+  }
+
   public Map<DexType, DexType> getRewriteType() {
     return rewritingFlags.getRewriteType();
   }
diff --git a/src/test/java/com/android/tools/r8/L8TestBuilder.java b/src/test/java/com/android/tools/r8/L8TestBuilder.java
index 89aa823..3050989 100644
--- a/src/test/java/com/android/tools/r8/L8TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/L8TestBuilder.java
@@ -8,6 +8,8 @@
 import static junit.framework.TestCase.assertTrue;
 
 import com.android.tools.r8.TestBase.Backend;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecification;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecificationParser;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidAppConsumers;
@@ -23,6 +25,7 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.function.Consumer;
 
@@ -204,16 +207,30 @@
             mapping,
             state,
             backend.isCf() ? OutputMode.ClassFile : OutputMode.DexIndexed)
-        .applyIf(
-            finalPrefixVerification,
-            compileResult ->
-                compileResult.inspect(
-                    inspector ->
-                        inspector.forAllClasses(
-                            clazz ->
-                                assertTrue(
-                                    clazz.getFinalName().startsWith("j$.")
-                                        || clazz.getFinalName().startsWith("java.")))));
+        .applyIf(finalPrefixVerification, this::validatePrefix);
+  }
+
+  private void validatePrefix(L8TestCompileResult compileResult) throws IOException {
+    InternalOptions options = new InternalOptions();
+    DesugaredLibrarySpecification specification =
+        DesugaredLibrarySpecificationParser.parseDesugaredLibrarySpecification(
+            this.desugaredLibrarySpecification,
+            options.dexItemFactory(),
+            options.reporter,
+            true,
+            apiLevel.getLevel());
+    Set<String> maintainTypeOrPrefix = specification.getMaintainTypeOrPrefixForTesting();
+    compileResult.inspect(
+        inspector ->
+            inspector.forAllClasses(
+                clazz -> {
+                  String finalName = clazz.getFinalName();
+                  if (finalName.startsWith("java.")) {
+                    assertTrue(maintainTypeOrPrefix.stream().anyMatch(finalName::startsWith));
+                  } else {
+                    assertTrue(finalName.startsWith("j$."));
+                  }
+                }));
   }
 
   private void assertNoUnexpectedDiagnosticMessages() {