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() {