Update test of invalid MethodParameters attribute from desugaring
* Add parameter annotations
Bug: 189743726
Change-Id: Ib86ce8bcbd149396945a08a3d0cc43695caacaaf
diff --git a/src/main/java/com/android/tools/r8/utils/SupplierUtils.java b/src/main/java/com/android/tools/r8/utils/SupplierUtils.java
index 13a02cb..84dac5f 100644
--- a/src/main/java/com/android/tools/r8/utils/SupplierUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/SupplierUtils.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.utils;
+import com.google.common.base.Suppliers;
import java.util.function.Supplier;
public class SupplierUtils {
@@ -12,4 +13,15 @@
Box<T> box = new Box<>();
return () -> box.computeIfAbsent(supplier);
}
+
+ public static <T, E extends Throwable> Supplier<T> memoize(ThrowingSupplier<T, E> supplier) {
+ return Suppliers.memoize(
+ () -> {
+ try {
+ return supplier.get();
+ } catch (Throwable e) {
+ throw new RuntimeException(e);
+ }
+ });
+ }
}
diff --git a/src/test/java/com/android/tools/r8/desugaring/interfacemethods/MethodParametersTest.java b/src/test/java/com/android/tools/r8/desugaring/interfacemethods/MethodParametersTest.java
index 7d70d21..27dcc8c 100644
--- a/src/test/java/com/android/tools/r8/desugaring/interfacemethods/MethodParametersTest.java
+++ b/src/test/java/com/android/tools/r8/desugaring/interfacemethods/MethodParametersTest.java
@@ -16,7 +16,10 @@
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.DexVm.Version;
import com.android.tools.r8.desugaring.interfacemethods.methodparameters.I;
+import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.SupplierUtils;
import java.nio.file.Path;
+import java.util.function.Supplier;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -25,6 +28,7 @@
public class MethodParametersTest extends TestBase {
private final TestParameters parameters;
+ private final Supplier<Path> compiledWithParameters;
@Parameterized.Parameters(name = "{0}")
public static TestParametersCollection data() {
@@ -38,16 +42,30 @@
public MethodParametersTest(TestParameters parameters) {
this.parameters = parameters;
+ compiledWithParameters =
+ SupplierUtils.memoize(
+ () ->
+ javac(
+ parameters.isCfRuntime()
+ ? getCheckedInJdk(parameters.getRuntime().asCf().getVm())
+ : getCheckedInJdk11())
+ .addSourceFiles(ToolHelper.getSourceFileForTestClass(I.class))
+ .addOptions("-parameters")
+ .compile());
}
+ private final String EXPECTED =
+ StringUtils.lines(
+ "0", "1", "a: 1", "2", "a: 1", "b: 2", "0", "1", "a: 1", "2", "a: 1", "b: 2");
+
@Test
public void testJvm() throws Exception {
assumeTrue(parameters.isCfRuntime());
testForJvm()
- .addProgramClassesAndInnerClasses(I.class)
+ .addProgramFiles(compiledWithParameters.get())
.addInnerClasses(getClass())
.run(parameters.getRuntime(), TestRunner.class)
- .assertSuccessWithOutputLines("0", "1", "2", "0", "1", "2");
+ .assertSuccessWithOutput(EXPECTED);
}
@Test
@@ -56,18 +74,9 @@
assumeTrue(
parameters.isDexRuntime()
|| getCheckedInJdk(parameters.getRuntime().asCf().getVm()) != null);
- Path compiledWithParameters =
- javac(
- parameters.isCfRuntime()
- ? getCheckedInJdk(parameters.getRuntime().asCf().getVm())
- : getCheckedInJdk11())
- .addSourceFiles(ToolHelper.getSourceFileForTestClass(I.class))
- .addOptions("-parameters")
- .compile();
-
Path interfaceDesugared =
testForD8(Backend.CF)
- .addProgramFiles(compiledWithParameters)
+ .addProgramFiles(compiledWithParameters.get())
.setMinApi(parameters.getApiLevel())
.compile()
.writeToZip();
@@ -117,7 +126,7 @@
.run(parameters.getRuntime(), TestRunner.class)
.applyIf(
parameters.canUseDefaultAndStaticInterfaceMethodsWhenDesugaring(),
- r -> r.assertSuccessWithOutputLines("0", "1", "2", "0", "1", "2"),
+ r -> r.assertSuccessWithOutput(EXPECTED),
// TODO(b/189743726): Should not fail at runtime (but will have different parameter
// count for non-static methods when desugared).
r ->
diff --git a/src/test/java/com/android/tools/r8/desugaring/interfacemethods/methodparameters/I.java b/src/test/java/com/android/tools/r8/desugaring/interfacemethods/methodparameters/I.java
index 4c7ba69..ccf787e 100644
--- a/src/test/java/com/android/tools/r8/desugaring/interfacemethods/methodparameters/I.java
+++ b/src/test/java/com/android/tools/r8/desugaring/interfacemethods/methodparameters/I.java
@@ -3,29 +3,67 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.desugaring.interfacemethods.methodparameters;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.reflect.Parameter;
+
public interface I {
default void zeroArgsDefault() {
System.out.println(new Object() {}.getClass().getEnclosingMethod().getParameters().length);
}
- default void oneArgDefault(int a) {
- System.out.println(new Object() {}.getClass().getEnclosingMethod().getParameters().length);
+ default void oneArgDefault(@RuntimeAnnotation1(n = 0) int a) {
+ Parameter[] parameters = new Object() {}.getClass().getEnclosingMethod().getParameters();
+ System.out.println(parameters.length);
+ for (Parameter parameter : parameters) {
+ System.out.println(parameter.getName() + ": " + parameter.getAnnotations().length);
+ }
}
- default void twoArgDefault(int a, int b) {
- System.out.println(new Object() {}.getClass().getEnclosingMethod().getParameters().length);
+ default void twoArgDefault(
+ @RuntimeAnnotation1(n = 1) int a,
+ @RuntimeAnnotation1(n = 2) @RuntimeAnnotation2(n = 2) int b) {
+ Parameter[] parameters = new Object() {}.getClass().getEnclosingMethod().getParameters();
+ System.out.println(parameters.length);
+ for (Parameter parameter : parameters) {
+ System.out.println(parameter.getName() + ": " + parameter.getAnnotations().length);
+ }
}
static void zeroArgStatic() {
- System.out.println(new Object() {}.getClass().getEnclosingMethod().getParameters().length);
+ Parameter[] parameters = new Object() {}.getClass().getEnclosingMethod().getParameters();
+ System.out.println(parameters.length);
+ for (Parameter parameter : parameters) {
+ System.out.println(parameter.getName() + ": " + parameter.getAnnotations().length);
+ }
}
- static void oneArgStatic(int a) {
- System.out.println(new Object() {}.getClass().getEnclosingMethod().getParameters().length);
+ static void oneArgStatic(@RuntimeAnnotation1(n = 0) int a) {
+ Parameter[] parameters = new Object() {}.getClass().getEnclosingMethod().getParameters();
+ System.out.println(parameters.length);
+ for (Parameter parameter : parameters) {
+ System.out.println(parameter.getName() + ": " + parameter.getAnnotations().length);
+ }
}
- static void twoArgsStatic(int a, int b) {
- System.out.println(new Object() {}.getClass().getEnclosingMethod().getParameters().length);
+ static void twoArgsStatic(
+ @RuntimeAnnotation1(n = 1) int a,
+ @RuntimeAnnotation1(n = 2) @RuntimeAnnotation2(n = 2) int b) {
+ Parameter[] parameters = new Object() {}.getClass().getEnclosingMethod().getParameters();
+ System.out.println(parameters.length);
+ for (Parameter parameter : parameters) {
+ System.out.println(parameter.getName() + ": " + parameter.getAnnotations().length);
+ }
+ }
+
+ @Retention(RetentionPolicy.RUNTIME)
+ @interface RuntimeAnnotation1 {
+ int n();
+ }
+
+ @Retention(RetentionPolicy.RUNTIME)
+ @interface RuntimeAnnotation2 {
+ int n();
}
}