Fix library overrides in the enqueuer with multi results
- When having both a program and a librayr class,
then overrides are library overrides
Bug: b/242948951
Change-Id: Ia5cf24c155d360ba96aabccaea2093008aa311fe
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index 1008d80..bb56ca2 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -2820,19 +2820,20 @@
WorkList<DexType> worklist = WorkList.newIdentityWorkList(type);
worklist.addIfNotSeen(interfaces);
while (worklist.hasNext()) {
- DexClass clazz = appInfo().definitionFor(worklist.next());
- if (clazz == null) {
- continue;
- }
- if (clazz.isProgramClass()) {
- markProgramMethodOverridesAsLive(instantiation, clazz.asProgramClass());
- } else {
- markLibraryAndClasspathMethodOverridesAsLive(instantiation, clazz);
- }
- if (clazz.superType != null) {
- worklist.addIfNotSeen(clazz.superType);
- }
- worklist.addIfNotSeen(clazz.interfaces);
+ ClassResolutionResult classResolutionResult =
+ appInfo().contextIndependentDefinitionForWithResolutionResult(worklist.next());
+ classResolutionResult.forEachClassResolutionResult(
+ clazz -> {
+ if (clazz.isProgramClass()) {
+ markProgramMethodOverridesAsLive(instantiation, clazz.asProgramClass());
+ } else {
+ markLibraryAndClasspathMethodOverridesAsLive(instantiation, clazz);
+ }
+ if (clazz.superType != null) {
+ worklist.addIfNotSeen(clazz.superType);
+ }
+ worklist.addIfNotSeen(clazz.interfaces);
+ });
}
}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StackWalkerTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StackWalkerTest.java
index 0b8c8d4..8a0cd60 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StackWalkerTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StackWalkerTest.java
@@ -40,6 +40,8 @@
Paths.get(ToolHelper.EXAMPLES_JAVA9_BUILD_DIR + "stackwalker.jar");
private static final String EXPECTED_OUTPUT =
StringUtils.lines("[main]", "[frame2, frame1, main]");
+ private static final String EXPECTED_OUTPUT_R8_MINIMAL = StringUtils.lines("[main]", "[main]");
+ private static final String EXPECTED_OUTPUT_R8 = StringUtils.lines("[main]", "[a, main]");
private static final String MAIN_CLASS = "stackwalker.Example";
@Parameters(name = "{0}, spec: {1}, {2}")
@@ -74,19 +76,25 @@
@Test
public void testDesugaredLibrary() throws Throwable {
- Assume.assumeTrue(
- "TODO(b/242948951): Issue with maintain type on function",
- !compilationSpecification.isL8Shrink());
testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification)
.addProgramFiles(INPUT_JAR)
.addKeepMainRule(MAIN_CLASS)
+ // TODO(b/242948951): Should not need dontobfuscate.
+ .applyIf(compilationSpecification.isL8Shrink(), b -> b.addL8KeepRules("-dontobfuscate"))
.overrideLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.MASTER))
// Missing class java.lang.StackWalker$StackFrame.
.addOptionsModification(opt -> opt.ignoreMissingClasses = true)
.applyIf(
- libraryDesugaringSpecification != JDK11_MINIMAL,
+ libraryDesugaringSpecification != JDK11_MINIMAL
+ || parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.MASTER),
DesugaredLibraryTestBuilder::allowDiagnosticWarningMessages)
.run(parameters.getRuntime(), MAIN_CLASS)
- .assertSuccessWithOutput(EXPECTED_OUTPUT);
+ .assertSuccessWithOutput(
+ compilationSpecification.isProgramShrink()
+ ? ((libraryDesugaringSpecification == JDK11_MINIMAL
+ || parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.MASTER))
+ ? EXPECTED_OUTPUT_R8_MINIMAL
+ : EXPECTED_OUTPUT_R8)
+ : EXPECTED_OUTPUT);
}
}