[ApiModel] Ensure we set api level for code when inlining
Bug: 197613376
Change-Id: I4f901b589cdbac7b2979764e3a068fa041f33726
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
index a20c5e4..0243703 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -1469,6 +1469,7 @@
if (from.hasClassFileVersion()) {
upgradeClassFileVersion(from.getClassFileVersion());
}
+ apiLevelForCode = getApiLevelForCode().max(from.getApiLevelForCode());
}
public MethodTypeSignature getGenericSignature() {
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelInlineInSameClassTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelInlineInSameClassTest.java
index 85e23f5..1ccb626 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelInlineInSameClassTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelInlineInSameClassTest.java
@@ -5,7 +5,10 @@
package com.android.tools.r8.apimodel;
import static com.android.tools.r8.apimodel.ApiModelingTestHelper.setMockApiLevelForMethod;
+import static com.android.tools.r8.apimodel.ApiModelingTestHelper.verifyThat;
+import static com.android.tools.r8.utils.AndroidApiLevel.L_MR1;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;
import com.android.tools.r8.TestBase;
@@ -38,6 +41,9 @@
@Test
public void testR8() throws Exception {
Method apiMethod = Api.class.getDeclaredMethod("apiLevel22");
+ Method callingApi = ApiCaller.class.getDeclaredMethod("callingApi");
+ Method notCallingApi = ApiCaller.class.getDeclaredMethod("notCallingApi");
+ Method main = Main.class.getDeclaredMethod("main", String[].class);
testForR8(parameters.getBackend())
.addProgramClasses(ApiCaller.class, ApiCallerCaller.class, Main.class)
.addLibraryClasses(Api.class)
@@ -47,13 +53,18 @@
.apply(setMockApiLevelForMethod(apiMethod, AndroidApiLevel.L_MR1))
.apply(ApiModelingTestHelper::enableApiCallerIdentification)
.compile()
+ .inspect(verifyThat(parameters, notCallingApi).inlinedIntoFromApiLevel(main, L_MR1))
.inspect(
inspector -> {
- // TODO(b/197613376): The call should not be inlined into Main.main if minApi > L_MR1.
- ClassSubject mainSubject = inspector.clazz(Main.class);
- MethodSubject mainMethodSubject = mainSubject.uniqueMethodWithName("main");
- assertThat(mainMethodSubject, isPresent());
- assertThat(mainMethodSubject, CodeMatchers.invokesMethodWithName("apiLevel22"));
+ // No matter the api level, we should always inline callingApi into notCallingApi.
+ assertThat(inspector.method(callingApi), not(isPresent()));
+ if (parameters.isDexRuntime()
+ && parameters.getApiLevel().isGreaterThanOrEqualTo(L_MR1)) {
+ ClassSubject mainSubject = inspector.clazz(Main.class);
+ MethodSubject mainMethodSubject = mainSubject.uniqueMethodWithName("main");
+ assertThat(mainMethodSubject, isPresent());
+ assertThat(mainMethodSubject, CodeMatchers.invokesMethodWithName("apiLevel22"));
+ }
})
.addRunClasspathClasses(Api.class)
.run(parameters.getRuntime(), Main.class)