Always rewrite java.lang.Record

- Rewrite in R8 without minification

Bug: 199359249
Change-Id: Ib77778cab21f7833216154b7e3fd7877c3df7a7b
diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java
index cb35339..7f17170 100644
--- a/src/main/java/com/android/tools/r8/D8.java
+++ b/src/main/java/com/android/tools/r8/D8.java
@@ -256,12 +256,9 @@
 
       InspectorImpl.runInspections(options.outputInspections, appView.appInfo().classes());
       NamingLens namingLens = NamingLens.getIdentityLens();
-      if (appView.rewritePrefix.isRewriting()) {
-        namingLens = PrefixRewritingNamingLens.createPrefixRewritingNamingLens(appView, namingLens);
-      }
-      if (appView.requiresRecordNamingLens()) {
-        namingLens = RecordRewritingNamingLens.createRecordRewritingNamingLens(appView, namingLens);
-      }
+      namingLens = PrefixRewritingNamingLens.createPrefixRewritingNamingLens(appView, namingLens);
+      namingLens = RecordRewritingNamingLens.createRecordRewritingNamingLens(appView, namingLens);
+
       if (options.isGeneratingClassFiles()) {
         ProguardMapSupplier proguardMapSupplier =
             finalizeApplication(inputApp, appView, namingLens);
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index d3c617c..02ef891 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -71,6 +71,7 @@
 import com.android.tools.r8.naming.PrefixRewritingNamingLens;
 import com.android.tools.r8.naming.ProguardMapMinifier;
 import com.android.tools.r8.naming.ProguardMapSupplier;
+import com.android.tools.r8.naming.RecordRewritingNamingLens;
 import com.android.tools.r8.naming.SeedMapper;
 import com.android.tools.r8.naming.SourceFileRewriter;
 import com.android.tools.r8.naming.signature.GenericSignatureRewriter;
@@ -842,15 +843,14 @@
         options.syntheticProguardRulesConsumer.accept(synthesizedProguardRules);
       }
 
-      NamingLens prefixRewritingNamingLens =
-          PrefixRewritingNamingLens.createPrefixRewritingNamingLens(appView, namingLens);
+      namingLens = PrefixRewritingNamingLens.createPrefixRewritingNamingLens(appView, namingLens);
+      namingLens = RecordRewritingNamingLens.createRecordRewritingNamingLens(appView, namingLens);
 
       timing.begin("MinifyKotlinMetadata");
-      new KotlinMetadataRewriter(appView, prefixRewritingNamingLens).runForR8(executorService);
+      new KotlinMetadataRewriter(appView, namingLens).runForR8(executorService);
       timing.end();
 
-      new GenericSignatureRewriter(
-              appView, prefixRewritingNamingLens, genericContextBuilderBeforeFinalMerging)
+      new GenericSignatureRewriter(appView, namingLens, genericContextBuilderBeforeFinalMerging)
           .run(appView.appInfo().classes(), executorService);
 
       assert appView.checkForTesting(
@@ -862,8 +862,7 @@
                           .isValid())
           : "Could not validate generic signatures";
 
-      new DesugaredLibraryKeepRuleGenerator(appView, prefixRewritingNamingLens)
-          .runIfNecessary(timing);
+      new DesugaredLibraryKeepRuleGenerator(appView, namingLens).runIfNecessary(timing);
 
       // Generate the resulting application resources.
       writeApplication(
@@ -871,7 +870,7 @@
           appView,
           appView.graphLens(),
           appView.initClassLens(),
-          prefixRewritingNamingLens,
+          namingLens,
           options,
           ProguardMapSupplier.create(classNameMapper, options));
 
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 ad326ed..72cddc2 100644
--- a/src/main/java/com/android/tools/r8/graph/AppView.java
+++ b/src/main/java/com/android/tools/r8/graph/AppView.java
@@ -81,7 +81,6 @@
 
   // Desugaring.
   public final PrefixRewritingMapper rewritePrefix;
-  private boolean requiresRecordNamingLens = false;
 
   // Modeling.
   private final LibraryMethodSideEffectModelCollection libraryMethodSideEffectModelCollection;
@@ -148,14 +147,6 @@
     return true;
   }
 
