Update backports for Android R
Don't backport Android R APIs for min API of Android R.
BUG=154759404
Change-Id: Idac859700c60975af47259a5ed6de928ecdf7f87
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
index 49c8000..706cfa0 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
@@ -326,6 +326,9 @@
if (options.minApiLevel < AndroidApiLevel.O.getLevel()) {
initializeAndroidOMethodProviders(factory);
}
+ if (options.minApiLevel < AndroidApiLevel.R.getLevel()) {
+ initializeAndroidRMethodProviders(factory);
+ }
// The following providers are currently not implemented at any API level in Android.
// They however require the Optional/Stream class to be present, either through desugared
@@ -1002,68 +1005,11 @@
method, BackportedMethods::StringMethods_joinIterable, "joinIterable"));
}
- private void initializeJava9MethodProviders(DexItemFactory factory) {
- // Math & StrictMath, which have some symmetric, binary-compatible APIs
- DexType[] mathTypes = {factory.mathType, factory.strictMathType};
- for (int i = 0; i < mathTypes.length; i++) {
- DexType type = mathTypes[i];
-
- // long {Math,StrictMath}.multiplyExact(long, int)
- DexString name = factory.createString("multiplyExact");
- DexProto proto = factory.createProto(factory.longType, factory.longType, factory.intType);
- DexMethod method = factory.createMethod(type, proto, name);
- addProvider(
- new MethodGenerator(
- method,
- BackportedMethods::MathMethods_multiplyExactLongInt,
- "multiplyExactLongInt"));
-
- // long {Math,StrictMath}.multiplyFull(int, int)
- name = factory.createString("multiplyFull");
- proto = factory.createProto(factory.longType, factory.intType, factory.intType);
- method = factory.createMethod(type, proto, name);
- addProvider(new MethodGenerator(method, BackportedMethods::MathMethods_multiplyFull));
-
- // long {Math,StrictMath}.multiplyHigh(long, long)
- name = factory.createString("multiplyHigh");
- proto = factory.createProto(factory.longType, factory.longType, factory.longType);
- method = factory.createMethod(type, proto, name);
- addProvider(new MethodGenerator(method, BackportedMethods::MathMethods_multiplyHigh));
-
- // long {Math,StrictMath}.floorDiv(long, int)
- name = factory.createString("floorDiv");
- proto = factory.createProto(factory.longType, factory.longType, factory.intType);
- method = factory.createMethod(type, proto, name);
- addProvider(
- new MethodGenerator(
- method, BackportedMethods::MathMethods_floorDivLongInt, "floorDivLongInt"));
-
- // int {Math,StrictMath}.floorMod(long, int)
- name = factory.createString("floorMod");
- proto = factory.createProto(factory.intType, factory.longType, factory.intType);
- method = factory.createMethod(type, proto, name);
- addProvider(
- new MethodGenerator(
- method, BackportedMethods::MathMethods_floorModLongInt, "floorModLongInt"));
- }
-
- // Byte
- DexType type = factory.boxedByteType;
-
- // int Byte.compareUnsigned(byte, byte)
- DexString name = factory.createString("compareUnsigned");
- DexProto proto = factory.createProto(factory.intType, factory.byteType, factory.byteType);
- DexMethod method = factory.createMethod(type, proto, name);
- addProvider(new MethodGenerator(method, BackportedMethods::ByteMethods_compareUnsigned));
-
- // Short
- type = factory.boxedShortType;
-
- // int Short.compareUnsigned(short, short)
- name = factory.createString("compareUnsigned");
- proto = factory.createProto(factory.intType, factory.shortType, factory.shortType);
- method = factory.createMethod(type, proto, name);
- addProvider(new MethodGenerator(method, BackportedMethods::ShortMethods_compareUnsigned));
+ private void initializeAndroidRMethodProviders(DexItemFactory factory) {
+ DexType type;
+ DexString name;
+ DexProto proto;
+ DexMethod method;
// Objects
type = factory.objectsType;
@@ -1172,6 +1118,70 @@
addProvider(new MethodGenerator(method, BackportedMethods::CollectionMethods_mapEntry));
}
+ private void initializeJava9MethodProviders(DexItemFactory factory) {
+ // Math & StrictMath, which have some symmetric, binary-compatible APIs
+ DexType[] mathTypes = {factory.mathType, factory.strictMathType};
+ for (int i = 0; i < mathTypes.length; i++) {
+ DexType type = mathTypes[i];
+
+ // long {Math,StrictMath}.multiplyExact(long, int)
+ DexString name = factory.createString("multiplyExact");
+ DexProto proto = factory.createProto(factory.longType, factory.longType, factory.intType);
+ DexMethod method = factory.createMethod(type, proto, name);
+ addProvider(
+ new MethodGenerator(
+ method,
+ BackportedMethods::MathMethods_multiplyExactLongInt,
+ "multiplyExactLongInt"));
+
+ // long {Math,StrictMath}.multiplyFull(int, int)
+ name = factory.createString("multiplyFull");
+ proto = factory.createProto(factory.longType, factory.intType, factory.intType);
+ method = factory.createMethod(type, proto, name);
+ addProvider(new MethodGenerator(method, BackportedMethods::MathMethods_multiplyFull));
+
+ // long {Math,StrictMath}.multiplyHigh(long, long)
+ name = factory.createString("multiplyHigh");
+ proto = factory.createProto(factory.longType, factory.longType, factory.longType);
+ method = factory.createMethod(type, proto, name);
+ addProvider(new MethodGenerator(method, BackportedMethods::MathMethods_multiplyHigh));
+
+ // long {Math,StrictMath}.floorDiv(long, int)
+ name = factory.createString("floorDiv");
+ proto = factory.createProto(factory.longType, factory.longType, factory.intType);
+ method = factory.createMethod(type, proto, name);
+ addProvider(
+ new MethodGenerator(
+ method, BackportedMethods::MathMethods_floorDivLongInt, "floorDivLongInt"));
+
+ // int {Math,StrictMath}.floorMod(long, int)
+ name = factory.createString("floorMod");
+ proto = factory.createProto(factory.intType, factory.longType, factory.intType);
+ method = factory.createMethod(type, proto, name);
+ addProvider(
+ new MethodGenerator(
+ method, BackportedMethods::MathMethods_floorModLongInt, "floorModLongInt"));
+ }
+
+ // Byte
+ DexType type = factory.boxedByteType;
+
+ // int Byte.compareUnsigned(byte, byte)
+ DexString name = factory.createString("compareUnsigned");
+ DexProto proto = factory.createProto(factory.intType, factory.byteType, factory.byteType);
+ DexMethod method = factory.createMethod(type, proto, name);
+ addProvider(new MethodGenerator(method, BackportedMethods::ByteMethods_compareUnsigned));
+
+ // Short
+ type = factory.boxedShortType;
+
+ // int Short.compareUnsigned(short, short)
+ name = factory.createString("compareUnsigned");
+ proto = factory.createProto(factory.intType, factory.shortType, factory.shortType);
+ method = factory.createMethod(type, proto, name);
+ addProvider(new MethodGenerator(method, BackportedMethods::ShortMethods_compareUnsigned));
+ }
+
private void initializeJava10MethodProviders(DexItemFactory factory) {
// List
DexType type = factory.listType;
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/AbstractBackportTest.java b/src/test/java/com/android/tools/r8/desugar/backports/AbstractBackportTest.java
index 523a018..646dbf9 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/AbstractBackportTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/AbstractBackportTest.java
@@ -28,7 +28,7 @@
import org.junit.Test;
abstract class AbstractBackportTest extends TestBase {
- private final TestParameters parameters;
+ protected final TestParameters parameters;
private final Class<?> targetClass;
private final Class<?> testClass;
private final Path testJar;
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/ListBackportJava9Test.java b/src/test/java/com/android/tools/r8/desugar/backports/ListBackportJava9Test.java
index 03843cc0..0d55065 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/ListBackportJava9Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/ListBackportJava9Test.java
@@ -5,13 +5,16 @@
package com.android.tools.r8.desugar.backports;
import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
+import static org.hamcrest.CoreMatchers.containsString;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestRuntime.CfVm;
import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.utils.AndroidApiLevel;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
+import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@@ -29,9 +32,10 @@
private static final Path TEST_JAR =
Paths.get(ToolHelper.EXAMPLES_JAVA9_BUILD_DIR).resolve("backport" + JAR_EXTENSION);
+ private static final String TEST_CLASS = "backport.ListBackportJava9Main";
public ListBackportJava9Test(TestParameters parameters) {
- super(parameters, List.class, TEST_JAR, "backport.ListBackportJava9Main");
+ super(parameters, List.class, TEST_JAR, TEST_CLASS);
// Note: None of the methods in this test exist in the latest android.jar. If/when they ship in
// an actual API level, migrate these tests to ListBackportTest.
@@ -41,4 +45,20 @@
ignoreInvokes("set");
ignoreInvokes("size");
}
+
+ @Test
+ public void desugaringApiLevelR() throws Exception {
+ // TODO(154759404): This test should start to fail when testing on an Android R VM.
+ if (parameters.getRuntime().isDex()
+ && parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.Q)) {
+ testForD8()
+ .setMinApi(AndroidApiLevel.R)
+ .addProgramClasses(MiniAssert.class, IgnoreInvokes.class)
+ .addProgramFiles(TEST_JAR)
+ .setIncludeClassesChecksum(true)
+ .compile()
+ .run(parameters.getRuntime(), TEST_CLASS)
+ .assertFailureWithErrorThatMatches(containsString("java.lang.NoSuchMethodError"));
+ }
+ }
}
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/MapBackportJava9Test.java b/src/test/java/com/android/tools/r8/desugar/backports/MapBackportJava9Test.java
index fb39b49..27cb824 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/MapBackportJava9Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/MapBackportJava9Test.java
@@ -4,18 +4,21 @@
package com.android.tools.r8.desugar.backports;
+import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
+import static org.hamcrest.CoreMatchers.containsString;
+
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestRuntime.CfVm;
import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.utils.AndroidApiLevel;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Map;
+import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
-import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
-
@RunWith(Parameterized.class)
public class MapBackportJava9Test extends AbstractBackportTest {
@Parameters(name = "{0}")
@@ -29,9 +32,10 @@
private static final Path TEST_JAR =
Paths.get(ToolHelper.EXAMPLES_JAVA9_BUILD_DIR).resolve("backport" + JAR_EXTENSION);
+ private static final String TEST_CLASS = "backport.MapBackportJava9Main";
public MapBackportJava9Test(TestParameters parameters) {
- super(parameters, Map.class, TEST_JAR, "backport.MapBackportJava9Main");
+ super(parameters, Map.class, TEST_JAR, TEST_CLASS);
// Note: None of the methods in this test exist in the latest android.jar. If/when they ship in
// an actual API level, migrate these tests to MapBackportTest.
@@ -41,4 +45,20 @@
ignoreInvokes("put");
ignoreInvokes("size");
}
+
+ @Test
+ public void desugaringApiLevelR() throws Exception {
+ // TODO(154759404): This test should start to fail when testing on an Android R VM.
+ if (parameters.getRuntime().isDex()
+ && parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.Q)) {
+ testForD8()
+ .setMinApi(AndroidApiLevel.R)
+ .addProgramClasses(MiniAssert.class, IgnoreInvokes.class)
+ .addProgramFiles(TEST_JAR)
+ .setIncludeClassesChecksum(true)
+ .compile()
+ .run(parameters.getRuntime(), TEST_CLASS)
+ .assertFailureWithErrorThatMatches(containsString("java.lang.NoSuchMethodError"));
+ }
+ }
}
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/ObjectsBackportJava9Test.java b/src/test/java/com/android/tools/r8/desugar/backports/ObjectsBackportJava9Test.java
index ef8b990..09aef1e 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/ObjectsBackportJava9Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/ObjectsBackportJava9Test.java
@@ -4,17 +4,20 @@
package com.android.tools.r8.desugar.backports;
+import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
+import static org.hamcrest.CoreMatchers.containsString;
+
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestRuntime.CfVm;
import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.utils.AndroidApiLevel;
import java.nio.file.Path;
import java.nio.file.Paths;
+import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
-import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
-
@RunWith(Parameterized.class)
public final class ObjectsBackportJava9Test extends AbstractBackportTest {
@Parameters(name = "{0}")
@@ -28,10 +31,27 @@
private static final Path TEST_JAR =
Paths.get(ToolHelper.EXAMPLES_JAVA9_BUILD_DIR).resolve("backport" + JAR_EXTENSION);
+ private static final String TEST_CLASS = "backport.ObjectsBackportJava9Main";
public ObjectsBackportJava9Test(TestParameters parameters) {
- super(parameters, Short.class, TEST_JAR, "backport.ObjectsBackportJava9Main");
+ super(parameters, Short.class, TEST_JAR, TEST_CLASS);
// Note: None of the methods in this test exist in the latest android.jar. If/when they ship in
// an actual API level, migrate these tests to ObjectsBackportTest.
}
+
+ @Test
+ public void desugaringApiLevelR() throws Exception {
+ // TODO(154759404): This test should start to fail when testing on an Android R VM.
+ if (parameters.getRuntime().isDex()
+ && parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.Q)) {
+ testForD8()
+ .setMinApi(AndroidApiLevel.R)
+ .addProgramClasses(MiniAssert.class, IgnoreInvokes.class)
+ .addProgramFiles(TEST_JAR)
+ .setIncludeClassesChecksum(true)
+ .compile()
+ .run(parameters.getRuntime(), TEST_CLASS)
+ .assertFailureWithErrorThatMatches(containsString("java.lang.NoSuchMethodError"));
+ }
+ }
}
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/SetBackportJava9Test.java b/src/test/java/com/android/tools/r8/desugar/backports/SetBackportJava9Test.java
index 6947ff2..408b203 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/SetBackportJava9Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/SetBackportJava9Test.java
@@ -4,18 +4,21 @@
package com.android.tools.r8.desugar.backports;
+import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
+import static org.hamcrest.CoreMatchers.containsString;
+
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestRuntime.CfVm;
import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.utils.AndroidApiLevel;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Set;
+import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
-import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
-
@RunWith(Parameterized.class)
public class SetBackportJava9Test extends AbstractBackportTest {
@Parameters(name = "{0}")
@@ -29,9 +32,10 @@
private static final Path TEST_JAR =
Paths.get(ToolHelper.EXAMPLES_JAVA9_BUILD_DIR).resolve("backport" + JAR_EXTENSION);
+ private static final String TEST_CLASS = "backport.SetBackportJava9Main";
public SetBackportJava9Test(TestParameters parameters) {
- super(parameters, Set.class, TEST_JAR, "backport.SetBackportJava9Main");
+ super(parameters, Set.class, TEST_JAR, TEST_CLASS);
// Note: None of the methods in this test exist in the latest android.jar. If/when they ship in
// an actual API level, migrate these tests to SetBackportTest.
@@ -40,4 +44,20 @@
ignoreInvokes("contains");
ignoreInvokes("size");
}
+
+ @Test
+ public void desugaringApiLevelR() throws Exception {
+ // TODO(154759404): This test should start to fail when testing on an Android R VM.
+ if (parameters.getRuntime().isDex()
+ && parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.Q)) {
+ testForD8()
+ .setMinApi(AndroidApiLevel.R)
+ .addProgramClasses(MiniAssert.class, IgnoreInvokes.class)
+ .addProgramFiles(TEST_JAR)
+ .setIncludeClassesChecksum(true)
+ .compile()
+ .run(parameters.getRuntime(), TEST_CLASS)
+ .assertFailureWithErrorThatMatches(containsString("java.lang.NoSuchMethodError"));
+ }
+ }
}
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/TestBackportedNotPresentInAndroidJar.java b/src/test/java/com/android/tools/r8/desugar/backports/TestBackportedNotPresentInAndroidJar.java
index e6fdf99..8096c47 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/TestBackportedNotPresentInAndroidJar.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/TestBackportedNotPresentInAndroidJar.java
@@ -35,9 +35,6 @@
System.out.println("Skipping check for " + apiLevel);
continue;
}
- if (apiLevel == AndroidApiLevel.R) {
- continue;
- }
// Check that the backported methods for each API level are are not present in the
// android.jar for that level.
CodeInspector inspector = new CodeInspector(ToolHelper.getAndroidJar(apiLevel));