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);
}
}