[ApiModel] Return min api only if holder is supported by type rewriting
Bug: b/237701688
Change-Id: I540aa92197aae9795614a23d4a9f4d6a0c2f9811
diff --git a/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java b/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java
index b1b581b..50855bb 100644
--- a/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java
+++ b/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java
@@ -76,7 +76,10 @@
if (reference.getContextType() == factory.objectType) {
return appView.computedMinApiLevel();
}
- if (appView.options().machineDesugaredLibrarySpecification.isSupported(reference)) {
+ if (appView
+ .options()
+ .machineDesugaredLibrarySpecification
+ .isContextTypeMaintainedOrRewritten(reference)) {
// If we end up desugaring the reference, the library classes is bridged by j$ which is part
// of the program.
return appView.computedMinApiLevel();
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 dad5fd5..1b83bf8 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
@@ -197,11 +197,7 @@
}
public boolean isSupported(DexReference reference) {
- // Support through type rewriting.
- if (getRewriteType().containsKey(reference.getContextType())) {
- return true;
- }
- if (getMaintainType().contains(reference.getContextType())) {
+ if (isContextTypeMaintainedOrRewritten(reference)) {
return true;
}
if (!reference.isDexMethod()) {
@@ -223,6 +219,12 @@
return false;
}
+ public boolean isContextTypeMaintainedOrRewritten(DexReference reference) {
+ // Support through type rewriting.
+ return getRewriteType().containsKey(reference.getContextType())
+ || getMaintainType().contains(reference.getContextType());
+ }
+
@Override
public MachineDesugaredLibrarySpecification toMachineSpecification(
DexApplication app, Timing timing) throws IOException {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassV2Test.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassV2Test.java
index c535df2..102902a 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassV2Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassV2Test.java
@@ -75,8 +75,7 @@
}
})
.run(parameters.getRuntime(), Executor.class)
- .assertFailureWithErrorThatThrowsIf(!isDefinedOnBootClasspath(), NoSuchMethodError.class)
- .assertSuccessWithOutputIf(isDefinedOnBootClasspath(), EXPECTED_RESULT);
+ .assertSuccessWithOutput(EXPECTED_RESULT);
}
static class Executor {