-  public boolean requiresRecordNamingLens() {
-    return requiresRecordNamingLens;
-  }
-
-  public void setRequiresRecordNamingLens() {
-    requiresRecordNamingLens = true;
-  }
-
   @Override
   public boolean isModeled(DexType type) {
     return libraryMemberOptimizer.isModeled(type);
diff --git a/src/main/java/com/android/tools/r8/graph/ApplicationReaderMap.java b/src/main/java/com/android/tools/r8/graph/ApplicationReaderMap.java
index 82b9d7f..5ce8224 100644
--- a/src/main/java/com/android/tools/r8/graph/ApplicationReaderMap.java
+++ b/src/main/java/com/android/tools/r8/graph/ApplicationReaderMap.java
@@ -12,7 +12,7 @@
 
   public static Map<String, String> getDescriptorMap(InternalOptions options) {
     ImmutableMap.Builder<String, String> builder = ImmutableMap.builder();
-    if (options.shouldDesugarRecords()) {
+    if (options.shouldDesugarRecords() && !options.testing.disableRecordApplicationReaderMap) {
       builder.put(DexItemFactory.recordTagDescriptorString, DexItemFactory.recordDescriptorString);
     }
     return builder.build();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordRewriter.java
index 5943b42..7fa0410 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordRewriter.java
@@ -421,7 +421,6 @@
   }
 
   private void ensureRecordClass(RecordDesugaringEventConsumer eventConsumer) {
-    appView.setRequiresRecordNamingLens();
     DexItemFactory factory = appView.dexItemFactory();
     checkRecordTagNotPresent(factory);
     appView
@@ -614,7 +613,6 @@
       throws ExecutionException {
     for (DexProgramClass clazz : programClasses) {
       if (clazz.isRecord()) {
-        assert appView.requiresRecordNamingLens();
         assert clazz.superType == factory.recordType;
         clazz.accessFlags.unsetRecord();
       }
diff --git a/src/main/java/com/android/tools/r8/naming/RecordRewritingNamingLens.java b/src/main/java/com/android/tools/r8/naming/RecordRewritingNamingLens.java
index ebada3d..f48cfc7 100644
--- a/src/main/java/com/android/tools/r8/naming/RecordRewritingNamingLens.java
+++ b/src/main/java/com/android/tools/r8/naming/RecordRewritingNamingLens.java
@@ -21,16 +21,16 @@
   final NamingLens namingLens;
   private final DexItemFactory factory;
 
-  public static NamingLens createRecordRewritingNamingLens(AppView<?> appView) {
-    return createRecordRewritingNamingLens(appView, NamingLens.getIdentityLens());
-  }
-
   public static NamingLens createRecordRewritingNamingLens(
       AppView<?> appView, NamingLens namingLens) {
-    if (!appView.options().shouldDesugarRecords()) {
-      return namingLens;
+    if (appView.options().shouldDesugarRecords()
+        && appView
+                .appInfo()
+                .definitionForWithoutExistenceAssert(appView.dexItemFactory().recordType)
+            != null) {
+      return new RecordRewritingNamingLens(namingLens, appView);
     }
-    return new RecordRewritingNamingLens(namingLens, appView);
+    return namingLens;
   }
 
   public RecordRewritingNamingLens(NamingLens namingLens, AppView<?> appView) {
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 2a44d85..860860b 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -1557,6 +1557,7 @@
     public Consumer<IRCode> inlineeIrModifier = null;
     public int basicBlockMuncherIterationLimit = NO_LIMIT;
     public boolean dontReportFailingCheckDiscarded = false;
+    public boolean disableRecordApplicationReaderMap = false;
     public PrintStream whyAreYouNotInliningConsumer = System.out;
     public boolean trackDesugaredAPIConversions =
         System.getProperty("com.android.tools.r8.trackDesugaredAPIConversions") != null;
diff --git a/src/test/java/com/android/tools/r8/desugar/records/RecordTestUtils.java b/src/test/java/com/android/tools/r8/desugar/records/RecordTestUtils.java
index bf74698..837ee72 100644
--- a/src/test/java/com/android/tools/r8/desugar/records/RecordTestUtils.java
+++ b/src/test/java/com/android/tools/r8/desugar/records/RecordTestUtils.java
@@ -5,6 +5,8 @@
 package com.android.tools.r8.desugar.records;
 
 import static com.android.tools.r8.TestRuntime.getCheckedInJdk8;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.JavaCompilerTool;
@@ -106,4 +108,11 @@
       }
     }
   }
+
+  public static void assertNoJavaLangRecord(Path output) throws IOException {
+    CodeInspector inspector =
+        new CodeInspector(
+            output, options -> options.testing.disableRecordApplicationReaderMap = true);
+    assertThat(inspector.clazz("java.lang.Record"), isAbsent());
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/records/SimpleRecordTest.java b/src/test/java/com/android/tools/r8/desugar/records/SimpleRecordTest.java
index 40f8af0..3656545 100644
--- a/src/test/java/com/android/tools/r8/desugar/records/SimpleRecordTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/records/SimpleRecordTest.java
@@ -6,6 +6,8 @@
 
 import static com.android.tools.r8.desugar.records.RecordTestUtils.RECORD_KEEP_RULE;
 
+import com.android.tools.r8.D8TestCompileResult;
+import com.android.tools.r8.R8TestCompileResult;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime.CfRuntime;
@@ -52,13 +54,14 @@
           .run(parameters.getRuntime(), MAIN_TYPE)
           .assertSuccessWithOutput(EXPECTED_RESULT);
     }
-    testForD8(parameters.getBackend())
-        .addProgramClassFileData(PROGRAM_DATA)
-        .setMinApi(parameters.getApiLevel())
-        .addOptionsModification(TestingOptions::allowExperimentClassFileVersion)
-        .compile()
-        .run(parameters.getRuntime(), MAIN_TYPE)
-        .assertSuccessWithOutput(EXPECTED_RESULT);
+    D8TestCompileResult compile =
+        testForD8(parameters.getBackend())
+            .addProgramClassFileData(PROGRAM_DATA)
+            .setMinApi(parameters.getApiLevel())
+            .addOptionsModification(TestingOptions::allowExperimentClassFileVersion)
+            .compile();
+    RecordTestUtils.assertNoJavaLangRecord(compile.writeToZip());
+    compile.run(parameters.getRuntime(), MAIN_TYPE).assertSuccessWithOutput(EXPECTED_RESULT);
   }
 
   @Test
@@ -82,14 +85,50 @@
           .assertSuccessWithOutput(EXPECTED_RESULT);
       return;
     }
-    testForR8(parameters.getBackend())
-        .addProgramClassFileData(PROGRAM_DATA)
-        .setMinApi(parameters.getApiLevel())
-        .addKeepRules(RECORD_KEEP_RULE)
-        .addKeepMainRule(MAIN_TYPE)
-        .addOptionsModification(TestingOptions::allowExperimentClassFileVersion)
-        .compile()
-        .run(parameters.getRuntime(), MAIN_TYPE)
-        .assertSuccessWithOutput(EXPECTED_RESULT);
+    R8TestCompileResult compile =
+        testForR8(parameters.getBackend())
+            .addProgramClassFileData(PROGRAM_DATA)
+            .setMinApi(parameters.getApiLevel())
+            .addKeepRules(RECORD_KEEP_RULE)
+            .addKeepMainRule(MAIN_TYPE)
+            .addOptionsModification(TestingOptions::allowExperimentClassFileVersion)
+            .compile();
+    RecordTestUtils.assertNoJavaLangRecord(compile.writeToZip());
+    compile.run(parameters.getRuntime(), MAIN_TYPE).assertSuccessWithOutput(EXPECTED_RESULT);
+  }
+
+  @Test
+  public void testR8NoMinification() throws Exception {
+    if (parameters.isCfRuntime()) {
+      Path output =
+          testForR8(parameters.getBackend())
+              .addProgramClassFileData(PROGRAM_DATA)
+              .noMinification()
+              .setMinApi(parameters.getApiLevel())
+              .addKeepRules(RECORD_KEEP_RULE)
+              .addKeepMainRule(MAIN_TYPE)
+              .addLibraryFiles(RecordTestUtils.getJdk15LibraryFiles(temp))
+              .addOptionsModification(TestingOptions::allowExperimentClassFileVersion)
+              .compile()
+              .writeToZip();
+      RecordTestUtils.assertRecordsAreRecords(output);
+      testForJvm()
+          .addRunClasspathFiles(output)
+          .enablePreview()
+          .run(parameters.getRuntime(), MAIN_TYPE)
+          .assertSuccessWithOutput(EXPECTED_RESULT);
+      return;
+    }
+    R8TestCompileResult compile =
+        testForR8(parameters.getBackend())
+            .addProgramClassFileData(PROGRAM_DATA)
+            .noMinification()
+            .setMinApi(parameters.getApiLevel())
+            .addKeepRules(RECORD_KEEP_RULE)
+            .addKeepMainRule(MAIN_TYPE)
+            .addOptionsModification(TestingOptions::allowExperimentClassFileVersion)
+            .compile();
+    RecordTestUtils.assertNoJavaLangRecord(compile.writeToZip());
+    compile.run(parameters.getRuntime(), MAIN_TYPE).assertSuccessWithOutput(EXPECTED_RESULT);
   }
 }