Rewrite Objects.requireNonNull with one argument to getClass
When library desugaring is used with java.util.Objects enabled this
will cause Objects.requireNonNull with one argument to still be
backported and not use j$.util.Objects.requireNonNull. The backporting
will rewrite to getClass.
For java.util.Objects.requireNonNull with more arguments nothing is
changed and they will still use j$.util.Objects.requireNonNull if
java.util.Objects is enabled for library desugaring.
Bug: 175693719
Change-Id: Iea3c1a895460f894abe5523265189ddb41a21630
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 d6adc3c..40b18c9 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
@@ -1312,15 +1312,20 @@
// TODO(b/174453232): Remove this after the configuration file format has bee updated
// with the "rewrite_method" section.
if (generator.method.getHolderType() == appView.dexItemFactory().objectsType) {
- // Still backport the new API level 30 methods.
+ // Still backport the new API level 30 methods and Objects.requireNonNull taking
+ // one argument.
String methodName = generator.method.getName().toString();
- if (!methodName.equals("requireNonNullElse")
+ if (!methodName.equals("requireNonNull")
+ && !methodName.equals("requireNonNullElse")
&& !methodName.equals("requireNonNullElseGet")
&& !methodName.equals("checkIndex")
&& !methodName.equals("checkFromToIndex")
&& !methodName.equals("checkFromIndexSize")) {
return;
}
+ if (methodName.equals("requireNonNull") && generator.method.getArity() != 1) {
+ return;
+ }
}
}
MethodProvider replaced = rewritable.put(generator.method, generator);
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ObjectsTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ObjectsTest.java
index a9590a3..8031f43 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ObjectsTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ObjectsTest.java
@@ -115,6 +115,10 @@
return invokesMethod("int", holder, "hashCode", ImmutableList.of("java.lang.Object"));
}
+ private Matcher<MethodSubject> invokesClassGetClass() {
+ return invokesMethod("java.lang.Class", "java.lang.Object", "getClass", ImmutableList.of());
+ }
+
private Matcher<MethodSubject> invokesObjectsRequireNonNull(String holder) {
return invokesMethod(
"java.lang.Object", holder, "requireNonNull", ImmutableList.of("java.lang.Object"));
@@ -218,7 +222,7 @@
onlyIf(invokeJavaUtilObjects, invokesObjectsRequireNonNull("java.util.Objects")));
assertThat(
testClass.uniqueMethodWithName("objectsRequireNonNull"),
- onlyIf(invokeJDollarUtilObjects, invokesObjectsRequireNonNull("j$.util.Objects")));
+ onlyIf(parameters.getApiLevel().isLessThan(AndroidApiLevel.K), invokesClassGetClass()));
assertThat(
testClass.uniqueMethodWithName("objectsRequireNonNullWithMessage"),
@@ -525,7 +529,7 @@
objectsEquals(args, args);
objectsHash(1, 2);
objectsHashCode(4);
- objectsRequireNonNull(null);
+ objectsRequireNonNull(System.currentTimeMillis() >= 0 ? null : new Object());
objectsRequireNonNullWithMessage(null, "Was null");
if (objectsRequireNonNullWithSupplierSupported) {
objectsRequireNonNullWithSupplier(null, () -> "Supplier said was null");