[ApiModel] Lookup in database if class is missing
Bug: 209416097
Change-Id: I257ff8457500b6adf092b74e10103b9dffdd1b21
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 4e17f60..27fbc38 100644
--- a/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java
+++ b/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java
@@ -63,10 +63,7 @@
return appView.computedMinApiLevel();
}
DexClass clazz = appView.definitionFor(contextType);
- if (clazz == null) {
- return unknownValue;
- }
- if (!clazz.isLibraryClass()) {
+ if (clazz != null && clazz.isProgramClass()) {
return appView.computedMinApiLevel();
}
if (reference.getContextType() == factory.objectType) {
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoLibraryReferenceTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoLibraryReferenceTest.java
index 37da303..f80e5d2 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoLibraryReferenceTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoLibraryReferenceTest.java
@@ -4,7 +4,6 @@
package com.android.tools.r8.apimodel;
-import com.android.tools.r8.CompilationFailedException;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
@@ -37,36 +36,31 @@
public void testR8() throws Exception {
MethodReference main =
Reference.methodFromMethod(Main.class.getDeclaredMethod("main", String[].class));
- // TODO(b/209416097): Looking up the api level will give UNKNOWN since the class is missing.
- Assert.assertThrows(
- CompilationFailedException.class,
- () ->
- testForR8(parameters.getBackend())
- .addProgramClassFileData(
- transformer(Main.class)
- .replaceClassDescriptorInMethodInstructions(
- descriptor(AccessibilityEvent.class),
- DescriptorUtils.javaTypeToDescriptor(API_TYPE_NAME))
- .transform())
- // Add call to empty library classes to have no default android.jar passed in.
- .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
- .setMinApi(parameters.getApiLevel())
- .addDontWarn(API_TYPE_NAME)
- .addKeepMainRule(Main.class)
- .addAndroidBuildVersion()
- .apply(ApiModelingTestHelper::enableApiCallerIdentification)
- .apply(
- ApiModelingTestHelper.addTracedApiReferenceLevelCallBack(
- (methodReference, apiLevel) -> {
- if (methodReference.equals(main)) {
- Assert.assertEquals(
- parameters.isCfRuntime()
- ? AndroidApiLevel.R
- : AndroidApiLevel.R.max(parameters.getApiLevel()),
- apiLevel);
- }
- }))
- .compile());
+ testForR8(parameters.getBackend())
+ .addProgramClassFileData(
+ transformer(Main.class)
+ .replaceClassDescriptorInMethodInstructions(
+ descriptor(AccessibilityEvent.class),
+ DescriptorUtils.javaTypeToDescriptor(API_TYPE_NAME))
+ .transform())
+ .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
+ .setMinApi(parameters.getApiLevel())
+ .addDontWarn(API_TYPE_NAME)
+ .addKeepMainRule(Main.class)
+ .addAndroidBuildVersion()
+ .apply(ApiModelingTestHelper::enableApiCallerIdentification)
+ .apply(
+ ApiModelingTestHelper.addTracedApiReferenceLevelCallBack(
+ (methodReference, apiLevel) -> {
+ if (methodReference.equals(main)) {
+ Assert.assertEquals(
+ parameters.isCfRuntime()
+ ? AndroidApiLevel.R
+ : AndroidApiLevel.R.max(parameters.getApiLevel()),
+ apiLevel);
+ }
+ }))
+ .compile();
}
/* Only here to get the test to compile */